diff --git a/config/schema/collect.schema.yml b/config/schema/collect.schema.yml
index 616ace4..b0c9c26 100644
--- a/config/schema/collect.schema.yml
+++ b/config/schema/collect.schema.yml
@@ -109,3 +109,8 @@ collect.relation_type.*:
     plugin_id:
       type: string
       label: Relation plugin ID
+
+"search_api.datasource.plugin.collect:*":
+  type: mapping
+  label: 'Collect datasource configuration'
+  mapping: { }
diff --git a/crm/config/schema/collect_crm.schema.yml b/crm/config/schema/collect_crm.schema.yml
index 2a1d480..2861b95 100644
--- a/crm/config/schema/collect_crm.schema.yml
+++ b/crm/config/schema/collect_crm.schema.yml
@@ -1,3 +1,21 @@
+collect.processor.contact_matcher_mail:
+  type: collect.processor
+  label: Contact matcher processor settings
+  mapping:
+    relation:
+      type: string
+      label: Relation name
+    contact_type:
+      type: string
+      label: Contact type to match or create
+    fields:
+      type: sequence
+      label: Mapping from contact fields to model properties
+      sequence:
+        # Contact field names are keys.
+        type: string
+        label: Model property
+
 collect.processor.contact_matcher:
   type: collect.processor
   label: Contact matcher processor settings
diff --git a/demo/collect_demo.info.yml b/demo/collect_demo.info.yml
index 11f6fab..a64d3b0 100644
--- a/demo/collect_demo.info.yml
+++ b/demo/collect_demo.info.yml
@@ -10,3 +10,9 @@ dependencies:
   - node
   - search_api_db
   - views
