diff --git a/crm/collect_crm.info.yml b/crm/collect_crm.info.yml
index 74c257a..495762b 100644
--- a/crm/collect_crm.info.yml
+++ b/crm/collect_crm.info.yml
@@ -8,6 +8,6 @@ core: 8.x
 dependencies:
   - crm_core_contact
   - crm_core_activity
-  - crm_core_default_matching_engine
+  - crm_core_match
   - collect
   - entity_reference
diff --git a/crm/config/optional/crm_core_default_matching_engine.rule.inmail_individual.yml b/crm/config/optional/crm_core_default_matching_engine.rule.inmail_individual.yml
deleted file mode 100644
index 3d17d0b..0000000
--- a/crm/config/optional/crm_core_default_matching_engine.rule.inmail_individual.yml
+++ /dev/null
@@ -1,93 +0,0 @@
-langcode: en
-status: true
-dependencies: {  }
-label: null
-type: inmail_individual
-threshold: 0
-return_order: created
-strict: false
-rules:
-  contact_id:
-    value:
-      weight: 0
-      status: false
-      operator: ''
-      options: ''
-      score: 0
-  uuid:
-    value:
-      weight: 0
-      status: false
-      operator: ''
-      options: ''
-      score: 0
-  vid:
-    value:
-      weight: 0
-      status: false
-      operator: ''
-      options: ''
-      score: 0
-  type:
-    value:
-      weight: 0
-      status: false
-      operator: ''
-      options: ''
-      score: 0
-  created:
-    value:
-      weight: 0
-      status: false
-      operator: ''
-      options: ''
-      score: 0
-  changed:
-    value:
-      weight: 0
-      status: false
-      operator: ''
-      options: ''
-      score: 0
-  uid:
-    value:
-      weight: 0
-      status: false
-      operator: ''
-      options: ''
-      score: 0
-  name:
-    value:
-      status: true
-      operator: CONTAINS
-      options: ''
-      score: 0
-      weight: 0
-  revision_log:
-    value:
-      weight: 0
-      status: false
-      operator: ''
-      options: ''
-      score: 0
-  contact_mail:
-    value:
-      status: true
-      operator: '='
-      options: ''
-      score: 0
-      weight: 0
-  contact_remote_id:
-    value:
-      operator: ''
-      options: ''
-      score: 0
-      weight: 0
-      status: false
-  user_uri:
-    value:
-      weight: 0
-      status: false
-      operator: ''
-      options: ''
-      score: 0
diff --git a/crm/config/optional/crm_core_match.matcher.inmail_individual.yml b/crm/config/optional/crm_core_match.matcher.inmail_individual.yml
new file mode 100644
index 0000000..b96723a
--- /dev/null
+++ b/crm/config/optional/crm_core_match.matcher.inmail_individual.yml
@@ -0,0 +1,99 @@
+langcode: en
+status: true
+dependencies: {  }
+id: inmail_individual
+label: Inmail Individual
+description: Inmail Individual Matcher
+plugin_id: default
+configuration:
+  threshold: 0
+  return_order: created
+  strict: false
+  field_matching: ''
+  rules:
+    contact_id:
+      value:
+        weight: 0
+        status: false
+        operator: ''
+        options: ''
+        score: 0
+    uuid:
+      value:
+        weight: 0
+        status: false
+        operator: ''
+        options: ''
+        score: 0
+    vid:
+      value:
+        weight: 0
+        status: false
+        operator: ''
+        options: ''
+        score: 0
+    type:
+      value:
+        weight: 0
+        status: false
+        operator: ''
+        options: ''
+        score: 0
+    created:
+      value:
+        weight: 0
+        status: false
+        operator: ''
+        options: ''
+        score: 0
+    changed:
+      value:
+        weight: 0
+        status: false
+        operator: ''
+        options: ''
+        score: 0
+    uid:
+        score: 0
+    uid:
+      value:
+        weight: 0
+        status: false
+        operator: ''
+        options: ''
+        score: 0
+    name:
+      value:
+        status: true
+        operator: CONTAINS
+        options: ''
+        score: 0
+        weight: 0
+    revision_log:
+      value:
+        weight: 0
+        status: false
+        operator: ''
+        options: ''
+        score: 0
+    contact_mail:
+      value:
+        status: true
+        operator: '='
+        options: ''
+        score: 0
+        weight: 0
+    contact_remote_id:
+      value:
+        operator: '='
+        options: ''
+        score: 0
+        weight: 0
+        status: false
+    user_uri:
+      value:
+        weight: 0
+        status: false
+        operator: ''
+        options: ''
+        score: 0
diff --git a/crm/config/schema/collect_crm.schema.yml b/crm/config/schema/collect_crm.schema.yml
index 2a1d480..84d9479 100644
--- a/crm/config/schema/collect_crm.schema.yml
+++ b/crm/config/schema/collect_crm.schema.yml
@@ -8,6 +8,9 @@ collect.processor.contact_matcher:
     contact_type:
       type: string
       label: Contact type to match or create