+  - path
+  - image
+  - text
+  - comment
+  - collect
+  - taxonomy
diff --git a/demo/config/optional/core.entity_form_display.node.article.default.yml b/demo/config/optional/core.entity_form_display.node.article.default.yml
new file mode 100644
index 0000000..64f8efc
--- /dev/null
+++ b/demo/config/optional/core.entity_form_display.node.article.default.yml
@@ -0,0 +1,85 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - field.field.node.article.body
+    - field.field.node.article.comment
+    - field.field.node.article.field_image
+    - field.field.node.article.field_tags
+    - node.type.article
+  module:
+    - comment
+    - entity_reference
+    - image
+    - path
+    - taxonomy
+    - text
+id: node.article.default
+targetEntityType: node
+bundle: article
+mode: default
+content:
+  title:
+    type: string_textfield
+    weight: 0
+    settings:
+      size: 60
+      placeholder: ''
+    third_party_settings: {  }
+  body:
+    type: text_textarea_with_summary
+    weight: 1
+    settings:
+      rows: 9
+      summary_rows: 3
+      placeholder: ''
+    third_party_settings: {  }
+  field_tags:
+    type: entity_reference_autocomplete_tags
+    weight: 3
+    settings: {  }
+    third_party_settings: {  }
+  field_image:
+    type: image_image
+    weight: 4
+    settings:
+      progress_indicator: throbber
+      preview_image_style: thumbnail
+    third_party_settings: {  }
+  uid:
+    type: entity_reference_autocomplete
+    weight: 5
+    settings:
+      match_operator: CONTAINS
+      size: 60
+      placeholder: ''
+    third_party_settings: {  }
+  created:
+    type: datetime_timestamp
+    weight: 10
+    settings: {  }
+    third_party_settings: {  }
+  promote:
+    type: boolean_checkbox
+    settings:
+      display_label: true
+    weight: 15
+    third_party_settings: {  }
+  sticky:
+    type: boolean_checkbox
+    settings:
+      display_label: true
+    weight: 16
+    third_party_settings: {  }
+  comment:
+    type: comment_default
+    weight: 20
+    settings: {  }
+    third_party_settings: {  }
+  path:
+    type: path
+    weight: 30
+    settings: {  }
+    third_party_settings: {  }
+hidden: {  }
+third_party_settings: {  }
diff --git a/demo/config/optional/core.entity_view_display.node.article.default.yml b/demo/config/optional/core.entity_view_display.node.article.default.yml
new file mode 100644
index 0000000..0689b22
--- /dev/null
+++ b/demo/config/optional/core.entity_view_display.node.article.default.yml
@@ -0,0 +1,55 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - field.field.node.article.body
+    - field.field.node.article.comment
+    - field.field.node.article.field_image
+    - field.field.node.article.field_tags
+    - node.type.article
+  module:
+    - comment
+    - image
+    - taxonomy
+    - text
+    - user
+id: node.article.default
+targetEntityType: node
+bundle: article
+mode: default
+content:
+  field_image:
+    type: image
+    weight: -1
+    settings:
+      image_style: large
+      image_link: ''
+    third_party_settings: {  }
+    label: hidden
+  body:
+    type: text_default
+    weight: 0
+    settings: {  }
+    third_party_settings: {  }
+    label: hidden
+  field_tags:
+    type: entity_reference_label
+    weight: 10
+    label: above
+    settings:
+      link: true
+    third_party_settings: {  }
+  comment:
+    label: above
+    type: comment_default
+    weight: 20
+    settings:
+      pager_id: 0
+    third_party_settings: {  }
+  links:
+    weight: 100
+hidden:
+  langcode: true
+  field_image: true
+  field_tags: true
+third_party_settings: {  }
diff --git a/demo/config/optional/core.entity_view_display.node.article.rss.yml b/demo/config/optional/core.entity_view_display.node.article.rss.yml
new file mode 100644
index 0000000..4308faf
--- /dev/null
+++ b/demo/config/optional/core.entity_view_display.node.article.rss.yml
@@ -0,0 +1,26 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - core.entity_view_mode.node.rss
+    - field.field.node.article.body
+    - field.field.node.article.comment
+    - field.field.node.article.field_image
+    - field.field.node.article.field_tags
+    - node.type.article
+  module:
+    - user
+id: node.article.rss
+targetEntityType: node
+bundle: article
+mode: rss
+content:
+  links:
+    weight: 100
+hidden:
+  langcode: true
+  body: true
+  comment: true
+  field_image: true
+  field_tags: true
+third_party_settings: {  }
diff --git a/demo/config/optional/core.entity_view_display.node.article.teaser.yml b/demo/config/optional/core.entity_view_display.node.article.teaser.yml
new file mode 100644
index 0000000..464606d
--- /dev/null
+++ b/demo/config/optional/core.entity_view_display.node.article.teaser.yml
@@ -0,0 +1,50 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - core.entity_view_mode.node.teaser
+    - field.field.node.article.body
+    - field.field.node.article.comment
+    - field.field.node.article.field_image
+    - field.field.node.article.field_tags
+    - node.type.article
+  module:
+    - image
+    - taxonomy
+    - text
+    - user
+id: node.article.teaser
+targetEntityType: node
+bundle: article
+mode: teaser
+content:
+  field_image:
+    type: image
+    weight: -1
+    settings:
+      image_style: medium
+      image_link: content
+    third_party_settings: {  }
+    label: hidden
+  body:
+    type: text_summary_or_trimmed
+    weight: 0
+    settings:
+      trim_length: 600
+    third_party_settings: {  }
+    label: hidden
+  field_tags:
+    type: entity_reference_label
+    weight: 10
+    settings:
+      link: true
+    third_party_settings: {  }
+    label: above
+  links:
+    weight: 100
+hidden:
+  langcode: true
+  field_image: true
+  field_tags: true
+  comment: true
+third_party_settings: {  }
diff --git a/demo/config/optional/editor.editor.full_html.yml b/demo/config/optional/editor.editor.full_html.yml
new file mode 100644
index 0000000..80da28c
--- /dev/null
+++ b/demo/config/optional/editor.editor.full_html.yml
@@ -0,0 +1,60 @@
+format: full_html
+editor: ckeditor
+settings:
+  toolbar:
+    rows:
+      -
+        -
+          name: Formatting
+          items:
+            - Bold
+            - Italic
+            - Strike
+            - Superscript
+            - Subscript
+            - -
+            - RemoveFormat
+        -
+          name: Linking
+          items:
+            - DrupalLink
+            - DrupalUnlink
+        -
+          name: Lists
+          items:
+            - BulletedList
+            - NumberedList
+        -
+          name: Media
+          items:
+            - Blockquote
+            - DrupalImage
+            - Table
+            - HorizontalRule
+        -
+          name: 'Block Formatting'
+          items:
+            - Format
+        -
+          name: Tools
+          items:
+            - ShowBlocks
+            - Source
+  plugins:
+    stylescombo:
+      styles: ''
+image_upload:
+  status: true
+  scheme: public
+  directory: inline-images
+  max_size: ''
+  max_dimensions:
+    width: 0
+    height: 0
+status: true
+langcode: en
+dependencies:
+  config:
+    - filter.format.full_html
+  module:
+    - ckeditor
diff --git a/demo/config/optional/field.field.node.article.body.yml b/demo/config/optional/field.field.node.article.body.yml
new file mode 100644
index 0000000..e2cdb3a
--- /dev/null
+++ b/demo/config/optional/field.field.node.article.body.yml
@@ -0,0 +1,22 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - field.storage.node.body
+    - node.type.article
+  module:
+    - text
+id: node.article.body
+field_name: body
+entity_type: node
+bundle: article
+label: Body
+description: ''
+required: false
+translatable: true
+default_value: {  }
+default_value_callback: ''
+settings:
+  display_summary: true
+third_party_settings: {  }
+field_type: text_with_summary
diff --git a/demo/config/optional/field.field.node.article.comment.yml b/demo/config/optional/field.field.node.article.comment.yml
new file mode 100644
index 0000000..932daff
--- /dev/null
+++ b/demo/config/optional/field.field.node.article.comment.yml
@@ -0,0 +1,33 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - field.storage.node.comment
+    - node.type.article
+  module:
+    - comment
+id: node.article.comment
+field_name: comment
+entity_type: node
+bundle: article
+label: Comments
+description: ''
+required: true
+translatable: true
+default_value:
+  -
+    status: 2
+    cid: 0
+    last_comment_name: null
+    last_comment_timestamp: 0
+    last_comment_uid: 0
+    comment_count: 0
+default_value_callback: ''
+settings:
+  default_mode: 1
+  per_page: 50
+  form_location: true
+  anonymous: 0
+  preview: 1
+third_party_settings: {  }
+field_type: comment
diff --git a/demo/config/optional/field.field.node.article.field_image.yml b/demo/config/optional/field.field.node.article.field_image.yml
new file mode 100644
index 0000000..0a7c7f6
--- /dev/null
+++ b/demo/config/optional/field.field.node.article.field_image.yml
@@ -0,0 +1,32 @@
+id: node.article.field_image
+entity_type: node
+bundle: article
+field_name: field_image
+label: Image
+description: ''
+required: false
+default_value: {  }
+default_value_callback: ''
+settings:
+  file_directory: field/image
+  file_extensions: 'png gif jpg jpeg'
+  max_filesize: ''
+  max_resolution: ''
+  min_resolution: ''
+  alt_field: true
+  title_field: false
+  alt_field_required: true
+  title_field_required: false
+  default_image:
+    uuid: null
+    alt: ''
+    title: ''
+    width: null
+    height: null
+status: true
+langcode: en
+field_type: image
+dependencies:
+  config:
+    - field.storage.node.field_image
+    - node.type.article
diff --git a/demo/config/optional/field.field.node.article.field_tags.yml b/demo/config/optional/field.field.node.article.field_tags.yml
new file mode 100644
index 0000000..d69a558
--- /dev/null
+++ b/demo/config/optional/field.field.node.article.field_tags.yml
@@ -0,0 +1,26 @@
+id: node.article.field_tags
+entity_type: node
+bundle: article
+field_name: field_tags
+field_type: entity_reference
+label: Tags
+description: 'Enter a comma-separated list. For example: Amsterdam, Mexico City, "Cleveland, Ohio"'
+required: false
+default_value: {  }
+default_value_callback: ''
+settings:
+  handler: default
+  handler_settings:
+    target_bundles:
+      tags: tags
+    sort:
+      field: _none
+    auto_create: true
+status: true
+langcode: en
+dependencies:
+  config:
+    - field.storage.node.field_tags
+    - node.type.article
+  module:
+    - entity_reference
diff --git a/demo/config/optional/node.type.article.yml b/demo/config/optional/node.type.article.yml
new file mode 100644
index 0000000..7cb127d
--- /dev/null
+++ b/demo/config/optional/node.type.article.yml
@@ -0,0 +1,9 @@
+type: article
+name: Article
+description: 'Use <em>articles</em> for time-sensitive content like news, press releases or blog posts.'
+help: ''
+new_revision: false
+preview_mode: 1
+display_submitted: true
+status: true
+langcode: en
diff --git a/demo/config/optional/search_api.index.collect_demo.yml b/demo/config/optional/search_api.index.collect_demo.yml
index 1415342..b540c37 100644
--- a/demo/config/optional/search_api.index.collect_demo.yml
+++ b/demo/config/optional/search_api.index.collect_demo.yml
@@ -49,3 +49,4 @@ dependencies:
     - search_api.server.collect_demo
   module:
     - collect