+    matcher:
+      type: string
+      label: Matcher which will be used
     fields:
       type: sequence
       label: Mapping from contact fields to model properties
diff --git a/crm/src/Plugin/collect/Processor/ContactMatcher.php b/crm/src/Plugin/collect/Processor/ContactMatcher.php
index 8eb096e..2862852 100644
--- a/crm/src/Plugin/collect/Processor/ContactMatcher.php
+++ b/crm/src/Plugin/collect/Processor/ContactMatcher.php
@@ -16,7 +16,6 @@ use Drupal\Core\Entity\EntityManagerInterface;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\TypedData\ListInterface;
 use Drupal\crm_core_contact\ContactInterface;
-use Drupal\crm_core_match\MatcherInterface;
 use Psr\Log\LoggerInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
@@ -39,19 +38,11 @@ class ContactMatcher extends ProcessorBase {
   protected $entityManager;
 
   /**
-   * The injected contact matcher.
-   *
-   * @var \Drupal\crm_core_match\MatcherInterface
-   */
-  protected $contactMatcher;
-
-  /**
    * Constructs a ContactMatcher processor plugin.
    */
-  public function __construct(array $configuration, $plugin_id, $plugin_definition, LoggerInterface $logger, TypedDataProvider $typed_data_provider, EntityManagerInterface $entity_manager, MatcherInterface $contact_matcher) {
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, LoggerInterface $logger, TypedDataProvider $typed_data_provider, EntityManagerInterface $entity_manager) {
     parent::__construct($configuration, $plugin_id, $plugin_definition, $logger, $typed_data_provider);
     $this->entityManager = $entity_manager;
-    $this->contactMatcher = $contact_matcher;
   }
 
   /**
@@ -64,8 +55,7 @@ class ContactMatcher extends ProcessorBase {
       $plugin_definition,
       $container->get('logger.factory')->get('collect'),
       $container->get('collect.typed_data_provider'),
-      $container->get('entity.manager'),
-      $container->get('crm_core_match.matcher')
+      $container->get('entity.manager')
     );
   }
 
@@ -175,12 +165,8 @@ class ContactMatcher extends ProcessorBase {
     }
 
     // Use the CRM Core contact matcher.
-    $matcher = $this->contactMatcher;
-    if ($this->isCustomEngineInstalled()) {
-      // Only trigger inmail engine for matching.
-      // @todo Remove this hardcoded engine selection when crm_core matcher plugins have better configurability.
-      $matcher = $matcher->getEngines()['inmail'];
-    }
+    /** @var \Drupal\crm_core_match\Matcher\MatcherConfigInterface $matcher */
+    $matcher = $this->entityManager->getStorage('crm_core_match')->load($this->getConfigurationItem('matcher'));
     if ($matches = $matcher->match($template_contact)) {
       return $this->entityManager->getStorage('crm_core_contact')
         ->load(reset($matches));
@@ -244,7 +230,9 @@ class ContactMatcher extends ProcessorBase {
       '#size' => 20,
     );
 
-    // Contact type & matching rule selector.
+    // Contact type & matcher selector.
+    // @todo: Remove the contact type menu when fields per bundle selection in
+    //   matcher configuration is implemented.
     $contact_type_options = array();
     foreach ($this->entityManager->getStorage('crm_core_contact_type')->loadMultiple() as $contact_type_id => $contact_type) {
       $contact_type_options[$contact_type_id] = $contact_type->label();
@@ -260,16 +248,29 @@ class ContactMatcher extends ProcessorBase {
       '#access' => $contact_type_options,
     );
 
-    if ($contact_type = $this->getConfigurationItem('contact_type')) {
-      // Matching rules IDs correspond to contact types, unless the custom
-      // engine is active.
-      $matching_rule_id = $this->isCustomEngineInstalled() ? 'inmail_individual' : $contact_type;
-      /** @var \Drupal\crm_core_default_matching_engine\Entity\MatchingRule $matching_rule */
-      $matching_rule = $this->entityManager->getStorage('crm_core_default_engine_rule')->load($matching_rule_id);
+    $matchers = array();
+    // Get the list of available matchers.
+    foreach ($this->entityManager->getStorage('crm_core_match')->loadMultiple() as $matcher_id => $matcher) {
+      $matchers[$matcher_id] = $matcher->label();
+    }
+    // @todo Ajaxify matcher selector.
+    $form['matcher'] = array(
+      '#type' => 'select',
+      '#title' => $this->t('Matcher'),
+      '#description' => $this->t('Select the matcher which will be used.'),
+      '#options' => $matchers,
+      '#default_value' => $this->getConfigurationItem('matcher'),
+      '#required' => TRUE,
+      '#access' => (bool) $matchers,
+    );
+
+    if ($matcher_id = $this->getConfigurationItem('matcher')) {
+      /** @var \Drupal\crm_core_match\Matcher\MatcherConfigInterface $matcher */
+      $matcher = $this->entityManager->getStorage('crm_core_match')->load($matcher_id);
 
       $form['fields'] = array(
         '#type' => 'table',
-        '#caption' => $this->t('For each enabled field in the matching rule, you can select a model-provided property to match by.'),
+        '#caption' => $this->t('For each enabled field in the matcher, you can select a model-provided property to match by.'),
         '#header' => array(
           'contact_field' => $this->t('Contact field'),
           'model_property' => $this->t('Model property'),
@@ -277,19 +278,22 @@ class ContactMatcher extends ProcessorBase {
         '#empty' => $this->t('There are no fields enabled yet.'),
       );
 
-      // Add link to rule configuration, unless the custom engine is active.
-      if (!$this->isCustomEngineInstalled()) {
-        $form['fields']['#caption'] = $this->t('For each enabled field in the <a href="@rule_url">matching rule</a>, you can select a model-provided property to match by.', ['@rule_url' => $matching_rule->url()]);
-      }
+      // Add link to matcher configuration.
+      $form['fields']['#caption'] = $this->t('For each enabled field in the <a href="@matcher">matcher</a>, you can select a model-provided property to match by.', ['@matcher' => $matcher->url()]);
 
-      // Add a table row for each field in the matching rule.
-      foreach ($matching_rule->rules as $field_name => $field_settings) {
-        // Skip fields that are disabled on the matching rule.
+      // Add a table row for each field in the matcher.
+      // foreach ($matcher->getSetting('rules') as $field_name => $field_settings) {
+      foreach ($matcher->getPlugin()->getConfigurationItem('rules') as $field_name => $field_settings) {
+        // Skip fields that are disabled on the matcher.
         if (empty($field_settings['value']['status'])) {
           continue;
         }
 
-        $field_definitions = $this->entityManager->getFieldDefinitions('crm_core_contact', $contact_type);
+        $contact_types = $this->entityManager->getStorage('crm_core_match')->loadMultiple();
+        $field_definitions = [];
+        foreach ($contact_types as $contact_type_id => $value) {
+          $field_definitions += $this->entityManager->getFieldDefinitions('crm_core_contact', $contact_type_id);
+        }
         // Skip fields that got dropped.
         if (!isset($field_definitions[$field_name])) {
           continue;
@@ -341,18 +345,9 @@ class ContactMatcher extends ProcessorBase {
     $this->setConfiguration([
       'relation' => $form_state->getValue('relation'),
       'contact_type' => $form_state->getValue('contact_type'),
+      'matcher' => $form_state->getValue('matcher'),
       'fields' => $fields,
     ]);
   }
 
-  /**
-   * Tells whether the custom "Inmail" engine is installed.
-   *
-   * @return bool
-   *   TRUE if the engine is installed, otherwise FALSE.
-   */
-  protected function isCustomEngineInstalled() {
-    return (bool) $this->entityManager->getStorage('crm_core_default_engine_rule')->load('inmail_individual');
-  }
-
 }
diff --git a/crm/src/Plugin/crm_core_match/engine/InmailMatchingEngine.php b/crm/src/Plugin/crm_core_match/engine/InmailMatchingEngine.php
deleted file mode 100644
index 59e1a9d..0000000
--- a/crm/src/Plugin/crm_core_match/engine/InmailMatchingEngine.php
+++ /dev/null
@@ -1,74 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\collect\Plugin\crm_core_match\engine\DefaultMatchingEngine.
- */
-
-namespace Drupal\collect_crm\Plugin\crm_core_match\engine;
-
-use Drupal\crm_core_contact\Entity\Contact;
-use Drupal\crm_core_contact\ContactInterface;
-use Drupal\crm_core_default_matching_engine\Plugin\crm_core_match\engine\DefaultMatchingEngine;
-
-/**
- * DefaultMatchingEngine class
- *
- * Clone of Default Matching Engine.
- *
- * @todo replace this engine once plugin instances are possible.
- *
- * @CrmCoreMatchEngine(
- *   id = "inmail",
- *   title = @Translation("Inmail Matching Engine"),
- *   description = @Translation("Clone of Default Matching Engine to process incoming mail."),
- *   priority = 0,
- *   settings = {
- *     "settings" = {
- *       "route" = "crm_core_default_matching_engine.config",
- *       "label" = @Translation("Configuration")
- *     }
- *   }
- * )
- */
-class InmailMatchingEngine extends DefaultMatchingEngine {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function match(ContactInterface $contact) {
-    // Stolen from DefaultMatchEngine with hack to load other config.
-    $ids = array();
-    /* @var \Drupal\crm_core_default_matching_engine\Entity\MatchingRule $matching_rule */
-    $matching_rule = $this->entityManager->getStorage('crm_core_default_engine_rule')->load('inmail_individual');
-    // Check if match is enabled for this contact type.
-    if ($matching_rule->status()) {
-      $fields = $contact->getFieldDefinitions();
-
-      $results = array();
-      foreach ($matching_rule->rules as $name => $rules) {
-        if (isset($fields[$name])) {
-          $rules['field'] = $fields[$name];
-
-          if (!$this->pluginManager->hasDefinition($rules['field']->getType())) {
-            continue;
-          }
-
-          /* @var \Drupal\crm_core_default_matching_engine\Plugin\crm_core_match\field\FieldHandlerInterface $field_handler */
-          $field_handler = $this->pluginManager->createInstance($rules['field']->getType(), $rules);
-
-          foreach ($field_handler->getPropertyNames() as $name) {
-            $results += $field_handler->match($contact, $name);
-          }
-        }
-      }
-      foreach ($results as $id => $rule_matches) {
-        $total_score = array_sum($rule_matches);
-        if ($total_score >= $matching_rule->threshold) {
-          $ids[] = $id;
-        }
-      }
-    }
-    return $ids;
-  }
-}
diff --git a/demo/config/optional/collect.model.article.yml b/demo/config/optional/collect.model.article.yml
index bf76291..5ab4bf1 100644
--- a/demo/config/optional/collect.model.article.yml
+++ b/demo/config/optional/collect.model.article.yml
@@ -598,6 +598,7 @@ processors:
     weight: -10
     relation: author
     contact_type: individual
+    matcher: inmail_individual
     fields: {  }
   5aee5980-710f-4ff0-9600-d06b96224456:
     plugin_id: activity_creator
diff --git a/demo/config/optional/collect.model.user.yml b/demo/config/optional/collect.model.user.yml
index 3df33df..b4d9c1c 100644
--- a/demo/config/optional/collect.model.user.yml
+++ b/demo/config/optional/collect.model.user.yml
@@ -492,6 +492,7 @@ processors:
     weight: -10
     relation: self
     contact_type: individual
+    matcher: inmail_individual
     fields:
       name: name
       contact_mail: mail