+    - inmail_collect
diff --git a/demo/config/optional/search_api.server.collect_demo.yml b/demo/config/optional/search_api.server.collect_demo.yml
index fe005d7..4a17d74 100644
--- a/demo/config/optional/search_api.server.collect_demo.yml
+++ b/demo/config/optional/search_api.server.collect_demo.yml
@@ -5,7 +5,6 @@ status: true
 backend: search_api_db
 backend_config:
   database: 'default:default'
-  database_text: ''
   min_chars: 1
   autocomplete:
     suggest_suffix: true
@@ -14,3 +13,5 @@ langcode: en
 dependencies:
   module:
     - search_api_db
+    - collect
+    - inmail
diff --git a/demo/config/optional/views.view.collect_demo.yml b/demo/config/optional/views.view.collect_demo.yml
index 088eb68..ae13e5d 100644
--- a/demo/config/optional/views.view.collect_demo.yml
+++ b/demo/config/optional/views.view.collect_demo.yml
@@ -3,6 +3,7 @@ status: true
 dependencies:
   module:
     - search_api
+    - search_api_db_defaults
     - user
   config:
     - search_api.index.collect_demo
diff --git a/src/Plugin/search_api/datasource/CollectDatasource.php b/src/Plugin/search_api/datasource/CollectDatasource.php
index 85594bd..d5fff91 100644
--- a/src/Plugin/search_api/datasource/CollectDatasource.php
+++ b/src/Plugin/search_api/datasource/CollectDatasource.php
@@ -161,4 +161,13 @@ class CollectDatasource extends DatasourcePluginBase {
     return $this->schema->buildTeaser($item);
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function calculateDependencies() {
+    $this->dependencies += parent::calculateDependencies();
+    $this->addDependency('module', $this->getPluginDefinition()['provider']);
+    return $this->dependencies;
+  }
+
 }
