diff --git a/composer.json b/composer.json
index d827a243612bc7ad709f026c8b1c885b361cf431..a441243d9d3008a41a103ab504f531c175ff3dc0 100644
--- a/composer.json
+++ b/composer.json
@@ -57,7 +57,7 @@
         "drupal/message": "^1.1",
         "drupal/message_digest": "^1.0.0",
         "drupal/message_notify": "~1.2",
-        "drupal/meta_entity": "^1.0-alpha2",
+        "drupal/meta_entity": "^1.2",
         "drupal/monolog": "^2.0",
         "drupal/og": "^1.0-alpha7",
         "drupal/og_menu": "^2.0",
@@ -68,6 +68,7 @@
         "drupal/pipeline": "^1.0",
         "drupal/publication_date": "^2.0-beta2",
         "drupal/rdf_entity": "^2.0",
+        "drupal/rdf_meta_entity": "^1.0",
         "drupal/redirect": "^1.6",
         "drupal/redis": "^1.4",
         "drupal/schema_digital_document": "^1.0.0",
@@ -293,6 +294,9 @@
             "drupal/matomo_reporting_api": {
                 "Ensure backward compatibility with Piwik @see https://www.drupal.org/project/matomo_reporting_api/issues/3080854": "https://www.drupal.org/files/issues/2019-09-18/3080854-7.patch"
             },
+            "drupal/meta_entity": {
+                "Make the field configurable in the view @see https://www.drupal.org/project/meta_entity/issues/3279161": "https://git.drupalcode.org/project/meta_entity/-/merge_requests/4.diff"
+            },
             "drupal/metatag": {
                 "Views cache wrapper overrides other modules cache logic @see https://www.drupal.org/project/metatag/issues/3261473": "https://git.drupalcode.org/project/metatag/-/merge_requests/48.diff"
             },
@@ -308,6 +312,10 @@
             "drupal/rdf_entity": {
                 "Allow bundle label plural variants @see https://github.com/ec-europa/rdf_entity/pull/12": "https://github.com/ec-europa/rdf_entity/compare/8.x-1.x...ea8f6af001fca732e89a4be0e29643953f49a88f.diff"
             },
+            "drupal/rdf_meta_entity": {
+                "Provide a default template file @see https://www.drupal.org/project/rdf_meta_entity/issues/3279162": "https://git.drupalcode.org/project/rdf_meta_entity/-/merge_requests/2.diff",
+                "Provide a default delete form @see https://www.drupal.org/project/rdf_meta_entity/issues/3283343": "https://git.drupalcode.org/project/rdf_meta_entity/-/merge_requests/3.diff"
+            },
             "drupal/search_api": {
                 "item_id column is too short @see https://www.drupal.org/node/2829696": "resources/patch/search_api-item_id-length-2829696.patch",
                 "Some bulk form field options are missing schema @see https://www.drupal.org/project/search_api/issues/3195199": "https://git.drupalcode.org/project/search_api/-/merge_requests/6.diff",
diff --git a/composer.lock b/composer.lock
index 708ccf724cb27ecf96dcde803bc1a3e7d776d78d..2e8a18c77ee5c977019eacd3e33315fbc43e4921 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "76e680a21756041cb94704d92fcf8c5e",
+    "content-hash": "37479f6445442e6aeb259924acd4c3c4",
     "packages": [
         {
             "name": "asm89/stack-cors",
@@ -4078,14 +4078,14 @@
                 "GPL-2.0-or-later"
             ],
             "authors": [
-                {
-                    "name": "Centarro",
-                    "homepage": "https://www.drupal.org/user/3661446"
-                },
                 {
                     "name": "bojanz",
                     "homepage": "https://www.drupal.org/user/86106"
                 },
+                {
+                    "name": "Centarro",
+                    "homepage": "https://www.drupal.org/user/3661446"
+                },
                 {
                     "name": "dawehner",
                     "homepage": "https://www.drupal.org/user/99340"
@@ -5912,6 +5912,58 @@
                 "issues": "https://drupal.org/project/issues/rdf_entity"
             }
         },
+        {
+            "name": "drupal/rdf_meta_entity",
+            "version": "1.0.0-alpha2",
+            "source": {
+                "type": "git",
+                "url": "https://git.drupalcode.org/project/rdf_meta_entity.git",
+                "reference": "1.0.0-alpha2"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://ftp.drupal.org/files/projects/rdf_meta_entity-1.0.0-alpha2.zip",
+                "reference": "1.0.0-alpha2",
+                "shasum": "579b6ce3dc0b79f93dd3e2e63b84bdd8a8c1f0b2"
+            },
+            "require": {
+                "drupal/core": ">=9.3",
+                "drupal/meta_entity": ">=1.1",
+                "drupal/sparql_entity_storage": "^2.0"
+            },
+            "type": "drupal-module",
+            "extra": {
+                "drupal": {
+                    "version": "1.0.0-alpha2",
+                    "datestamp": "1651238895",
+                    "security-coverage": {
+                        "status": "not-covered",
+                        "message": "Alpha releases are not covered by Drupal security advisories."
+                    }
+                }
+            },
+            "notification-url": "https://packages.drupal.org/8/downloads",
+            "license": [
+                "GPL-2.0+"
+            ],
+            "authors": [
+                {
+                    "name": "Ilias Dimopoulos",
+                    "homepage": "https://www.drupal.org/u/idimopoulos-0"
+                },
+                {
+                    "name": "Claudiu Cristea",
+                    "homepage": "https://www.drupal.org/user/2578708",
+                    "email": "https://www.drupal.org/u/claudiucristea"
+                }
+            ],
+            "description": "Allows storing metadata about an entity in entities having a SPARQL backend.",
+            "homepage": "https://www.drupal.org/project/rdf_meta_entity",
+            "support": {
+                "source": "https://git.drupalcode.org/project/rdf_meta_entity",
+                "issues": "https://www.drupal.org/project/issues/rdf_meta_entity"
+            }
+        },
         {
             "name": "drupal/redirect",
             "version": "1.7.0",
diff --git a/config/sync/block.block.anonymous_comment_links.yml b/config/sync/block.block.anonymous_comment_links.yml
index 44d928212aa1eef7b04923703b9758d85e2843e9..f9e857bf6b67fa7d0f7c4db205b1281ccedf06af 100644
--- a/config/sync/block.block.anonymous_comment_links.yml
+++ b/config/sync/block.block.anonymous_comment_links.yml
@@ -5,7 +5,7 @@ dependencies:
   config:
     - simple_block.simple_block.anonymous_comment_links
   module:
-    - ctools
+    - node
     - simple_block
     - user
   theme:
diff --git a/config/sync/block.block.eiffilterblock.yml b/config/sync/block.block.eiffilterblock.yml
new file mode 100644
index 0000000000000000000000000000000000000000..39a330d31e554f96d081e487f0c734436d845146
--- /dev/null
+++ b/config/sync/block.block.eiffilterblock.yml
@@ -0,0 +1,25 @@
+uuid: ade53e5b-b29c-4bb4-92f8-d0212ab97968
+langcode: en
+status: true
+dependencies:
+  module:
+    - eif
+    - system
+  theme:
+    - joinup_theme
+id: eiffilterblock
+theme: joinup_theme
+region: content
+weight: 0
+provider: null
+plugin: eif_filter_block
+settings:
+  id: eif_filter_block
+  label: 'Eif filter block'
+  label_display: '0'
+  provider: eif
+visibility:
+  request_path:
+    id: request_path
+    negate: false
+    pages: /node/705372
diff --git a/config/sync/block.block.unpublished_content_of_group.yml b/config/sync/block.block.unpublished_content_of_group.yml
index 792acf6972c6c078dff3f8629def65bf0db337a7..d3a62b8d404a4828cb6839c3f65e54a83cac092c 100644
--- a/config/sync/block.block.unpublished_content_of_group.yml
+++ b/config/sync/block.block.unpublished_content_of_group.yml
@@ -3,9 +3,9 @@ langcode: en
 status: true
 dependencies:
   module:
-    - ctools
     - joinup_core
     - joinup_group
+    - rdf_entity
   theme:
     - joinup_theme
 _core:
diff --git a/config/sync/block.block.views_block__solutions_meta_entity_solutions_meta_entity_block.yml b/config/sync/block.block.views_block__solutions_meta_entity_solutions_meta_entity_block.yml
new file mode 100644
index 0000000000000000000000000000000000000000..842c0f0c702bfed22596252c58ee95ac8bc58c6a
--- /dev/null
+++ b/config/sync/block.block.views_block__solutions_meta_entity_solutions_meta_entity_block.yml
@@ -0,0 +1,29 @@
+uuid: e876956e-9577-4d00-8510-104daba13c9a
+langcode: en
+status: true
+dependencies:
+  config:
+    - views.view.solutions_meta_entity
+  module:
+    - system
+    - views
+  theme:
+    - joinup_theme
+id: views_block__solutions_meta_entity_solutions_meta_entity_block
+theme: joinup_theme
+region: content
+weight: 0
+provider: null
+plugin: 'views_block:solutions_meta_entity-solutions_meta_entity_block'
+settings:
+  id: 'views_block:solutions_meta_entity-solutions_meta_entity_block'
+  label: ''
+  label_display: '0'
+  provider: views
+  views_label: ''
+  items_per_page: none
+visibility:
+  request_path:
+    id: request_path
+    negate: false
+    pages: /node/705372
diff --git a/config/sync/core.entity_form_display.eif_wrapper.recommendation.default.yml b/config/sync/core.entity_form_display.eif_wrapper.recommendation.default.yml
new file mode 100644
index 0000000000000000000000000000000000000000..5c636d8ad1359a5fec79a9a8235f6060c97c3255
--- /dev/null
+++ b/config/sync/core.entity_form_display.eif_wrapper.recommendation.default.yml
@@ -0,0 +1,29 @@
+uuid: 698e36ff-00da-4b30-8349-9ea59f05d2e7
+langcode: en
+status: true
+dependencies:
+  config:
+    - eif.eif_wrapper_type.recommendation
+    - field.field.eif_wrapper.recommendation.term
+  module:
+    - text
+id: eif_wrapper.recommendation.default
+targetEntityType: eif_wrapper
+bundle: recommendation
+mode: default
+content:
+  description:
+    type: text_textarea
+    weight: 1
+    region: content
+    settings:
+      rows: 5
+      placeholder: ''
+    third_party_settings: {  }
+  term:
+    type: options_select
+    weight: 0
+    region: content
+    settings: {  }
+    third_party_settings: {  }
+hidden: {  }
diff --git a/config/sync/core.entity_form_display.rdf_meta_entity.eif_perspective.default.yml b/config/sync/core.entity_form_display.rdf_meta_entity.eif_perspective.default.yml
new file mode 100644
index 0000000000000000000000000000000000000000..2552e0c679f66ef5149acf220571aa6e7caec084
--- /dev/null
+++ b/config/sync/core.entity_form_display.rdf_meta_entity.eif_perspective.default.yml
@@ -0,0 +1,75 @@
+uuid: ce53109a-a2ec-4769-9245-58b4e94ba9ff
+langcode: en
+status: true
+dependencies:
+  config:
+    - field.field.rdf_meta_entity.eif_perspective.eif_layer
+    - field.field.rdf_meta_entity.eif_perspective.eif_model
+    - field.field.rdf_meta_entity.eif_perspective.eif_principle
+    - field.field.rdf_meta_entity.eif_perspective.eif_recommendation
+    - field.field.rdf_meta_entity.eif_perspective.field_eif_description
+    - field.field.rdf_meta_entity.eif_perspective.field_eif_solution_type
+    - rdf_meta_entity.type.eif_perspective
+  module:
+    - inline_entity_form
+    - oe_bootstrap_theme_helper
+    - text
+id: rdf_meta_entity.eif_perspective.default
+targetEntityType: rdf_meta_entity
+bundle: eif_perspective
+mode: default
+content:
+  eif_layer:
+    type: options_buttons
+    weight: 3
+    region: content
+    settings: {  }
+    third_party_settings: {  }
+  eif_model:
+    type: options_buttons
+    weight: 4
+    region: content
+    settings: {  }
+    third_party_settings: {  }
+  eif_principle:
+    type: options_buttons
+    weight: 2
+    region: content
+    settings: {  }
+    third_party_settings: {  }
+  eif_recommendation:
+    type: inline_entity_form_complex
+    weight: 5
+    region: content
+    settings:
+      form_mode: default
+      override_labels: true
+      label_singular: qualifier
+      label_plural: qualifiers
+      allow_new: true
+      allow_existing: false
+      match_operator: CONTAINS
+      allow_duplicate: false
+      collapsible: false
+      collapsed: false
+      revision: false
+    third_party_settings: {  }
+  field_eif_description:
+    type: text_textarea
+    weight: 0
+    region: content
+    settings:
+      rows: 5
+      placeholder: ''
+    third_party_settings: {  }
+  field_eif_solution_type:
+    type: options_buttons
+    weight: 1
+    region: content
+    settings: {  }
+    third_party_settings:
+      oe_bootstrap_theme_helper:
+        switch: false
+hidden:
+  label: true
+  target: true
diff --git a/config/sync/core.entity_view_display.eif_wrapper.eif_wrapper.default.yml b/config/sync/core.entity_view_display.eif_wrapper.eif_wrapper.default.yml
new file mode 100644
index 0000000000000000000000000000000000000000..8de2577210f4de9f2600d7470777c0f9f9e87e56
--- /dev/null
+++ b/config/sync/core.entity_view_display.eif_wrapper.eif_wrapper.default.yml
@@ -0,0 +1,33 @@
+uuid: 5662b785-36de-44d1-951d-ff95ffaac673
+langcode: en
+status: true
+dependencies:
+  module:
+    - eif
+    - joinup_core
+    - text
+id: eif_wrapper.eif_wrapper.default
+targetEntityType: eif_wrapper
+bundle: eif_wrapper
+mode: default
+content:
+  description:
+    type: text_default
+    label: hidden
+    settings: {  }
+    third_party_settings: {  }
+    weight: 10
+    region: content
+  term:
+    type: entity_reference_custom_link
+    label: hidden
+    settings:
+      path: '[term:url]'
+      label: '[term:label]'
+      query_parameters: ''
+      limit: -1
+    third_party_settings: {  }
+    weight: 0
+    region: content
+hidden:
+  search_api_excerpt: true
diff --git a/config/sync/core.entity_view_display.eif_wrapper.recommendation.default.yml b/config/sync/core.entity_view_display.eif_wrapper.recommendation.default.yml
new file mode 100644
index 0000000000000000000000000000000000000000..520db094736049a88b3c0daa5567a1dd40969f76
--- /dev/null
+++ b/config/sync/core.entity_view_display.eif_wrapper.recommendation.default.yml
@@ -0,0 +1,35 @@
+uuid: 8e4a8f5c-3abe-4494-93f9-35d39db5f7fe
+langcode: en
+status: true
+dependencies:
+  config:
+    - eif.eif_wrapper_type.recommendation
+    - field.field.eif_wrapper.recommendation.term
+  module:
+    - template_suggestion
+    - text
+id: eif_wrapper.recommendation.default
+targetEntityType: eif_wrapper
+bundle: recommendation
+mode: default
+content:
+  description:
+    type: text_default
+    label: hidden
+    settings: {  }
+    third_party_settings: {  }
+    weight: 1
+    region: content
+  term:
+    type: entity_reference_entity_view
+    label: hidden
+    settings:
+      view_mode: eif_recommendation
+      link: false
+    third_party_settings:
+      template_suggestion:
+        template_suggestion: ''
+    weight: 0
+    region: content
+hidden:
+  search_api_excerpt: true
diff --git a/config/sync/core.entity_view_display.node.discussion.default.yml b/config/sync/core.entity_view_display.node.discussion.default.yml
index 8e872ca01d8f4d5c366654b1801f83572b7fb4be..4268f6a8b431997630a3f453f5a247c72248a2ee 100644
--- a/config/sync/core.entity_view_display.node.discussion.default.yml
+++ b/config/sync/core.entity_view_display.node.discussion.default.yml
@@ -126,9 +126,12 @@ content:
     weight: 8
     region: content
 hidden:
+  featured: true
   field_keywords: true
   field_site_featured: true
   langcode: true
+  pinned_in: true
   published_at: true
   read_more: true
   search_api_excerpt: true
+  visit_count: true
diff --git a/config/sync/core.entity_view_display.node.discussion.digest_message.yml b/config/sync/core.entity_view_display.node.discussion.digest_message.yml
index 4aaab16d39c7ebbf2b5c1fa6bfabac4323057b76..aa3a605f403f4c4fc2844eb5f0f4d21cb2f80043 100644
--- a/config/sync/core.entity_view_display.node.discussion.digest_message.yml
+++ b/config/sync/core.entity_view_display.node.discussion.digest_message.yml
@@ -47,6 +47,7 @@ content:
     weight: 0
     region: content
 hidden:
+  featured: true
   field_attachment: true
   field_keywords: true
   field_replies: true
@@ -59,8 +60,10 @@ hidden:
   langcode: true
   links: true
   og_audience: true
+  pinned_in: true
   published_at: true
   read_more: true
   report: true
   search_api_excerpt: true
   share_link: true
+  visit_count: true
diff --git a/config/sync/core.entity_view_display.node.discussion.moderation.yml b/config/sync/core.entity_view_display.node.discussion.moderation.yml
index 888e02953e618180ae050349618803db65d9eca4..30d12bb7926eaa38659cb49cee9cd94db8e6113f 100644
--- a/config/sync/core.entity_view_display.node.discussion.moderation.yml
+++ b/config/sync/core.entity_view_display.node.discussion.moderation.yml
@@ -54,6 +54,7 @@ content:
     weight: 0
     region: content
 hidden:
+  featured: true
   field_attachment: true
   field_keywords: true
   field_replies: true
@@ -65,8 +66,10 @@ hidden:
   langcode: true
   links: true
   og_audience: true
+  pinned_in: true
   published_at: true
   read_more: true
   report: true
   search_api_excerpt: true
   share_link: true
+  visit_count: true
diff --git a/config/sync/core.entity_view_display.node.discussion.numbered_listing.yml b/config/sync/core.entity_view_display.node.discussion.numbered_listing.yml
index 8df56a4e972bcbf69f6ae9d996d5287ab6bd1066..132baf5739bd3e84f96add9436f576fe45a3a0d7 100644
--- a/config/sync/core.entity_view_display.node.discussion.numbered_listing.yml
+++ b/config/sync/core.entity_view_display.node.discussion.numbered_listing.yml
@@ -70,6 +70,7 @@ content:
     weight: 0
     region: content
 hidden:
+  featured: true
   field_attachment: true
   field_keywords: true
   field_replies: true
@@ -81,8 +82,10 @@ hidden:
   langcode: true
   links: true
   og_audience: true
+  pinned_in: true
   published_at: true
   read_more: true
   report: true
   search_api_excerpt: true
   share_link: true
+  visit_count: true
diff --git a/config/sync/core.entity_view_display.node.discussion.search_result.yml b/config/sync/core.entity_view_display.node.discussion.search_result.yml
index 73f2af4888bfc86c2fe624311cb157129fe71943..def99bd44cd5c3e34a338b029380cda150ed62ba 100644
--- a/config/sync/core.entity_view_display.node.discussion.search_result.yml
+++ b/config/sync/core.entity_view_display.node.discussion.search_result.yml
@@ -63,6 +63,7 @@ content:
     weight: 2
     region: content
 hidden:
+  featured: true
   field_attachment: true
   field_keywords: true
   field_replies: true
@@ -74,7 +75,9 @@ hidden:
   langcode: true
   links: true
   og_audience: true
+  pinned_in: true
   read_more: true
   report: true
   search_api_excerpt: true
   share_link: true
+  visit_count: true
diff --git a/config/sync/core.entity_view_display.node.discussion.search_result_featured.yml b/config/sync/core.entity_view_display.node.discussion.search_result_featured.yml
index 5bb6e1d861b64ec98d62b929e04e04165e51b8b1..965e1f0376b5897963e970e237498bbaaf8d8d26 100644
--- a/config/sync/core.entity_view_display.node.discussion.search_result_featured.yml
+++ b/config/sync/core.entity_view_display.node.discussion.search_result_featured.yml
@@ -76,6 +76,7 @@ content:
     weight: 2
     region: content
 hidden:
+  featured: true
   field_attachment: true
   field_keywords: true
   field_replies: true
@@ -87,7 +88,9 @@ hidden:
   langcode: true
   links: true
   og_audience: true
+  pinned_in: true
   read_more: true
   report: true
   search_api_excerpt: true
   share_link: true
+  visit_count: true
diff --git a/config/sync/core.entity_view_display.node.discussion.view_mode_featured.yml b/config/sync/core.entity_view_display.node.discussion.view_mode_featured.yml
index ab4bf1b72334a297e248f9fa2b04cd88926d94b4..ed9d9cf0314d348efa4f9d663729f5ca051b5388 100644
--- a/config/sync/core.entity_view_display.node.discussion.view_mode_featured.yml
+++ b/config/sync/core.entity_view_display.node.discussion.view_mode_featured.yml
@@ -66,6 +66,7 @@ content:
     weight: 0
     region: content
 hidden:
+  featured: true
   field_attachment: true
   field_replies: true
   field_shared_in: true
@@ -76,8 +77,10 @@ hidden:
   langcode: true
   links: true
   og_audience: true
+  pinned_in: true
   published_at: true
   read_more: true
   report: true
   search_api_excerpt: true
   share_link: true
+  visit_count: true
diff --git a/config/sync/core.entity_view_display.node.discussion.view_mode_tile.yml b/config/sync/core.entity_view_display.node.discussion.view_mode_tile.yml
index 778804af46749b2330c5b576261c3d59a86e50c4..8808c2fc21921e43c6c081bc1f3b450c49daa516 100644
--- a/config/sync/core.entity_view_display.node.discussion.view_mode_tile.yml
+++ b/config/sync/core.entity_view_display.node.discussion.view_mode_tile.yml
@@ -67,6 +67,7 @@ content:
     weight: 0
     region: content
 hidden:
+  featured: true
   field_attachment: true
   field_replies: true
   field_shared_in: true
@@ -77,8 +78,10 @@ hidden:
   langcode: true
   links: true
   og_audience: true
+  pinned_in: true
   published_at: true
   read_more: true
   report: true
   search_api_excerpt: true
   share_link: true
+  visit_count: true
diff --git a/config/sync/core.entity_view_display.node.document.default.yml b/config/sync/core.entity_view_display.node.document.default.yml
index e7465d5be3834d1d5dcd028d571213ea43e3aba3..ba32cd2e840062587ba5395373b81579c091d0d8 100644
--- a/config/sync/core.entity_view_display.node.document.default.yml
+++ b/config/sync/core.entity_view_display.node.document.default.yml
@@ -171,6 +171,7 @@ content:
     weight: 5
     region: content
 hidden:
+  featured: true
   field_document_logo: true
   field_document_spatial_coverage: true
   field_keywords: true
@@ -180,6 +181,8 @@ hidden:
   langcode: true
   links: true
   og_audience: true
+  pinned_in: true
   published_at: true
   read_more: true
   search_api_excerpt: true
+  visit_count: true
diff --git a/config/sync/core.entity_view_display.node.document.digest_message.yml b/config/sync/core.entity_view_display.node.document.digest_message.yml
index d646a606c19759d239c7252d850ee74f861e0a5c..f045893f75406261e31090165af28434f67895d4 100644
--- a/config/sync/core.entity_view_display.node.document.digest_message.yml
+++ b/config/sync/core.entity_view_display.node.document.digest_message.yml
@@ -87,6 +87,7 @@ content:
     weight: 0
     region: content
 hidden:
+  featured: true
   field_comments: true
   field_document_spatial_coverage: true
   field_file: true
@@ -100,8 +101,10 @@ hidden:
   langcode: true
   links: true
   og_audience: true
+  pinned_in: true
   published_at: true
   read_more: true
   report: true
   search_api_excerpt: true
   share_link: true
+  visit_count: true
diff --git a/config/sync/core.entity_view_display.node.document.highlighted.yml b/config/sync/core.entity_view_display.node.document.highlighted.yml
index 694e99280af5a11b81316a39e700f8560be5c6d0..671fd47b02b505b6e5d61d7b2fd880056cd6a0bf 100644
--- a/config/sync/core.entity_view_display.node.document.highlighted.yml
+++ b/config/sync/core.entity_view_display.node.document.highlighted.yml
@@ -117,6 +117,7 @@ content:
     weight: 1
     region: content
 hidden:
+  featured: true
   field_comments: true
   field_document_publication_date: true
   field_document_spatial_coverage: true
@@ -131,8 +132,10 @@ hidden:
   langcode: true
   links: true
   og_audience: true
+  pinned_in: true
   published_at: true
   read_more: true
   report: true
   search_api_excerpt: true
   share_link: true
+  visit_count: true
diff --git a/config/sync/core.entity_view_display.node.document.moderation.yml b/config/sync/core.entity_view_display.node.document.moderation.yml
index 8e74998b3adaf3fd2095f8c7352438efc4b9006e..ba63dbbfd27de585169c46531e4ce8887e5393db 100644
--- a/config/sync/core.entity_view_display.node.document.moderation.yml
+++ b/config/sync/core.entity_view_display.node.document.moderation.yml
@@ -60,6 +60,7 @@ content:
     weight: 1
     region: content
 hidden:
+  featured: true
   field_comments: true
   field_document_logo: true
   field_document_publication_date: true
@@ -75,8 +76,10 @@ hidden:
   langcode: true
   links: true
   og_audience: true
+  pinned_in: true
   published_at: true
   read_more: true
   report: true
   search_api_excerpt: true
   share_link: true
+  visit_count: true
diff --git a/config/sync/core.entity_view_display.node.document.numbered_listing.yml b/config/sync/core.entity_view_display.node.document.numbered_listing.yml
index 3a98e80362a1890f2572cc1dea92e48cefe7b481..09b47a6477a06b77d407aaed9df8d264347381da 100644
--- a/config/sync/core.entity_view_display.node.document.numbered_listing.yml
+++ b/config/sync/core.entity_view_display.node.document.numbered_listing.yml
@@ -126,6 +126,7 @@ content:
     weight: 1
     region: content
 hidden:
+  featured: true
   field_comments: true
   field_document_publication_date: true
   field_document_spatial_coverage: true
@@ -140,8 +141,10 @@ hidden:
   langcode: true
   links: true
   og_audience: true
+  pinned_in: true
   published_at: true
   read_more: true
   report: true
   search_api_excerpt: true
   share_link: true
+  visit_count: true
diff --git a/config/sync/core.entity_view_display.node.document.search_result.yml b/config/sync/core.entity_view_display.node.document.search_result.yml
index 5f56e924804bafcf52ba4a385cb6cfd22e91c30f..08550810d69753e51b4501e2f4bbe76ed5144c2d 100644
--- a/config/sync/core.entity_view_display.node.document.search_result.yml
+++ b/config/sync/core.entity_view_display.node.document.search_result.yml
@@ -114,6 +114,7 @@ content:
     weight: 2
     region: content
 hidden:
+  featured: true
   field_comments: true
   field_document_logo: true
   field_document_publication_date: true
@@ -129,7 +130,9 @@ hidden:
   langcode: true
   links: true
   og_audience: true
+  pinned_in: true
   read_more: true
   report: true
   search_api_excerpt: true
   share_link: true
+  visit_count: true
diff --git a/config/sync/core.entity_view_display.node.document.search_result_featured.yml b/config/sync/core.entity_view_display.node.document.search_result_featured.yml
index ea91c357b3e104c3738ac017aeb16dded479e612..677322dabf93d9472aefdacef3a8b345ea08a2bd 100644
--- a/config/sync/core.entity_view_display.node.document.search_result_featured.yml
+++ b/config/sync/core.entity_view_display.node.document.search_result_featured.yml
@@ -127,6 +127,7 @@ content:
     weight: 2
     region: content
 hidden:
+  featured: true
   field_comments: true
   field_document_publication_date: true
   field_document_spatial_coverage: true
@@ -141,7 +142,9 @@ hidden:
   langcode: true
   links: true
   og_audience: true
+  pinned_in: true
   read_more: true
   report: true
   search_api_excerpt: true
   share_link: true
+  visit_count: true
diff --git a/config/sync/core.entity_view_display.node.document.view_mode_featured.yml b/config/sync/core.entity_view_display.node.document.view_mode_featured.yml
index d4bb9bc21b9a625f7af870495faabfedc6b64401..fa229f514d558d31e987ea605e29dfe082ccd79d 100644
--- a/config/sync/core.entity_view_display.node.document.view_mode_featured.yml
+++ b/config/sync/core.entity_view_display.node.document.view_mode_featured.yml
@@ -81,6 +81,7 @@ content:
     weight: 1
     region: content
 hidden:
+  featured: true
   field_comments: true
   field_document_logo: true
   field_document_publication_date: true
@@ -94,8 +95,10 @@ hidden:
   langcode: true
   links: true
   og_audience: true
+  pinned_in: true
   published_at: true
   read_more: true
   report: true
   search_api_excerpt: true
   share_link: true
+  visit_count: true
diff --git a/config/sync/core.entity_view_display.node.document.view_mode_tile.yml b/config/sync/core.entity_view_display.node.document.view_mode_tile.yml
index 425aa8b1492aea1d61e01b24e5e8f28039190d2d..dd8d410cfb5f88400b5f40f6e9aa8de82de5c1ea 100644
--- a/config/sync/core.entity_view_display.node.document.view_mode_tile.yml
+++ b/config/sync/core.entity_view_display.node.document.view_mode_tile.yml
@@ -97,6 +97,7 @@ content:
     weight: 1
     region: content
 hidden:
+  featured: true
   field_comments: true
   field_document_publication_date: true
   field_document_spatial_coverage: true
@@ -109,8 +110,10 @@ hidden:
   langcode: true
   links: true
   og_audience: true
+  pinned_in: true
   published_at: true
   read_more: true
   report: true
   search_api_excerpt: true
   share_link: true
+  visit_count: true
diff --git a/config/sync/core.entity_view_display.node.event.default.yml b/config/sync/core.entity_view_display.node.event.default.yml
index b007dbe9273d3a20dbfaf7c2f5831b1659b72857..3ee95c59d8c6171bff685a67741016bdcc14c632 100644
--- a/config/sync/core.entity_view_display.node.event.default.yml
+++ b/config/sync/core.entity_view_display.node.event.default.yml
@@ -195,6 +195,7 @@ content:
     weight: 10
     region: content
 hidden:
+  featured: true
   field_event_spatial_coverage: true
   field_keywords: true
   field_organisation: true
@@ -206,6 +207,8 @@ hidden:
   field_topic: true
   langcode: true
   og_audience: true
+  pinned_in: true
   published_at: true
   read_more: true
   search_api_excerpt: true
+  visit_count: true
diff --git a/config/sync/core.entity_view_display.node.event.digest_message.yml b/config/sync/core.entity_view_display.node.event.digest_message.yml
index c7d3ca9a3ede00ef1f3c486155b7a495b9e0796a..9b22531e7484e2abe6f9105c2fced8790c9df916 100644
--- a/config/sync/core.entity_view_display.node.event.digest_message.yml
+++ b/config/sync/core.entity_view_display.node.event.digest_message.yml
@@ -91,6 +91,7 @@ content:
     weight: 0
     region: content
 hidden:
+  featured: true
   field_attachment: true
   field_comments: true
   field_event_agenda: true
@@ -111,8 +112,10 @@ hidden:
   field_topic: true
   langcode: true
   og_audience: true
+  pinned_in: true
   published_at: true
   read_more: true
   report: true
   search_api_excerpt: true
   share_link: true
+  visit_count: true
diff --git a/config/sync/core.entity_view_display.node.event.explore_item.yml b/config/sync/core.entity_view_display.node.event.explore_item.yml
index 7c48de0b1277da620a10c82c2d9e135c8afcd481..f404f4cb7ea4640f067959eb19a1669f1ab3dd88 100644
--- a/config/sync/core.entity_view_display.node.event.explore_item.yml
+++ b/config/sync/core.entity_view_display.node.event.explore_item.yml
@@ -165,6 +165,7 @@ content:
     weight: 2
     region: content
 hidden:
+  featured: true
   field_attachment: true
   field_comments: true
   field_event_agenda: true
@@ -187,6 +188,8 @@ hidden:
   field_topic: true
   langcode: true
   og_audience: true
+  pinned_in: true
   report: true
   search_api_excerpt: true
   share_link: true
+  visit_count: true
diff --git a/config/sync/core.entity_view_display.node.event.highlighted.yml b/config/sync/core.entity_view_display.node.event.highlighted.yml
index a327652a2fdbbc7a05a68c29d50b518a1a81e402..bc80de0e3175295b4038cbcaba8225436e375219 100644
--- a/config/sync/core.entity_view_display.node.event.highlighted.yml
+++ b/config/sync/core.entity_view_display.node.event.highlighted.yml
@@ -83,6 +83,7 @@ content:
     weight: 1
     region: content
 hidden:
+  featured: true
   field_attachment: true
   field_comments: true
   field_event_agenda: true
@@ -104,8 +105,10 @@ hidden:
   langcode: true
   links: true
   og_audience: true
+  pinned_in: true
   published_at: true
   read_more: true
   report: true
   search_api_excerpt: true
   share_link: true
+  visit_count: true
diff --git a/config/sync/core.entity_view_display.node.event.highlighted_event.yml b/config/sync/core.entity_view_display.node.event.highlighted_event.yml
index 336ded1d4c4750ac142ea48ca244f8d37bfc9eb0..8998242ff9c5c01bd27bb6e73e3c26cc7a3fcc18 100644
--- a/config/sync/core.entity_view_display.node.event.highlighted_event.yml
+++ b/config/sync/core.entity_view_display.node.event.highlighted_event.yml
@@ -58,6 +58,7 @@ content:
     region: content
 hidden:
   body: true
+  featured: true
   field_attachment: true
   field_comments: true
   field_event_agenda: true
@@ -80,8 +81,10 @@ hidden:
   langcode: true
   links: true
   og_audience: true
+  pinned_in: true
   published_at: true
   read_more: true
   report: true
   search_api_excerpt: true
   share_link: true
+  visit_count: true
diff --git a/config/sync/core.entity_view_display.node.event.moderation.yml b/config/sync/core.entity_view_display.node.event.moderation.yml
index 1e11603e3334000c5547239807d56cfe4f24d911..1d69c15e192f055f9a0b1e4901bc40631b2aa474 100644
--- a/config/sync/core.entity_view_display.node.event.moderation.yml
+++ b/config/sync/core.entity_view_display.node.event.moderation.yml
@@ -65,6 +65,7 @@ content:
     weight: 1
     region: content
 hidden:
+  featured: true
   field_attachment: true
   field_comments: true
   field_event_agenda: true
@@ -87,8 +88,10 @@ hidden:
   langcode: true
   links: true
   og_audience: true
+  pinned_in: true
   published_at: true
   read_more: true
   report: true
   search_api_excerpt: true
   share_link: true
+  visit_count: true
diff --git a/config/sync/core.entity_view_display.node.event.numbered_listing.yml b/config/sync/core.entity_view_display.node.event.numbered_listing.yml
index 2eb894bd22546fc8b3b2562bc00a96f459ed1c14..d2805e4879031b19f7c6ab6b0047a5dd14d771c8 100644
--- a/config/sync/core.entity_view_display.node.event.numbered_listing.yml
+++ b/config/sync/core.entity_view_display.node.event.numbered_listing.yml
@@ -94,6 +94,7 @@ content:
     weight: 1
     region: content
 hidden:
+  featured: true
   field_attachment: true
   field_comments: true
   field_event_agenda: true
@@ -115,8 +116,10 @@ hidden:
   langcode: true
   links: true
   og_audience: true
+  pinned_in: true
   published_at: true
   read_more: true
   report: true
   search_api_excerpt: true
   share_link: true
+  visit_count: true
diff --git a/config/sync/core.entity_view_display.node.event.search_result.yml b/config/sync/core.entity_view_display.node.event.search_result.yml
index 1c5dc79409d5d15f57f624b8b33c9f831f878953..110d104279b8c131ca90902254947909bdd340b3 100644
--- a/config/sync/core.entity_view_display.node.event.search_result.yml
+++ b/config/sync/core.entity_view_display.node.event.search_result.yml
@@ -82,6 +82,7 @@ content:
     weight: 2
     region: content
 hidden:
+  featured: true
   field_attachment: true
   field_comments: true
   field_event_agenda: true
@@ -104,7 +105,9 @@ hidden:
   langcode: true
   links: true
   og_audience: true
+  pinned_in: true
   read_more: true
   report: true
   search_api_excerpt: true
   share_link: true
+  visit_count: true
diff --git a/config/sync/core.entity_view_display.node.event.search_result_featured.yml b/config/sync/core.entity_view_display.node.event.search_result_featured.yml
index 1e87a737d0284489bb45dc3f6835690491d2ed4e..2f81c79d462c5dda8974e75ac3f44300d65decc0 100644
--- a/config/sync/core.entity_view_display.node.event.search_result_featured.yml
+++ b/config/sync/core.entity_view_display.node.event.search_result_featured.yml
@@ -95,6 +95,7 @@ content:
     weight: 2
     region: content
 hidden:
+  featured: true
   field_attachment: true
   field_comments: true
   field_event_agenda: true
@@ -116,7 +117,9 @@ hidden:
   langcode: true
   links: true
   og_audience: true
+  pinned_in: true
   read_more: true
   report: true
   search_api_excerpt: true
   share_link: true
+  visit_count: true
diff --git a/config/sync/core.entity_view_display.node.event.view_mode_featured.yml b/config/sync/core.entity_view_display.node.event.view_mode_featured.yml
index ceeb299e6c1c22e98f9e2c9552554b7482ad9c80..0bc3fce4c5fb6c501828076d24a9d5d2250b9f89 100644
--- a/config/sync/core.entity_view_display.node.event.view_mode_featured.yml
+++ b/config/sync/core.entity_view_display.node.event.view_mode_featured.yml
@@ -91,6 +91,7 @@ content:
     weight: 0
     region: content
 hidden:
+  featured: true
   field_attachment: true
   field_comments: true
   field_event_agenda: true
@@ -111,8 +112,10 @@ hidden:
   langcode: true
   links: true
   og_audience: true
+  pinned_in: true
   published_at: true
   read_more: true
   report: true
   search_api_excerpt: true
   share_link: true
+  visit_count: true
diff --git a/config/sync/core.entity_view_display.node.event.view_mode_tile.yml b/config/sync/core.entity_view_display.node.event.view_mode_tile.yml
index 590d1bc2743005c5b0d64c98a4e5be0c3ee67214..228611b9d722e56c326acb16b2ed2c2b7080c09a 100644
--- a/config/sync/core.entity_view_display.node.event.view_mode_tile.yml
+++ b/config/sync/core.entity_view_display.node.event.view_mode_tile.yml
@@ -91,6 +91,7 @@ content:
     weight: 0
     region: content
 hidden:
+  featured: true
   field_attachment: true
   field_comments: true
   field_event_agenda: true
@@ -111,8 +112,10 @@ hidden:
   langcode: true
   links: true
   og_audience: true
+  pinned_in: true
   published_at: true
   read_more: true
   report: true
   search_api_excerpt: true
   share_link: true
+  visit_count: true
diff --git a/config/sync/core.entity_view_display.node.news.dated_listing.yml b/config/sync/core.entity_view_display.node.news.dated_listing.yml
index a3c586c8d674c7acf2cec159950f4d24e0aa085a..97540d64f40dac4db0a0b1bfa49f5891046ad6de 100644
--- a/config/sync/core.entity_view_display.node.news.dated_listing.yml
+++ b/config/sync/core.entity_view_display.node.news.dated_listing.yml
@@ -69,6 +69,7 @@ content:
     weight: 0
     region: content
 hidden:
+  featured: true
   field_attachment: true
   field_comments: true
   field_keywords: true
@@ -83,8 +84,10 @@ hidden:
   langcode: true
   links: true
   og_audience: true
+  pinned_in: true
   publication_date: true
   read_more: true
   report: true
   search_api_excerpt: true
   share_link: true
+  visit_count: true
diff --git a/config/sync/core.entity_view_display.node.news.default.yml b/config/sync/core.entity_view_display.node.news.default.yml
index 259c992debf4d5c102f4107dda6cbce3758a809b..9e9edc28ac1282106b1d42bcb35ae888daa86e38 100644
--- a/config/sync/core.entity_view_display.node.news.default.yml
+++ b/config/sync/core.entity_view_display.node.news.default.yml
@@ -158,6 +158,7 @@ content:
     weight: 4
     region: content
 hidden:
+  featured: true
   field_keywords: true
   field_news_spatial_coverage: true
   field_site_featured: true
@@ -166,6 +167,8 @@ hidden:
   langcode: true
   links: true
   og_audience: true
+  pinned_in: true
   published_at: true
   read_more: true
   search_api_excerpt: true
+  visit_count: true
diff --git a/config/sync/core.entity_view_display.node.news.digest_message.yml b/config/sync/core.entity_view_display.node.news.digest_message.yml
index 11fa48cba6a3fa72e89c376c74a61ad3e6381507..39f0d12aab9491dd0083dad58cbfd1a571fa09d5 100644
--- a/config/sync/core.entity_view_display.node.news.digest_message.yml
+++ b/config/sync/core.entity_view_display.node.news.digest_message.yml
@@ -72,6 +72,7 @@ content:
     weight: 2
     region: content
 hidden:
+  featured: true
   field_attachment: true
   field_comments: true
   field_keywords: true
@@ -85,8 +86,10 @@ hidden:
   langcode: true
   links: true
   og_audience: true
+  pinned_in: true
   published_at: true
   read_more: true
   report: true
   search_api_excerpt: true
   share_link: true
+  visit_count: true
diff --git a/config/sync/core.entity_view_display.node.news.explore_item.yml b/config/sync/core.entity_view_display.node.news.explore_item.yml
index e0105d26505e4b9627bb35cd4ba80179833b3395..51cafac3f1c83438cde81953925dc918ad356039 100644
--- a/config/sync/core.entity_view_display.node.news.explore_item.yml
+++ b/config/sync/core.entity_view_display.node.news.explore_item.yml
@@ -171,6 +171,7 @@ content:
     weight: 2
     region: content
 hidden:
+  featured: true
   field_attachment: true
   field_comments: true
   field_keywords: true
@@ -186,6 +187,8 @@ hidden:
   langcode: true
   links: true
   og_audience: true
+  pinned_in: true
   report: true
   search_api_excerpt: true
   share_link: true
+  visit_count: true
diff --git a/config/sync/core.entity_view_display.node.news.highlighted.yml b/config/sync/core.entity_view_display.node.news.highlighted.yml
index 2a9141d2b155546f62d1aabc0dffce54b95db553..d160044f4e36be33be65af001aced135c54027f7 100644
--- a/config/sync/core.entity_view_display.node.news.highlighted.yml
+++ b/config/sync/core.entity_view_display.node.news.highlighted.yml
@@ -94,6 +94,7 @@ content:
     weight: 1
     region: content
 hidden:
+  featured: true
   field_attachment: true
   field_comments: true
   field_keywords: true
@@ -107,8 +108,10 @@ hidden:
   langcode: true
   links: true
   og_audience: true
+  pinned_in: true
   published_at: true
   read_more: true
   report: true
   search_api_excerpt: true
   share_link: true
+  visit_count: true
diff --git a/config/sync/core.entity_view_display.node.news.moderation.yml b/config/sync/core.entity_view_display.node.news.moderation.yml
index fa223d6c70aca5939fa37c5f77f97059e80b3240..fed9847b8f6502803033a676eadaa4253dd9ffc7 100644
--- a/config/sync/core.entity_view_display.node.news.moderation.yml
+++ b/config/sync/core.entity_view_display.node.news.moderation.yml
@@ -59,6 +59,7 @@ content:
     weight: 1
     region: content
 hidden:
+  featured: true
   field_attachment: true
   field_comments: true
   field_keywords: true
@@ -73,8 +74,10 @@ hidden:
   langcode: true
   links: true
   og_audience: true
+  pinned_in: true
   published_at: true
   read_more: true
   report: true
   search_api_excerpt: true
   share_link: true
+  visit_count: true
diff --git a/config/sync/core.entity_view_display.node.news.numbered_listing.yml b/config/sync/core.entity_view_display.node.news.numbered_listing.yml
index 68effab5f7148537918b09ec32f4bb7579a127b7..9f4d4453d238dd51cf754a088e0e38934b4ed4ff 100644
--- a/config/sync/core.entity_view_display.node.news.numbered_listing.yml
+++ b/config/sync/core.entity_view_display.node.news.numbered_listing.yml
@@ -104,6 +104,7 @@ content:
     weight: 1
     region: content
 hidden:
+  featured: true
   field_attachment: true
   field_comments: true
   field_keywords: true
@@ -117,8 +118,10 @@ hidden:
   langcode: true
   links: true
   og_audience: true
+  pinned_in: true
   published_at: true
   read_more: true
   report: true
   search_api_excerpt: true
   share_link: true
+  visit_count: true
diff --git a/config/sync/core.entity_view_display.node.news.search_result.yml b/config/sync/core.entity_view_display.node.news.search_result.yml
index bc3f8aaf234b7c43c25242f5eb2ef8de570263ad..4020d9a7681f1cdfd43086032217f4facd587d7a 100644
--- a/config/sync/core.entity_view_display.node.news.search_result.yml
+++ b/config/sync/core.entity_view_display.node.news.search_result.yml
@@ -93,6 +93,7 @@ content:
     weight: 2
     region: content
 hidden:
+  featured: true
   field_attachment: true
   field_comments: true
   field_keywords: true
@@ -107,7 +108,9 @@ hidden:
   langcode: true
   links: true
   og_audience: true
+  pinned_in: true
   read_more: true
   report: true
   search_api_excerpt: true
   share_link: true
+  visit_count: true
diff --git a/config/sync/core.entity_view_display.node.news.search_result_featured.yml b/config/sync/core.entity_view_display.node.news.search_result_featured.yml
index 4e2693a66de77977aa404436fe0f7e708c676813..c9270424220fcd6c02796d0d87a4389c346e29df 100644
--- a/config/sync/core.entity_view_display.node.news.search_result_featured.yml
+++ b/config/sync/core.entity_view_display.node.news.search_result_featured.yml
@@ -106,6 +106,7 @@ content:
     weight: 2
     region: content
 hidden:
+  featured: true
   field_attachment: true
   field_comments: true
   field_keywords: true
@@ -119,7 +120,9 @@ hidden:
   langcode: true
   links: true
   og_audience: true
+  pinned_in: true
   read_more: true
   report: true
   search_api_excerpt: true
   share_link: true
+  visit_count: true
diff --git a/config/sync/core.entity_view_display.node.news.view_mode_featured.yml b/config/sync/core.entity_view_display.node.news.view_mode_featured.yml
index 215691b56b7aa21aaea19d031f09dcb2bafa74ec..bb20d20d942a56c873caad1101c2254202751fc3 100644
--- a/config/sync/core.entity_view_display.node.news.view_mode_featured.yml
+++ b/config/sync/core.entity_view_display.node.news.view_mode_featured.yml
@@ -61,6 +61,7 @@ content:
     weight: 1
     region: content
 hidden:
+  featured: true
   field_attachment: true
   field_comments: true
   field_news_headline: true
@@ -75,8 +76,10 @@ hidden:
   langcode: true
   links: true
   og_audience: true
+  pinned_in: true
   published_at: true
   read_more: true
   report: true
   search_api_excerpt: true
   share_link: true
+  visit_count: true
diff --git a/config/sync/core.entity_view_display.node.news.view_mode_tile.yml b/config/sync/core.entity_view_display.node.news.view_mode_tile.yml
index ed0a2a8c71ec4c50234754f51d40a121e126be01..c52b7f7a0e6e250ec961a644a18f0e494c48284f 100644
--- a/config/sync/core.entity_view_display.node.news.view_mode_tile.yml
+++ b/config/sync/core.entity_view_display.node.news.view_mode_tile.yml
@@ -75,6 +75,7 @@ content:
     weight: 0
     region: content
 hidden:
+  featured: true
   field_attachment: true
   field_comments: true
   field_news_headline: true
@@ -88,8 +89,10 @@ hidden:
   langcode: true
   links: true
   og_audience: true
+  pinned_in: true
   published_at: true
   read_more: true
   report: true
   search_api_excerpt: true
   share_link: true
+  visit_count: true
diff --git a/config/sync/core.entity_view_display.rdf_entity.asset_distribution.compact.yml b/config/sync/core.entity_view_display.rdf_entity.asset_distribution.compact.yml
index cddd33908b3219e634550be06617190104815b6e..c4ed3f74b25b139180280b8f220722962a792bd3 100644
--- a/config/sync/core.entity_view_display.rdf_entity.asset_distribution.compact.yml
+++ b/config/sync/core.entity_view_display.rdf_entity.asset_distribution.compact.yml
@@ -64,6 +64,7 @@ content:
 hidden:
   changed: true
   created: true
+  download_count: true
   field_ad_description: true
   field_ad_format: true
   field_ad_gitb_compliant: true
diff --git a/config/sync/core.entity_view_display.rdf_entity.asset_distribution.default.yml b/config/sync/core.entity_view_display.rdf_entity.asset_distribution.default.yml
index 8fd974898aed3f5670772fc86450ae16223cfae1..38511d0c0a0317cc9da93500a4b04b978fc2ba94 100644
--- a/config/sync/core.entity_view_display.rdf_entity.asset_distribution.default.yml
+++ b/config/sync/core.entity_view_display.rdf_entity.asset_distribution.default.yml
@@ -131,6 +131,7 @@ content:
 hidden:
   changed: true
   created: true
+  download_count: true
   field_ad_creation_date: true
   field_ad_gitb_compliant: true
   field_ad_modification_date: true
diff --git a/config/sync/core.entity_view_display.rdf_entity.asset_distribution.digest_message.yml b/config/sync/core.entity_view_display.rdf_entity.asset_distribution.digest_message.yml
index 53e794481d696e4e8f67885de23e4d194c011c44..b1ef2460eb6427f08e9155786357049316f7f6d8 100644
--- a/config/sync/core.entity_view_display.rdf_entity.asset_distribution.digest_message.yml
+++ b/config/sync/core.entity_view_display.rdf_entity.asset_distribution.digest_message.yml
@@ -92,6 +92,7 @@ content:
     region: content
 hidden:
   changed: true
+  download_count: true
   field_ad_access_url: true
   field_ad_creation_date: true
   field_ad_file_size: true
diff --git a/config/sync/core.entity_view_display.rdf_entity.asset_distribution.search_result.yml b/config/sync/core.entity_view_display.rdf_entity.asset_distribution.search_result.yml
index 464e52476a3bbcde7f6e19c4b1aceccd8e23746c..865b2cdb148b16412e3f52fe5a546edd3d9a858e 100644
--- a/config/sync/core.entity_view_display.rdf_entity.asset_distribution.search_result.yml
+++ b/config/sync/core.entity_view_display.rdf_entity.asset_distribution.search_result.yml
@@ -136,6 +136,7 @@ content:
 hidden:
   changed: true
   created: true
+  download_count: true
   field_ad_creation_date: true
   field_ad_gitb_compliant: true
   field_ad_modification_date: true
diff --git a/config/sync/core.entity_view_display.rdf_entity.asset_distribution.search_result_featured.yml b/config/sync/core.entity_view_display.rdf_entity.asset_distribution.search_result_featured.yml
index 4bf756f0ffe35f751be443236ea54aec9c29e8f8..e04b774677af4b49bcc30ef1d10d4540f41700ed 100644
--- a/config/sync/core.entity_view_display.rdf_entity.asset_distribution.search_result_featured.yml
+++ b/config/sync/core.entity_view_display.rdf_entity.asset_distribution.search_result_featured.yml
@@ -136,6 +136,7 @@ content:
 hidden:
   changed: true
   created: true
+  download_count: true
   field_ad_creation_date: true
   field_ad_gitb_compliant: true
   field_ad_modification_date: true
diff --git a/config/sync/core.entity_view_display.rdf_entity.asset_distribution.view_mode_featured.yml b/config/sync/core.entity_view_display.rdf_entity.asset_distribution.view_mode_featured.yml
index 9becc93e1cb53c39b364100976657084598b5a58..521cc3be8e1b83311eed4f2c8fd7fb669b059f0c 100644
--- a/config/sync/core.entity_view_display.rdf_entity.asset_distribution.view_mode_featured.yml
+++ b/config/sync/core.entity_view_display.rdf_entity.asset_distribution.view_mode_featured.yml
@@ -64,6 +64,7 @@ content:
 hidden:
   changed: true
   created: true
+  download_count: true
   field_ad_description: true
   field_ad_format: true
   field_ad_gitb_compliant: true
diff --git a/config/sync/core.entity_view_display.rdf_entity.asset_distribution.view_mode_tile.yml b/config/sync/core.entity_view_display.rdf_entity.asset_distribution.view_mode_tile.yml
index 62ca5e746c8aaa043d6454086f7ec3b2f5f47ef6..50fde1d9d0a21c1567a6b203abf5da8cbd68dfac 100644
--- a/config/sync/core.entity_view_display.rdf_entity.asset_distribution.view_mode_tile.yml
+++ b/config/sync/core.entity_view_display.rdf_entity.asset_distribution.view_mode_tile.yml
@@ -64,6 +64,7 @@ content:
 hidden:
   changed: true
   created: true
+  download_count: true
   field_ad_description: true
   field_ad_format: true
   field_ad_gitb_compliant: true
diff --git a/config/sync/core.entity_view_display.rdf_entity.collection.about.yml b/config/sync/core.entity_view_display.rdf_entity.collection.about.yml
index dc1022a213905be217f37d6e8e44190d63c5191f..7e141027c0859a97b2b34e768bea0b13f24f911b 100644
--- a/config/sync/core.entity_view_display.rdf_entity.collection.about.yml
+++ b/config/sync/core.entity_view_display.rdf_entity.collection.about.yml
@@ -161,6 +161,7 @@ content:
 hidden:
   changed: true
   created: true
+  featured: true
   field_ar_affiliates: true
   field_ar_banner: true
   field_ar_logo: true
@@ -182,4 +183,5 @@ hidden:
   rdf_entity_field_collection_content_top: true
   read_more: true
   search_api_excerpt: true
+  settings: true
   solutions: true
diff --git a/config/sync/core.entity_view_display.rdf_entity.collection.compact.yml b/config/sync/core.entity_view_display.rdf_entity.collection.compact.yml
index cf22ded51eaec9d3e9f552403ac98b59b728cb1e..983622978269f5356b7e0bbd1ab1b6688d6825dd 100644
--- a/config/sync/core.entity_view_display.rdf_entity.collection.compact.yml
+++ b/config/sync/core.entity_view_display.rdf_entity.collection.compact.yml
@@ -60,6 +60,7 @@ content:
 hidden:
   changed: true
   created: true
+  featured: true
   field_ar_abstract: true
   field_ar_access_url: true
   field_ar_affiliates: true
@@ -87,4 +88,5 @@ hidden:
   rdf_entity_field_collection_content_top: true
   read_more: true
   search_api_excerpt: true
+  settings: true
   solutions: true
diff --git a/config/sync/core.entity_view_display.rdf_entity.collection.default.yml b/config/sync/core.entity_view_display.rdf_entity.collection.default.yml
index 195af87fcafd8697ac5d6c47c220dbf6dc167efc..6ae233f39421992b30d2f70bc157852845de3b12 100644
--- a/config/sync/core.entity_view_display.rdf_entity.collection.default.yml
+++ b/config/sync/core.entity_view_display.rdf_entity.collection.default.yml
@@ -130,6 +130,7 @@ content:
 hidden:
   changed: true
   created: true
+  featured: true
   field_ar_access_url: true
   field_ar_affiliates: true
   field_ar_banner: true
@@ -152,4 +153,5 @@ hidden:
   members: true
   og_group: true
   search_api_excerpt: true
+  settings: true
   solutions: true
diff --git a/config/sync/core.entity_view_display.rdf_entity.collection.digest_message_header.yml b/config/sync/core.entity_view_display.rdf_entity.collection.digest_message_header.yml
index e3a07522aeb063358fb80ea26aadbc31272452a2..23cd285e1adf4ebdb4236bf65da3a9113d2eb617 100644
--- a/config/sync/core.entity_view_display.rdf_entity.collection.digest_message_header.yml
+++ b/config/sync/core.entity_view_display.rdf_entity.collection.digest_message_header.yml
@@ -45,6 +45,7 @@ content:
 hidden:
   changed: true
   created: true
+  featured: true
   field_ar_abstract: true
   field_ar_access_url: true
   field_ar_affiliates: true
@@ -73,4 +74,5 @@ hidden:
   rdf_entity_field_collection_content_top: true
   read_more: true
   search_api_excerpt: true
+  settings: true
   solutions: true
diff --git a/config/sync/core.entity_view_display.rdf_entity.collection.explore_item.yml b/config/sync/core.entity_view_display.rdf_entity.collection.explore_item.yml
index b4b453b554dfede1fc88de009899e77fdc513553..e48945677d738a0c40a02a49b14d66d58717f715 100644
--- a/config/sync/core.entity_view_display.rdf_entity.collection.explore_item.yml
+++ b/config/sync/core.entity_view_display.rdf_entity.collection.explore_item.yml
@@ -199,6 +199,7 @@ content:
     region: content
 hidden:
   changed: true
+  featured: true
   field_ar_abstract: true
   field_ar_access_url: true
   field_ar_affiliates: true
@@ -225,4 +226,5 @@ hidden:
   rdf_entity_field_collection_content_inline_facets: true
   rdf_entity_field_collection_content_top: true
   search_api_excerpt: true
+  settings: true
   solutions: true
diff --git a/config/sync/core.entity_view_display.rdf_entity.collection.group_header.yml b/config/sync/core.entity_view_display.rdf_entity.collection.group_header.yml
index 9036df731cb77d7eac52382741612628d4768aad..fe33d974fff07a621e12fabedd29e1f50de9d1ff 100644
--- a/config/sync/core.entity_view_display.rdf_entity.collection.group_header.yml
+++ b/config/sync/core.entity_view_display.rdf_entity.collection.group_header.yml
@@ -100,6 +100,7 @@ content:
 hidden:
   changed: true
   created: true
+  featured: true
   field_ar_abstract: true
   field_ar_access_url: true
   field_ar_affiliates: true
@@ -123,3 +124,4 @@ hidden:
   rdf_entity_field_collection_content_top: true
   read_more: true
   search_api_excerpt: true
+  settings: true
diff --git a/config/sync/core.entity_view_display.rdf_entity.collection.rdf_draft.yml b/config/sync/core.entity_view_display.rdf_entity.collection.rdf_draft.yml
index ce1ad1ee15bab77caa635133d7dfa4129dab8d94..0d42e77411ada3f08a5a0715f5428253cc79d552 100644
--- a/config/sync/core.entity_view_display.rdf_entity.collection.rdf_draft.yml
+++ b/config/sync/core.entity_view_display.rdf_entity.collection.rdf_draft.yml
@@ -138,6 +138,7 @@ content:
 hidden:
   changed: true
   created: true
+  featured: true
   field_ar_affiliates: true
   field_ar_banner: true
   field_ar_logo: true
@@ -155,4 +156,5 @@ hidden:
   rdf_entity_field_collection_content_top: true
   read_more: true
   search_api_excerpt: true
+  settings: true
   solutions: true
diff --git a/config/sync/core.entity_view_display.rdf_entity.collection.search_result.yml b/config/sync/core.entity_view_display.rdf_entity.collection.search_result.yml
index 231d182f12dd4a357e464227f200749ca9ff9515..720e92d03c4a669555ab0e620e18d156bb274615 100644
--- a/config/sync/core.entity_view_display.rdf_entity.collection.search_result.yml
+++ b/config/sync/core.entity_view_display.rdf_entity.collection.search_result.yml
@@ -120,6 +120,7 @@ content:
     region: content
 hidden:
   changed: true
+  featured: true
   field_ar_abstract: true
   field_ar_access_url: true
   field_ar_affiliates: true
@@ -145,4 +146,5 @@ hidden:
   rdf_entity_field_collection_content_top: true
   read_more: true
   search_api_excerpt: true
+  settings: true
   solutions: true
diff --git a/config/sync/core.entity_view_display.rdf_entity.collection.search_result_featured.yml b/config/sync/core.entity_view_display.rdf_entity.collection.search_result_featured.yml
index bd42028b776e46816162d5c888abbc108eecee20..aa6bff3bf481e774f527f4a9503e1be1c76c8bd0 100644
--- a/config/sync/core.entity_view_display.rdf_entity.collection.search_result_featured.yml
+++ b/config/sync/core.entity_view_display.rdf_entity.collection.search_result_featured.yml
@@ -133,6 +133,7 @@ content:
     region: content
 hidden:
   changed: true
+  featured: true
   field_ar_abstract: true
   field_ar_access_url: true
   field_ar_affiliates: true
@@ -157,4 +158,5 @@ hidden:
   rdf_entity_field_collection_content_top: true
   read_more: true
   search_api_excerpt: true
+  settings: true
   solutions: true
diff --git a/config/sync/core.entity_view_display.rdf_entity.collection.view_mode_featured.yml b/config/sync/core.entity_view_display.rdf_entity.collection.view_mode_featured.yml
index 9cd91f87734cbff0e00fb3150c8d4c13c9c8d5cd..4aff0d0908b9d1d9a507affd7cc2323561248f28 100644
--- a/config/sync/core.entity_view_display.rdf_entity.collection.view_mode_featured.yml
+++ b/config/sync/core.entity_view_display.rdf_entity.collection.view_mode_featured.yml
@@ -82,6 +82,7 @@ content:
 hidden:
   changed: true
   created: true
+  featured: true
   field_ar_access_url: true
   field_ar_affiliates: true
   field_ar_banner: true
@@ -107,4 +108,5 @@ hidden:
   rdf_entity_field_collection_content_top: true
   read_more: true
   search_api_excerpt: true
+  settings: true
   solutions: true
diff --git a/config/sync/core.entity_view_display.rdf_entity.collection.view_mode_tile.yml b/config/sync/core.entity_view_display.rdf_entity.collection.view_mode_tile.yml
index 5de65b2dfff9d3e619ab0f19381c302c61bf5b99..82fd6e451e17183beb7c2406a8f51506499464da 100644
--- a/config/sync/core.entity_view_display.rdf_entity.collection.view_mode_tile.yml
+++ b/config/sync/core.entity_view_display.rdf_entity.collection.view_mode_tile.yml
@@ -82,6 +82,7 @@ content:
 hidden:
   changed: true
   created: true
+  featured: true
   field_ar_access_url: true
   field_ar_affiliates: true
   field_ar_banner: true
@@ -107,4 +108,5 @@ hidden:
   rdf_entity_field_collection_content_top: true
   read_more: true
   search_api_excerpt: true
+  settings: true
   solutions: true
diff --git a/config/sync/core.entity_view_display.rdf_entity.solution.about.yml b/config/sync/core.entity_view_display.rdf_entity.solution.about.yml
index 6999fdc94bb8c00fb2915f51149ed0aee37b433b..0c57315d9f170e70c8235a8de54269c3d25b9035 100644
--- a/config/sync/core.entity_view_display.rdf_entity.solution.about.yml
+++ b/config/sync/core.entity_view_display.rdf_entity.solution.about.yml
@@ -350,6 +350,8 @@ hidden:
   collections: true
   created: true
   download_total: true
+  eif_perspective: true
+  featured: true
   field_is_affiliations_requests: true
   field_is_banner: true
   field_is_content: true
@@ -378,9 +380,11 @@ hidden:
   label: true
   langcode: true
   og_group: true
+  pinned_in: true
   rdf_entity_field_is_content_inline_facets: true
   rdf_entity_field_is_content_top: true
   read_more: true
+  related_solution: true
   related_solutions: true
   releases_overview: true
   search_api_excerpt: true
diff --git a/config/sync/core.entity_view_display.rdf_entity.solution.compact.yml b/config/sync/core.entity_view_display.rdf_entity.solution.compact.yml
index 251a57d847943e3c72273bc9d4d2860316500a26..4432a56869edf2c61ab1c0c0b8687f48c8366040 100644
--- a/config/sync/core.entity_view_display.rdf_entity.solution.compact.yml
+++ b/config/sync/core.entity_view_display.rdf_entity.solution.compact.yml
@@ -101,6 +101,8 @@ hidden:
   collections: true
   created: true
   download_total: true
+  eif_perspective: true
+  featured: true
   field_is_actor: true
   field_is_affiliations_requests: true
   field_is_banner: true
@@ -143,9 +145,11 @@ hidden:
   field_topic: true
   langcode: true
   og_group: true
+  pinned_in: true
   rdf_entity_field_is_content_inline_facets: true
   rdf_entity_field_is_content_top: true
   read_more: true
+  related_solution: true
   related_solutions: true
   releases_overview: true
   search_api_excerpt: true
diff --git a/config/sync/core.entity_view_display.rdf_entity.solution.default.yml b/config/sync/core.entity_view_display.rdf_entity.solution.default.yml
index 428b01d3559f152efd4b2e6402d95e27e9931c5e..9de28c27013b6de7da0c8666727f8fe4aa633bc9 100644
--- a/config/sync/core.entity_view_display.rdf_entity.solution.default.yml
+++ b/config/sync/core.entity_view_display.rdf_entity.solution.default.yml
@@ -140,6 +140,8 @@ hidden:
   collections: true
   created: true
   download_total: true
+  eif_perspective: true
+  featured: true
   field_is_actor: true
   field_is_affiliations_requests: true
   field_is_banner: true
@@ -181,6 +183,8 @@ hidden:
   label: true
   langcode: true
   og_group: true
+  pinned_in: true
+  related_solution: true
   releases_overview: true
   search_api_excerpt: true
   share_link: true
diff --git a/config/sync/core.entity_view_display.rdf_entity.solution.digest_message.yml b/config/sync/core.entity_view_display.rdf_entity.solution.digest_message.yml
index 26b019000d9faa48125fb3e21c67bea707ffd68a..95e3eb7ea0f2c163decd4404e387d73d51cefdd0 100644
--- a/config/sync/core.entity_view_display.rdf_entity.solution.digest_message.yml
+++ b/config/sync/core.entity_view_display.rdf_entity.solution.digest_message.yml
@@ -91,6 +91,8 @@ hidden:
   collections: true
   created: true
   download_total: true
+  eif_perspective: true
+  featured: true
   field_is_actor: true
   field_is_affiliations_requests: true
   field_is_banner: true
@@ -133,9 +135,11 @@ hidden:
   field_topic: true
   langcode: true
   og_group: true
+  pinned_in: true
   rdf_entity_field_is_content_inline_facets: true
   rdf_entity_field_is_content_top: true
   read_more: true
+  related_solution: true
   related_solutions: true
   releases_overview: true
   search_api_excerpt: true
diff --git a/config/sync/core.entity_view_display.rdf_entity.solution.digest_message_header.yml b/config/sync/core.entity_view_display.rdf_entity.solution.digest_message_header.yml
index 7c9621216aa3ed5c5536eafd56d5ed0688b76d95..88eca7b31d49168d9f1cc153bc517019b3998714 100644
--- a/config/sync/core.entity_view_display.rdf_entity.solution.digest_message_header.yml
+++ b/config/sync/core.entity_view_display.rdf_entity.solution.digest_message_header.yml
@@ -66,6 +66,8 @@ hidden:
   collections: true
   created: true
   download_total: true
+  eif_perspective: true
+  featured: true
   field_is_actor: true
   field_is_affiliations_requests: true
   field_is_banner: true
@@ -109,9 +111,11 @@ hidden:
   field_topic: true
   langcode: true
   og_group: true
+  pinned_in: true
   rdf_entity_field_is_content_inline_facets: true
   rdf_entity_field_is_content_top: true
   read_more: true
+  related_solution: true
   related_solutions: true
   releases_overview: true
   search_api_excerpt: true
diff --git a/config/sync/core.entity_view_display.rdf_entity.solution.eif_perspective.yml b/config/sync/core.entity_view_display.rdf_entity.solution.eif_perspective.yml
new file mode 100644
index 0000000000000000000000000000000000000000..92d2bd44da4fba14c63b3de350be626634c92575
--- /dev/null
+++ b/config/sync/core.entity_view_display.rdf_entity.solution.eif_perspective.yml
@@ -0,0 +1,226 @@
+uuid: 8b63515e-9b50-4d1d-9235-1120a065c6b1
+langcode: en
+status: true
+dependencies:
+  config:
+    - core.entity_view_mode.rdf_entity.eif_perspective
+    - field.field.rdf_entity.solution.field_is_actor
+    - field.field.rdf_entity.solution.field_is_affiliations_requests
+    - field.field.rdf_entity.solution.field_is_banner
+    - field.field.rdf_entity.solution.field_is_business_process
+    - field.field.rdf_entity.solution.field_is_contact_information
+    - field.field.rdf_entity.solution.field_is_content
+    - field.field.rdf_entity.solution.field_is_content_creation
+    - field.field.rdf_entity.solution.field_is_description
+    - field.field.rdf_entity.solution.field_is_distribution
+    - field.field.rdf_entity.solution.field_is_documentation
+    - field.field.rdf_entity.solution.field_is_eif_category
+    - field.field.rdf_entity.solution.field_is_eif_recommendation
+    - field.field.rdf_entity.solution.field_is_has_version
+    - field.field.rdf_entity.solution.field_is_included_asset
+    - field.field.rdf_entity.solution.field_is_issue_tracker
+    - field.field.rdf_entity.solution.field_is_landing_page
+    - field.field.rdf_entity.solution.field_is_language
+    - field.field.rdf_entity.solution.field_is_logo
+    - field.field.rdf_entity.solution.field_is_metrics_page
+    - field.field.rdf_entity.solution.field_is_moderation
+    - field.field.rdf_entity.solution.field_is_owner
+    - field.field.rdf_entity.solution.field_is_product_type
+    - field.field.rdf_entity.solution.field_is_related_solutions
+    - field.field.rdf_entity.solution.field_is_shared_in
+    - field.field.rdf_entity.solution.field_is_show_eira_related
+    - field.field.rdf_entity.solution.field_is_solution_type
+    - field.field.rdf_entity.solution.field_is_source_code_repository
+    - field.field.rdf_entity.solution.field_is_standardization_level
+    - field.field.rdf_entity.solution.field_is_state
+    - field.field.rdf_entity.solution.field_is_test_resource_type
+    - field.field.rdf_entity.solution.field_is_translation
+    - field.field.rdf_entity.solution.field_is_version
+    - field.field.rdf_entity.solution.field_is_webdav_creation
+    - field.field.rdf_entity.solution.field_is_webdav_url
+    - field.field.rdf_entity.solution.field_is_wiki
+    - field.field.rdf_entity.solution.field_keywords
+    - field.field.rdf_entity.solution.field_short_id
+    - field.field.rdf_entity.solution.field_site_featured
+    - field.field.rdf_entity.solution.field_spatial_coverage
+    - field.field.rdf_entity.solution.field_status
+    - field.field.rdf_entity.solution.field_topic
+    - rdf_entity.rdfentity.solution
+    - responsive_image.styles.highlighted_content
+  module:
+    - field_delimiter
+    - field_formatter_range
+    - field_group
+    - layout_builder
+    - responsive_image
+    - smart_trim
+    - template_suggestion
+    - user
+third_party_settings:
+  field_group:
+    group_solution_abstract_wrapper:
+      children: {  }
+      label: 'Abstract wrapper'
+      parent_name: ''
+      region: hidden
+      weight: 60
+      format_type: html_element
+      format_settings:
+        classes: ''
+        id: ''
+        element: div
+        show_label: false
+        label_element: h3
+        attributes: ''
+        effect: none
+        speed: fast
+  layout_builder:
+    enabled: false
+    allow_custom: false
+id: rdf_entity.solution.eif_perspective
+targetEntityType: rdf_entity
+bundle: solution
+mode: eif_perspective
+content:
+  eif_perspective:
+    type: entity_reference_entity_view
+    label: hidden
+    settings:
+      view_mode: eif_perspective
+      link: false
+    third_party_settings:
+      template_suggestion:
+        template_suggestion: ''
+    weight: 6
+    region: content
+  field_is_description:
+    type: smart_trim
+    label: hidden
+    settings:
+      trim_length: 500
+      trim_type: chars
+      trim_suffix: …
+      wrap_output: false
+      wrap_class: trimmed
+      more_link: false
+      more_class: more-link
+      more_text: More
+      summary_handler: full
+      trim_options:
+        text: true
+        trim_zero: false
+    third_party_settings:
+      template_suggestion:
+        template_suggestion: p_wrapper
+    weight: 2
+    region: content
+  field_is_logo:
+    type: responsive_image
+    label: hidden
+    settings:
+      responsive_image_style: highlighted_content
+      image_link: ''
+    third_party_settings:
+      template_suggestion:
+        template_suggestion: ''
+    weight: 5
+    region: content
+  field_is_owner:
+    type: entity_reference_label
+    label: hidden
+    settings:
+      link: false
+    third_party_settings:
+      field_delimiter:
+        delimiter: ''
+      field_formatter_range:
+        order: 0
+        limit: 0
+        offset: 0
+      template_suggestion:
+        template_suggestion: ''
+    weight: 1
+    region: content
+  field_is_solution_type:
+    type: entity_reference_label
+    label: hidden
+    settings:
+      link: false
+    third_party_settings:
+      field_delimiter:
+        delimiter: ''
+      field_formatter_range:
+        order: 0
+        limit: 0
+        offset: 0
+      template_suggestion:
+        template_suggestion: ''
+    weight: 3
+    region: content
+  label:
+    type: string
+    label: hidden
+    settings:
+      link_to_entity: false
+    third_party_settings: {  }
+    weight: 0
+    region: content
+  read_more:
+    settings: {  }
+    third_party_settings: {  }
+    weight: 4
+    region: content
+hidden:
+  changed: true
+  collections: true
+  created: true
+  download_total: true
+  featured: true
+  field_is_actor: true
+  field_is_affiliations_requests: true
+  field_is_banner: true
+  field_is_business_process: true
+  field_is_contact_information: true
+  field_is_content: true
+  field_is_content_creation: true
+  field_is_distribution: true
+  field_is_documentation: true
+  field_is_eif_category: true
+  field_is_eif_recommendation: true
+  field_is_has_version: true
+  field_is_included_asset: true
+  field_is_issue_tracker: true
+  field_is_landing_page: true
+  field_is_language: true
+  field_is_metrics_page: true
+  field_is_moderation: true
+  field_is_product_type: true
+  field_is_related_solutions: true
+  field_is_shared_in: true
+  field_is_show_eira_related: true
+  field_is_source_code_repository: true
+  field_is_standardization_level: true
+  field_is_state: true
+  field_is_test_resource_type: true
+  field_is_translation: true
+  field_is_version: true
+  field_is_webdav_creation: true
+  field_is_webdav_url: true
+  field_is_wiki: true
+  field_keywords: true
+  field_short_id: true
+  field_site_featured: true
+  field_spatial_coverage: true
+  field_status: true
+  field_topic: true
+  langcode: true
+  og_group: true
+  pinned_in: true
+  rdf_entity_field_is_content_inline_facets: true
+  rdf_entity_field_is_content_top: true
+  related_solution: true
+  related_solutions: true
+  releases_overview: true
+  search_api_excerpt: true
+  share_link: true
+  solution_subscribe: true
diff --git a/config/sync/core.entity_view_display.rdf_entity.solution.explore_item.yml b/config/sync/core.entity_view_display.rdf_entity.solution.explore_item.yml
index f8bc4a550e18dcd5ea0d26e6f9de2eca977f7bdc..89abd59f16b3c66a971e27baa6616fd2e42d3192 100644
--- a/config/sync/core.entity_view_display.rdf_entity.solution.explore_item.yml
+++ b/config/sync/core.entity_view_display.rdf_entity.solution.explore_item.yml
@@ -224,6 +224,8 @@ hidden:
   collections: true
   created: true
   download_total: true
+  eif_perspective: true
+  featured: true
   field_is_actor: true
   field_is_affiliations_requests: true
   field_is_banner: true
@@ -266,8 +268,10 @@ hidden:
   field_topic: true
   langcode: true
   og_group: true
+  pinned_in: true
   rdf_entity_field_is_content_inline_facets: true
   rdf_entity_field_is_content_top: true
+  related_solution: true
   related_solutions: true
   releases_overview: true
   search_api_excerpt: true
diff --git a/config/sync/core.entity_view_display.rdf_entity.solution.group_header.yml b/config/sync/core.entity_view_display.rdf_entity.solution.group_header.yml
index 3938a1bbdc182e625653a0aee8ee293d66fab4d6..8603af2ed47e01a2dcaeb825111ac5401046e14e 100644
--- a/config/sync/core.entity_view_display.rdf_entity.solution.group_header.yml
+++ b/config/sync/core.entity_view_display.rdf_entity.solution.group_header.yml
@@ -125,6 +125,8 @@ content:
 hidden:
   changed: true
   created: true
+  eif_perspective: true
+  featured: true
   field_is_actor: true
   field_is_affiliations_requests: true
   field_is_business_process: true
@@ -165,9 +167,11 @@ hidden:
   field_status: true
   langcode: true
   og_group: true
+  pinned_in: true
   rdf_entity_field_is_content_inline_facets: true
   rdf_entity_field_is_content_top: true
   read_more: true
+  related_solution: true
   related_solutions: true
   search_api_excerpt: true
   share_link: true
diff --git a/config/sync/core.entity_view_display.rdf_entity.solution.highlighted.yml b/config/sync/core.entity_view_display.rdf_entity.solution.highlighted.yml
index f7aaa9387d052dec0d72505f195de64f83f497e7..61a41269cdf8f85c182fc40560b22764eeb3cc16 100644
--- a/config/sync/core.entity_view_display.rdf_entity.solution.highlighted.yml
+++ b/config/sync/core.entity_view_display.rdf_entity.solution.highlighted.yml
@@ -148,6 +148,8 @@ hidden:
   collections: true
   created: true
   download_total: true
+  eif_perspective: true
+  featured: true
   field_is_actor: true
   field_is_affiliations_requests: true
   field_is_banner: true
@@ -187,9 +189,11 @@ hidden:
   field_status: true
   langcode: true
   og_group: true
+  pinned_in: true
   rdf_entity_field_is_content_inline_facets: true
   rdf_entity_field_is_content_top: true
   read_more: true
+  related_solution: true
   related_solutions: true
   releases_overview: true
   search_api_excerpt: true
diff --git a/config/sync/core.entity_view_display.rdf_entity.solution.rdf_draft.yml b/config/sync/core.entity_view_display.rdf_entity.solution.rdf_draft.yml
index 33af3e519a148c5bfed10134c2e5a151b3c62ee8..72d1afdb046270be7b47f4df980bcf7231db3e7b 100644
--- a/config/sync/core.entity_view_display.rdf_entity.solution.rdf_draft.yml
+++ b/config/sync/core.entity_view_display.rdf_entity.solution.rdf_draft.yml
@@ -312,6 +312,8 @@ hidden:
   collections: true
   created: true
   download_total: true
+  eif_perspective: true
+  featured: true
   field_is_affiliations_requests: true
   field_is_banner: true
   field_is_content: true
@@ -328,9 +330,11 @@ hidden:
   field_site_featured: true
   langcode: true
   og_group: true
+  pinned_in: true
   rdf_entity_field_is_content_inline_facets: true
   rdf_entity_field_is_content_top: true
   read_more: true
+  related_solution: true
   related_solutions: true
   releases_overview: true
   search_api_excerpt: true
diff --git a/config/sync/core.entity_view_display.rdf_entity.solution.search_result.yml b/config/sync/core.entity_view_display.rdf_entity.solution.search_result.yml
index ead99d3a69f242f06ad315abb8095a2ba41a91cd..83fd397efdb3c5fea7a346a9d364d068213a3d03 100644
--- a/config/sync/core.entity_view_display.rdf_entity.solution.search_result.yml
+++ b/config/sync/core.entity_view_display.rdf_entity.solution.search_result.yml
@@ -146,6 +146,8 @@ content:
 hidden:
   collections: true
   download_total: true
+  eif_perspective: true
+  featured: true
   field_is_actor: true
   field_is_affiliations_requests: true
   field_is_banner: true
@@ -187,9 +189,11 @@ hidden:
   field_status: true
   langcode: true
   og_group: true
+  pinned_in: true
   rdf_entity_field_is_content_inline_facets: true
   rdf_entity_field_is_content_top: true
   read_more: true
+  related_solution: true
   related_solutions: true
   releases_overview: true
   search_api_excerpt: true
diff --git a/config/sync/core.entity_view_display.rdf_entity.solution.search_result_featured.yml b/config/sync/core.entity_view_display.rdf_entity.solution.search_result_featured.yml
index e7793bca092280015777216893699a78d2ab2c21..2e10447b851f217c3cf86ba27b3487678bbec336 100644
--- a/config/sync/core.entity_view_display.rdf_entity.solution.search_result_featured.yml
+++ b/config/sync/core.entity_view_display.rdf_entity.solution.search_result_featured.yml
@@ -163,6 +163,8 @@ content:
 hidden:
   collections: true
   download_total: true
+  eif_perspective: true
+  featured: true
   field_is_actor: true
   field_is_affiliations_requests: true
   field_is_banner: true
@@ -203,9 +205,11 @@ hidden:
   field_status: true
   langcode: true
   og_group: true
+  pinned_in: true
   rdf_entity_field_is_content_inline_facets: true
   rdf_entity_field_is_content_top: true
   read_more: true
+  related_solution: true
   related_solutions: true
   releases_overview: true
   search_api_excerpt: true
diff --git a/config/sync/core.entity_view_display.rdf_entity.solution.view_mode_featured.yml b/config/sync/core.entity_view_display.rdf_entity.solution.view_mode_featured.yml
index ff07fff9c4bfc0a7f11e0c3a8f7000340dd87827..e8aee419772b8aab0f60fb05a91174741bc04175 100644
--- a/config/sync/core.entity_view_display.rdf_entity.solution.view_mode_featured.yml
+++ b/config/sync/core.entity_view_display.rdf_entity.solution.view_mode_featured.yml
@@ -105,6 +105,8 @@ hidden:
   changed: true
   collections: true
   created: true
+  eif_perspective: true
+  featured: true
   field_is_actor: true
   field_is_affiliations_requests: true
   field_is_banner: true
@@ -146,9 +148,11 @@ hidden:
   field_topic: true
   langcode: true
   og_group: true
+  pinned_in: true
   rdf_entity_field_is_content_inline_facets: true
   rdf_entity_field_is_content_top: true
   read_more: true
+  related_solution: true
   related_solutions: true
   releases_overview: true
   search_api_excerpt: true
diff --git a/config/sync/core.entity_view_display.rdf_entity.solution.view_mode_search_list_item.yml b/config/sync/core.entity_view_display.rdf_entity.solution.view_mode_search_list_item.yml
new file mode 100644
index 0000000000000000000000000000000000000000..a40a0af897f4eeb920276b6155fbb3b7ca9eeacd
--- /dev/null
+++ b/config/sync/core.entity_view_display.rdf_entity.solution.view_mode_search_list_item.yml
@@ -0,0 +1,191 @@
+uuid: 8af7cb98-44cf-42e1-a4c1-027715f7088b
+langcode: en
+status: true
+dependencies:
+  config:
+    - core.entity_view_mode.rdf_entity.view_mode_search_list_item
+    - field.field.rdf_entity.solution.field_is_actor
+    - field.field.rdf_entity.solution.field_is_affiliations_requests
+    - field.field.rdf_entity.solution.field_is_banner
+    - field.field.rdf_entity.solution.field_is_business_process
+    - field.field.rdf_entity.solution.field_is_contact_information
+    - field.field.rdf_entity.solution.field_is_content
+    - field.field.rdf_entity.solution.field_is_content_creation
+    - field.field.rdf_entity.solution.field_is_description
+    - field.field.rdf_entity.solution.field_is_distribution
+    - field.field.rdf_entity.solution.field_is_documentation
+    - field.field.rdf_entity.solution.field_is_eif_category
+    - field.field.rdf_entity.solution.field_is_eif_recommendation
+    - field.field.rdf_entity.solution.field_is_has_version
+    - field.field.rdf_entity.solution.field_is_included_asset
+    - field.field.rdf_entity.solution.field_is_issue_tracker
+    - field.field.rdf_entity.solution.field_is_landing_page
+    - field.field.rdf_entity.solution.field_is_language
+    - field.field.rdf_entity.solution.field_is_logo
+    - field.field.rdf_entity.solution.field_is_metrics_page
+    - field.field.rdf_entity.solution.field_is_moderation
+    - field.field.rdf_entity.solution.field_is_owner
+    - field.field.rdf_entity.solution.field_is_product_type
+    - field.field.rdf_entity.solution.field_is_related_solutions
+    - field.field.rdf_entity.solution.field_is_shared_in
+    - field.field.rdf_entity.solution.field_is_show_eira_related
+    - field.field.rdf_entity.solution.field_is_solution_type
+    - field.field.rdf_entity.solution.field_is_source_code_repository
+    - field.field.rdf_entity.solution.field_is_standardization_level
+    - field.field.rdf_entity.solution.field_is_state
+    - field.field.rdf_entity.solution.field_is_test_resource_type
+    - field.field.rdf_entity.solution.field_is_translation
+    - field.field.rdf_entity.solution.field_is_version
+    - field.field.rdf_entity.solution.field_is_webdav_creation
+    - field.field.rdf_entity.solution.field_is_webdav_url
+    - field.field.rdf_entity.solution.field_is_wiki
+    - field.field.rdf_entity.solution.field_keywords
+    - field.field.rdf_entity.solution.field_short_id
+    - field.field.rdf_entity.solution.field_site_featured
+    - field.field.rdf_entity.solution.field_spatial_coverage
+    - field.field.rdf_entity.solution.field_status
+    - field.field.rdf_entity.solution.field_topic
+    - rdf_entity.rdfentity.solution
+    - responsive_image.styles.teaser
+  module:
+    - field_group
+    - joinup_html_stripper
+    - layout_builder
+    - options
+    - responsive_image
+    - template_suggestion
+    - user
+third_party_settings:
+  field_group:
+    group_solution_abstract_wrapper:
+      children:
+        - read_more
+      label: 'Abstract wrapper'
+      parent_name: ''
+      region: hidden
+      weight: 59
+      format_type: html_element
+      format_settings:
+        classes: ''
+        id: ''
+        element: div
+        show_label: false
+        label_element: h3
+        attributes: ''
+        effect: none
+        speed: fast
+  layout_builder:
+    enabled: false
+    allow_custom: false
+id: rdf_entity.solution.view_mode_search_list_item
+targetEntityType: rdf_entity
+bundle: solution
+mode: view_mode_search_list_item
+content:
+  field_is_description:
+    type: joinup_html_stripper_stripped
+    label: hidden
+    settings:
+      trim_length: 200
+    third_party_settings:
+      template_suggestion:
+        template_suggestion: p_wrapper
+    weight: 3
+    region: content
+  field_is_eif_category:
+    type: list_default
+    label: hidden
+    settings: {  }
+    third_party_settings: {  }
+    weight: 4
+    region: content
+  field_is_logo:
+    type: responsive_image
+    label: hidden
+    settings:
+      responsive_image_style: teaser
+      image_link: ''
+    third_party_settings:
+      template_suggestion:
+        template_suggestion: ''
+    weight: 0
+    region: content
+  field_is_owner:
+    type: entity_reference_label
+    label: hidden
+    settings:
+      link: true
+    third_party_settings: {  }
+    weight: 5
+    region: content
+  field_topic:
+    type: entity_reference_label
+    label: hidden
+    settings:
+      link: true
+    third_party_settings: {  }
+    weight: 2
+    region: content
+  label:
+    type: string
+    label: hidden
+    settings:
+      link_to_entity: false
+    third_party_settings: {  }
+    weight: 1
+    region: content
+hidden:
+  changed: true
+  collections: true
+  created: true
+  download_total: true
+  eif_perspective: true
+  featured: true
+  field_is_actor: true
+  field_is_affiliations_requests: true
+  field_is_banner: true
+  field_is_business_process: true
+  field_is_contact_information: true
+  field_is_content: true
+  field_is_content_creation: true
+  field_is_distribution: true
+  field_is_documentation: true
+  field_is_eif_recommendation: true
+  field_is_has_version: true
+  field_is_included_asset: true
+  field_is_issue_tracker: true
+  field_is_landing_page: true
+  field_is_language: true
+  field_is_metrics_page: true
+  field_is_moderation: true
+  field_is_product_type: true
+  field_is_related_solutions: true
+  field_is_shared_in: true
+  field_is_show_eira_related: true
+  field_is_solution_type: true
+  field_is_source_code_repository: true
+  field_is_standardization_level: true
+  field_is_state: true
+  field_is_test_resource_type: true
+  field_is_translation: true
+  field_is_version: true
+  field_is_webdav_creation: true
+  field_is_webdav_url: true
+  field_is_wiki: true
+  field_keywords: true
+  field_short_id: true
+  field_site_featured: true
+  field_spatial_coverage: true
+  field_status: true
+  langcode: true
+  og_group: true
+  pinned_in: true
+  rdf_entity_field_is_content_inline_facets: true
+  rdf_entity_field_is_content_top: true
+  read_more: true
+  related_solution: true
+  related_solutions: true
+  releases_overview: true
+  search_api_excerpt: true
+  share_link: true
+  solution_subscribe: true
diff --git a/config/sync/core.entity_view_display.rdf_entity.solution.view_mode_tile.yml b/config/sync/core.entity_view_display.rdf_entity.solution.view_mode_tile.yml
index 5283d566a9b744154a9b18df1d214439e34c5090..ccdec28f9f5e3f7f6f962e7127df7fceb222ebb8 100644
--- a/config/sync/core.entity_view_display.rdf_entity.solution.view_mode_tile.yml
+++ b/config/sync/core.entity_view_display.rdf_entity.solution.view_mode_tile.yml
@@ -105,6 +105,8 @@ hidden:
   changed: true
   collections: true
   created: true
+  eif_perspective: true
+  featured: true
   field_is_actor: true
   field_is_affiliations_requests: true
   field_is_banner: true
@@ -146,9 +148,11 @@ hidden:
   field_topic: true
   langcode: true
   og_group: true
+  pinned_in: true
   rdf_entity_field_is_content_inline_facets: true
   rdf_entity_field_is_content_top: true
   read_more: true
+  related_solution: true
   related_solutions: true
   releases_overview: true
   search_api_excerpt: true
diff --git a/config/sync/core.entity_view_display.rdf_meta_entity.eif_perspective.default.yml b/config/sync/core.entity_view_display.rdf_meta_entity.eif_perspective.default.yml
new file mode 100644
index 0000000000000000000000000000000000000000..9f0e9b9ceae4475c389d7b256cb475b6c09229bf
--- /dev/null
+++ b/config/sync/core.entity_view_display.rdf_meta_entity.eif_perspective.default.yml
@@ -0,0 +1,113 @@
+uuid: 6f97a0a4-a302-454b-a9dc-81d57be0e344
+langcode: en
+status: true
+dependencies:
+  config:
+    - field.field.rdf_meta_entity.eif_perspective.eif_layer
+    - field.field.rdf_meta_entity.eif_perspective.eif_model
+    - field.field.rdf_meta_entity.eif_perspective.eif_principle
+    - field.field.rdf_meta_entity.eif_perspective.eif_recommendation
+    - field.field.rdf_meta_entity.eif_perspective.field_eif_description
+    - field.field.rdf_meta_entity.eif_perspective.field_eif_solution_type
+    - rdf_meta_entity.type.eif_perspective
+  module:
+    - field_delimiter
+    - field_formatter_range
+    - layout_builder
+    - template_suggestion
+    - text
+third_party_settings:
+  layout_builder:
+    enabled: false
+    allow_custom: false
+id: rdf_meta_entity.eif_perspective.default
+targetEntityType: rdf_meta_entity
+bundle: eif_perspective
+mode: default
+content:
+  eif_layer:
+    type: entity_reference_label
+    label: above
+    settings:
+      link: true
+    third_party_settings:
+      field_delimiter:
+        delimiter: ''
+      field_formatter_range:
+        order: 0
+        limit: 0
+        offset: 0
+      template_suggestion:
+        template_suggestion: ''
+    weight: 3
+    region: content
+  eif_model:
+    type: entity_reference_label
+    label: above
+    settings:
+      link: true
+    third_party_settings:
+      field_delimiter:
+        delimiter: ''
+      field_formatter_range:
+        order: 0
+        limit: 0
+        offset: 0
+      template_suggestion:
+        template_suggestion: ''
+    weight: 4
+    region: content
+  eif_principle:
+    type: entity_reference_label
+    label: above
+    settings:
+      link: true
+    third_party_settings:
+      field_delimiter:
+        delimiter: ''
+      field_formatter_range:
+        order: 0
+        limit: 0
+        offset: 0
+      template_suggestion:
+        template_suggestion: ''
+    weight: 2
+    region: content
+  eif_recommendation:
+    type: entity_reference_entity_view
+    label: hidden
+    settings:
+      view_mode: default
+      link: false
+    third_party_settings:
+      field_delimiter:
+        delimiter: ''
+      field_formatter_range:
+        order: 0
+        limit: 0
+        offset: 0
+      template_suggestion:
+        template_suggestion: ''
+    weight: 5
+    region: content
+  field_eif_description:
+    type: text_default
+    label: hidden
+    settings: {  }
+    third_party_settings: {  }
+    weight: 0
+    region: content
+  field_eif_solution_type:
+    type: entity_reference_label
+    label: hidden
+    settings:
+      link: true
+    third_party_settings: {  }
+    weight: 1
+    region: content
+hidden:
+  changed: true
+  created: true
+  label: true
+  search_api_excerpt: true
+  target: true
diff --git a/config/sync/core.entity_view_display.rdf_meta_entity.eif_perspective.eif_perspective.yml b/config/sync/core.entity_view_display.rdf_meta_entity.eif_perspective.eif_perspective.yml
new file mode 100644
index 0000000000000000000000000000000000000000..53cc3fecf4edf5b3f0368617d00b7da7e0cd46d5
--- /dev/null
+++ b/config/sync/core.entity_view_display.rdf_meta_entity.eif_perspective.eif_perspective.yml
@@ -0,0 +1,129 @@
+uuid: 8d1626f3-4d3e-40ec-8742-852090e55f49
+langcode: en
+status: true
+dependencies:
+  config:
+    - core.entity_view_mode.rdf_meta_entity.eif_perspective
+    - field.field.rdf_meta_entity.eif_perspective.eif_layer
+    - field.field.rdf_meta_entity.eif_perspective.eif_model
+    - field.field.rdf_meta_entity.eif_perspective.eif_principle
+    - field.field.rdf_meta_entity.eif_perspective.eif_recommendation
+    - field.field.rdf_meta_entity.eif_perspective.field_eif_description
+    - field.field.rdf_meta_entity.eif_perspective.field_eif_solution_type
+    - rdf_meta_entity.type.eif_perspective
+  module:
+    - field_delimiter
+    - field_formatter_range
+    - layout_builder
+    - template_suggestion
+    - text
+third_party_settings:
+  layout_builder:
+    enabled: false
+    allow_custom: false
+id: rdf_meta_entity.eif_perspective.eif_perspective
+targetEntityType: rdf_meta_entity
+bundle: eif_perspective
+mode: eif_perspective
+content:
+  eif_layer:
+    type: entity_reference_label
+    label: hidden
+    settings:
+      link: true
+    third_party_settings:
+      field_delimiter:
+        delimiter: ''
+      field_formatter_range:
+        order: 0
+        limit: 0
+        offset: 0
+      template_suggestion:
+        template_suggestion: ''
+    weight: 4
+    region: content
+  eif_model:
+    type: entity_reference_label
+    label: hidden
+    settings:
+      link: true
+    third_party_settings:
+      field_delimiter:
+        delimiter: ''
+      field_formatter_range:
+        order: 0
+        limit: 0
+        offset: 0
+      template_suggestion:
+        template_suggestion: ''
+    weight: 5
+    region: content
+  eif_principle:
+    type: entity_reference_label
+    label: hidden
+    settings:
+      link: true
+    third_party_settings:
+      field_delimiter:
+        delimiter: ''
+      field_formatter_range:
+        order: 0
+        limit: 0
+        offset: 0
+      template_suggestion:
+        template_suggestion: ''
+    weight: 3
+    region: content
+  eif_recommendation:
+    type: entity_reference_entity_view
+    label: hidden
+    settings:
+      view_mode: default
+      link: false
+    third_party_settings:
+      field_delimiter:
+        delimiter: ''
+      field_formatter_range:
+        order: 0
+        limit: 0
+        offset: 0
+      template_suggestion:
+        template_suggestion: ''
+    weight: 6
+    region: content
+  field_eif_description:
+    type: text_default
+    label: inline
+    settings: {  }
+    third_party_settings: {  }
+    weight: 1
+    region: content
+  field_eif_solution_type:
+    type: entity_reference_label
+    label: inline
+    settings:
+      link: false
+    third_party_settings:
+      field_delimiter:
+        delimiter: ''
+      field_formatter_range:
+        order: 0
+        limit: 0
+        offset: 0
+      template_suggestion:
+        template_suggestion: ''
+    weight: 2
+    region: content
+  label:
+    type: string
+    label: hidden
+    settings:
+      link_to_entity: false
+    third_party_settings: {  }
+    weight: 0
+    region: content
+hidden:
+  changed: true
+  created: true
+  search_api_excerpt: true
+  target: true
diff --git a/config/sync/core.entity_view_display.taxonomy_term.eif_recommendation.eif_recommendation.yml b/config/sync/core.entity_view_display.taxonomy_term.eif_recommendation.eif_recommendation.yml
new file mode 100644
index 0000000000000000000000000000000000000000..61fe9c803b5975ea259bfd6c10d30f2512c1ce15
--- /dev/null
+++ b/config/sync/core.entity_view_display.taxonomy_term.eif_recommendation.eif_recommendation.yml
@@ -0,0 +1,36 @@
+uuid: d73cd510-d4e1-4e7d-80ef-439fbe16858c
+langcode: en
+status: true
+dependencies:
+  config:
+    - core.entity_view_mode.taxonomy_term.eif_recommendation
+    - field.field.taxonomy_term.eif_recommendation.field_eif_identifier
+    - field.field.taxonomy_term.eif_recommendation.field_eif_related_term
+    - taxonomy.vocabulary.eif_recommendation
+  module:
+    - layout_builder
+    - template_suggestion
+third_party_settings:
+  layout_builder:
+    enabled: false
+    allow_custom: false
+id: taxonomy_term.eif_recommendation.eif_recommendation
+targetEntityType: taxonomy_term
+bundle: eif_recommendation
+mode: eif_recommendation
+content:
+  field_eif_related_term:
+    type: entity_reference_label
+    label: hidden
+    settings:
+      link: false
+    third_party_settings:
+      template_suggestion:
+        template_suggestion: ''
+    weight: 0
+    region: content
+hidden:
+  description: true
+  field_eif_identifier: true
+  langcode: true
+  search_api_excerpt: true
diff --git a/config/sync/core.entity_view_mode.rdf_entity.eif_perspective.yml b/config/sync/core.entity_view_mode.rdf_entity.eif_perspective.yml
new file mode 100644
index 0000000000000000000000000000000000000000..1ec9315390693facbc6f95974e31c16060d8b866
--- /dev/null
+++ b/config/sync/core.entity_view_mode.rdf_entity.eif_perspective.yml
@@ -0,0 +1,10 @@
+uuid: d12aec06-877c-40f0-a4c1-b43b5e259ee6
+langcode: en
+status: true
+dependencies:
+  module:
+    - rdf_entity
+id: rdf_entity.eif_perspective
+label: 'EIF Perspective'
+targetEntityType: rdf_entity
+cache: true
diff --git a/config/sync/core.entity_view_mode.rdf_meta_entity.eif_perspective.yml b/config/sync/core.entity_view_mode.rdf_meta_entity.eif_perspective.yml
new file mode 100644
index 0000000000000000000000000000000000000000..18ae9afa402b86bcd0868335740520611a21978a
--- /dev/null
+++ b/config/sync/core.entity_view_mode.rdf_meta_entity.eif_perspective.yml
@@ -0,0 +1,10 @@
+uuid: af376d5b-5f7a-4050-95c1-e624ca822f9d
+langcode: en
+status: true
+dependencies:
+  module:
+    - rdf_meta_entity
+id: rdf_meta_entity.eif_perspective
+label: 'EIF Perspective'
+targetEntityType: rdf_meta_entity
+cache: true
diff --git a/config/sync/core.entity_view_mode.taxonomy_term.eif_recommendation.yml b/config/sync/core.entity_view_mode.taxonomy_term.eif_recommendation.yml
new file mode 100644
index 0000000000000000000000000000000000000000..d4a24576e02707532cfa54f35afcb5b9b06a9727
--- /dev/null
+++ b/config/sync/core.entity_view_mode.taxonomy_term.eif_recommendation.yml
@@ -0,0 +1,10 @@
+uuid: 9f3a81f9-ff69-4a20-b3de-061244b5d525
+langcode: en
+status: true
+dependencies:
+  module:
+    - taxonomy
+id: taxonomy_term.eif_recommendation
+label: 'EIF recommendation inline'
+targetEntityType: taxonomy_term
+cache: true
diff --git a/config/sync/core.extension.yml b/config/sync/core.extension.yml
index e4c3ba206d9739a427dd0004753667b451dbcaf1..49fcc1043b49629ead703f6a6571b34fdfb48a8f 100644
--- a/config/sync/core.extension.yml
+++ b/config/sync/core.extension.yml
@@ -168,6 +168,7 @@ module:
   rdf_entity: 0
   rdf_entity_provenance: 0
   rdf_export: 0
+  rdf_meta_entity: 0
   rdf_schema_field_validation: 0
   rdf_taxonomy: 0
   redirect: 0
diff --git a/config/sync/eif.eif_wrapper_type.recommendation.yml b/config/sync/eif.eif_wrapper_type.recommendation.yml
new file mode 100644
index 0000000000000000000000000000000000000000..7017bcac264dfb47afc0ba745c0d73d95e7357a8
--- /dev/null
+++ b/config/sync/eif.eif_wrapper_type.recommendation.yml
@@ -0,0 +1,6 @@
+uuid: 857366b9-374e-45c4-8bfd-7ca136ef447d
+langcode: en
+status: true
+dependencies: {  }
+id: recommendation
+label: 'Qualified concept recommendation'
diff --git a/config/sync/facets.facet_source.search_api__views_block__solutions_meta_entity__solutions_meta_entity_block.yml b/config/sync/facets.facet_source.search_api__views_block__solutions_meta_entity__solutions_meta_entity_block.yml
new file mode 100644
index 0000000000000000000000000000000000000000..f2027cbe47cf741ef30025f82006242bf1145e3f
--- /dev/null
+++ b/config/sync/facets.facet_source.search_api__views_block__solutions_meta_entity__solutions_meta_entity_block.yml
@@ -0,0 +1,9 @@
+uuid: a52b6946-52b1-4e8a-b60d-25af807b9703
+langcode: en
+status: true
+dependencies: {  }
+id: search_api__views_block__solutions_meta_entity__solutions_meta_entity_block
+name: 'search_api:views_block__solutions_meta_entity__solutions_meta_entity_block'
+filter_key: null
+url_processor: query_string
+breadcrumb: {  }
diff --git a/config/sync/field.field.eif_wrapper.recommendation.term.yml b/config/sync/field.field.eif_wrapper.recommendation.term.yml
new file mode 100644
index 0000000000000000000000000000000000000000..9abf1dfd3915c2ff1119a2dcb10c2951c942f4a1
--- /dev/null
+++ b/config/sync/field.field.eif_wrapper.recommendation.term.yml
@@ -0,0 +1,29 @@
+uuid: 4275ea66-18c2-4297-bf0f-b753bb6083b0
+langcode: en
+status: true
+dependencies:
+  config:
+    - eif.eif_wrapper_type.recommendation
+    - field.storage.eif_wrapper.term
+    - taxonomy.vocabulary.eif_recommendation
+id: eif_wrapper.recommendation.term
+field_name: term
+entity_type: eif_wrapper
+bundle: recommendation
+label: 'EIF qualifier'
+description: ''
+required: true
+translatable: false
+default_value: {  }
+default_value_callback: ''
+settings:
+  handler: 'default:taxonomy_term'
+  handler_settings:
+    target_bundles:
+      eif_recommendation: eif_recommendation
+    sort:
+      field: name
+      direction: asc
+    auto_create: false
+    auto_create_bundle: ''
+field_type: entity_reference
diff --git a/config/sync/field.field.message.group_content_subscription.field_group_content.yml b/config/sync/field.field.message.group_content_subscription.field_group_content.yml
index f0e697098399461c6844c9463ba6953298ce39c7..045568be36c7da47d0b7cd8b50e664d9f096b654 100644
--- a/config/sync/field.field.message.group_content_subscription.field_group_content.yml
+++ b/config/sync/field.field.message.group_content_subscription.field_group_content.yml
@@ -283,4 +283,16 @@ settings:
   solr_request_handler:
     handler: 'default:solr_request_handler'
     handler_settings: {  }
+  rdf_meta_entity:
+    handler: 'default:rdf_meta_entity'
+    handler_settings: {  }
+  rdf_meta_entity_type:
+    handler: 'default:rdf_meta_entity_type'
+    handler_settings: {  }
+  eif_wrapper:
+    handler: 'default:eif_wrapper'
+    handler_settings: {  }
+  eif_wrapper_type:
+    handler: 'default:eif_wrapper_type'
+    handler_settings: {  }
 field_type: dynamic_entity_reference
diff --git a/config/sync/field.field.rdf_meta_entity.eif_perspective.eif_layer.yml b/config/sync/field.field.rdf_meta_entity.eif_perspective.eif_layer.yml
new file mode 100644
index 0000000000000000000000000000000000000000..720ef3440d7f6662b6d106e2f9408547303da700
--- /dev/null
+++ b/config/sync/field.field.rdf_meta_entity.eif_perspective.eif_layer.yml
@@ -0,0 +1,29 @@
+uuid: ac3cd852-008b-4cb2-8c7a-18ff8991c9cc
+langcode: en
+status: true
+dependencies:
+  config:
+    - field.storage.rdf_meta_entity.eif_layer
+    - rdf_meta_entity.type.eif_perspective
+    - taxonomy.vocabulary.eif_interoperability_layer
+id: rdf_meta_entity.eif_perspective.eif_layer
+field_name: eif_layer
+entity_type: rdf_meta_entity
+bundle: eif_perspective
+label: Layer
+description: ''
+required: false
+translatable: false
+default_value: {  }
+default_value_callback: ''
+settings:
+  handler: 'default:taxonomy_term'
+  handler_settings:
+    target_bundles:
+      eif_interoperability_layer: eif_interoperability_layer
+    sort:
+      field: name
+      direction: asc
+    auto_create: false
+    auto_create_bundle: ''
+field_type: entity_reference
diff --git a/config/sync/field.field.rdf_meta_entity.eif_perspective.eif_model.yml b/config/sync/field.field.rdf_meta_entity.eif_perspective.eif_model.yml
new file mode 100644
index 0000000000000000000000000000000000000000..18ed5593f2732e02bf6902c1fc30fae0f5b1a810
--- /dev/null
+++ b/config/sync/field.field.rdf_meta_entity.eif_perspective.eif_model.yml
@@ -0,0 +1,29 @@
+uuid: ab1e68d5-4e15-4edd-bc62-cf6322080ca7
+langcode: en
+status: true
+dependencies:
+  config:
+    - field.storage.rdf_meta_entity.eif_model
+    - rdf_meta_entity.type.eif_perspective
+    - taxonomy.vocabulary.eif_conceptual_model
+id: rdf_meta_entity.eif_perspective.eif_model
+field_name: eif_model
+entity_type: rdf_meta_entity
+bundle: eif_perspective
+label: Model
+description: ''
+required: false
+translatable: false
+default_value: {  }
+default_value_callback: ''
+settings:
+  handler: 'default:taxonomy_term'
+  handler_settings:
+    target_bundles:
+      eif_conceptual_model: eif_conceptual_model
+    sort:
+      field: name
+      direction: asc
+    auto_create: false
+    auto_create_bundle: ''
+field_type: entity_reference
diff --git a/config/sync/field.field.rdf_meta_entity.eif_perspective.eif_principle.yml b/config/sync/field.field.rdf_meta_entity.eif_perspective.eif_principle.yml
new file mode 100644
index 0000000000000000000000000000000000000000..b72d8ef32cfea1a8e7fccd0689efa4b8ccb731ec
--- /dev/null
+++ b/config/sync/field.field.rdf_meta_entity.eif_perspective.eif_principle.yml
@@ -0,0 +1,29 @@
+uuid: 5c2b571a-a55b-4a76-afe8-ca4bcccaca68
+langcode: en
+status: true
+dependencies:
+  config:
+    - field.storage.rdf_meta_entity.eif_principle
+    - rdf_meta_entity.type.eif_perspective
+    - taxonomy.vocabulary.eif_principle
+id: rdf_meta_entity.eif_perspective.eif_principle
+field_name: eif_principle
+entity_type: rdf_meta_entity
+bundle: eif_perspective
+label: Principle
+description: ''
+required: false
+translatable: false
+default_value: {  }
+default_value_callback: ''
+settings:
+  handler: 'default:taxonomy_term'
+  handler_settings:
+    target_bundles:
+      eif_principle: eif_principle
+    sort:
+      field: name
+      direction: asc
+    auto_create: false
+    auto_create_bundle: ''
+field_type: entity_reference
diff --git a/config/sync/field.field.rdf_meta_entity.eif_perspective.eif_recommendation.yml b/config/sync/field.field.rdf_meta_entity.eif_perspective.eif_recommendation.yml
new file mode 100644
index 0000000000000000000000000000000000000000..80b49a582f0a606f384e2d097ee0b5964413cbf7
--- /dev/null
+++ b/config/sync/field.field.rdf_meta_entity.eif_perspective.eif_recommendation.yml
@@ -0,0 +1,27 @@
+uuid: 812114c4-72f3-4b6d-99fd-a0bdfb023fae
+langcode: en
+status: true
+dependencies:
+  config:
+    - field.storage.rdf_meta_entity.eif_recommendation
+    - rdf_meta_entity.type.eif_perspective
+id: rdf_meta_entity.eif_perspective.eif_recommendation
+field_name: eif_recommendation
+entity_type: rdf_meta_entity
+bundle: eif_perspective
+label: Recommendation
+description: ''
+required: false
+translatable: false
+default_value: {  }
+default_value_callback: ''
+settings:
+  handler: 'default:eif_wrapper'
+  handler_settings:
+    target_bundles:
+      recommendation: recommendation
+    sort:
+      field: _none
+      direction: ASC
+    auto_create: false
+field_type: entity_reference
diff --git a/config/sync/field.field.rdf_meta_entity.eif_perspective.field_eif_description.yml b/config/sync/field.field.rdf_meta_entity.eif_perspective.field_eif_description.yml
new file mode 100644
index 0000000000000000000000000000000000000000..9f742b8098bee6f248ede64dac3384fad5b8c3e9
--- /dev/null
+++ b/config/sync/field.field.rdf_meta_entity.eif_perspective.field_eif_description.yml
@@ -0,0 +1,26 @@
+uuid: cf81a3ef-6fcf-494b-83fd-5701b6398c96
+langcode: en
+status: true
+dependencies:
+  config:
+    - field.storage.rdf_meta_entity.field_eif_description
+    - rdf_meta_entity.type.eif_perspective
+  module:
+    - allowed_formats
+    - text
+third_party_settings:
+  allowed_formats:
+    allowed_formats:
+      - content_editor
+id: rdf_meta_entity.eif_perspective.field_eif_description
+field_name: field_eif_description
+entity_type: rdf_meta_entity
+bundle: eif_perspective
+label: Description
+description: ''
+required: false
+translatable: false
+default_value: {  }
+default_value_callback: ''
+settings: {  }
+field_type: text_long
diff --git a/config/sync/field.field.rdf_meta_entity.eif_perspective.field_eif_solution_type.yml b/config/sync/field.field.rdf_meta_entity.eif_perspective.field_eif_solution_type.yml
new file mode 100644
index 0000000000000000000000000000000000000000..1b241183fc773d529fc222f1f4f67477db0b94b2
--- /dev/null
+++ b/config/sync/field.field.rdf_meta_entity.eif_perspective.field_eif_solution_type.yml
@@ -0,0 +1,29 @@
+uuid: c10063a8-e5c8-4a8e-975f-430558f0615a
+langcode: en
+status: true
+dependencies:
+  config:
+    - field.storage.rdf_meta_entity.field_eif_solution_type
+    - rdf_meta_entity.type.eif_perspective
+    - taxonomy.vocabulary.eif_solution_type
+id: rdf_meta_entity.eif_perspective.field_eif_solution_type
+field_name: field_eif_solution_type
+entity_type: rdf_meta_entity
+bundle: eif_perspective
+label: 'Type of solution'
+description: ''
+required: true
+translatable: false
+default_value: {  }
+default_value_callback: ''
+settings:
+  handler: 'default:taxonomy_term'
+  handler_settings:
+    target_bundles:
+      solution_category: eif_solution_type
+    sort:
+      field: name
+      direction: asc
+    auto_create: false
+    auto_create_bundle: ''
+field_type: entity_reference
diff --git a/config/sync/field.storage.eif_wrapper.term.yml b/config/sync/field.storage.eif_wrapper.term.yml
new file mode 100644
index 0000000000000000000000000000000000000000..e94401644df94438f56c2ad5ec0af8bf9164e613
--- /dev/null
+++ b/config/sync/field.storage.eif_wrapper.term.yml
@@ -0,0 +1,30 @@
+uuid: b0691923-b874-4286-a363-36c247a4ffd8
+langcode: en
+status: true
+dependencies:
+  module:
+    - eif
+    - field_permissions
+    - sparql_entity_storage
+    - taxonomy
+third_party_settings:
+  field_permissions:
+    permission_type: public
+  sparql_entity_storage:
+    mapping:
+      target_id:
+        predicate: 'http://data.europa.eu/eif/adms/qualifier'
+        format: resource
+id: eif_wrapper.term
+field_name: term
+entity_type: eif_wrapper
+type: entity_reference
+settings:
+  target_type: taxonomy_term
+module: core
+locked: false
+cardinality: 1
+translatable: true
+indexes: {  }
+persist_with_no_fields: false
+custom_storage: false
diff --git a/config/sync/field.storage.rdf_meta_entity.eif_layer.yml b/config/sync/field.storage.rdf_meta_entity.eif_layer.yml
new file mode 100644
index 0000000000000000000000000000000000000000..e4fd53cebcccb6a793af0785b25dda330d5a972d
--- /dev/null
+++ b/config/sync/field.storage.rdf_meta_entity.eif_layer.yml
@@ -0,0 +1,30 @@
+uuid: bb1c2c82-2052-4bfa-a8a8-971ebcc35b3a
+langcode: en
+status: true
+dependencies:
+  module:
+    - field_permissions
+    - rdf_meta_entity
+    - sparql_entity_storage
+    - taxonomy
+third_party_settings:
+  sparql_entity_storage:
+    mapping:
+      target_id:
+        predicate: 'http://data.europa.eu/eif/Layer'
+        format: resource
+  field_permissions:
+    permission_type: public
+id: rdf_meta_entity.eif_layer
+field_name: eif_layer
+entity_type: rdf_meta_entity
+type: entity_reference
+settings:
+  target_type: taxonomy_term
+module: core
+locked: false
+cardinality: -1
+translatable: true
+indexes: {  }
+persist_with_no_fields: false
+custom_storage: false
diff --git a/config/sync/field.storage.rdf_meta_entity.eif_model.yml b/config/sync/field.storage.rdf_meta_entity.eif_model.yml
new file mode 100644
index 0000000000000000000000000000000000000000..eb460559ec95b7c8e06fca75d6d7b6d0edc64361
--- /dev/null
+++ b/config/sync/field.storage.rdf_meta_entity.eif_model.yml
@@ -0,0 +1,30 @@
+uuid: 0adccd49-716c-40f1-b79f-a09a7126723a
+langcode: en
+status: true
+dependencies:
+  module:
+    - field_permissions
+    - rdf_meta_entity
+    - sparql_entity_storage
+    - taxonomy
+third_party_settings:
+  sparql_entity_storage:
+    mapping:
+      target_id:
+        predicate: 'http://data.europa.eu/eif/Model'
+        format: resource
+  field_permissions:
+    permission_type: public
+id: rdf_meta_entity.eif_model
+field_name: eif_model
+entity_type: rdf_meta_entity
+type: entity_reference
+settings:
+  target_type: taxonomy_term
+module: core
+locked: false
+cardinality: -1
+translatable: true
+indexes: {  }
+persist_with_no_fields: false
+custom_storage: false
diff --git a/config/sync/field.storage.rdf_meta_entity.eif_principle.yml b/config/sync/field.storage.rdf_meta_entity.eif_principle.yml
new file mode 100644
index 0000000000000000000000000000000000000000..c32bc71908c21def4bb061924f9937362e4b74cc
--- /dev/null
+++ b/config/sync/field.storage.rdf_meta_entity.eif_principle.yml
@@ -0,0 +1,30 @@
+uuid: a9bcc87a-fa30-4b24-9a9a-e5458dc55a34
+langcode: en
+status: true
+dependencies:
+  module:
+    - field_permissions
+    - rdf_meta_entity
+    - sparql_entity_storage
+    - taxonomy
+third_party_settings:
+  sparql_entity_storage:
+    mapping:
+      target_id:
+        predicate: 'http://data.europa.eu/eif/Principle'
+        format: resource
+  field_permissions:
+    permission_type: public
+id: rdf_meta_entity.eif_principle
+field_name: eif_principle
+entity_type: rdf_meta_entity
+type: entity_reference
+settings:
+  target_type: taxonomy_term
+module: core
+locked: false
+cardinality: -1
+translatable: true
+indexes: {  }
+persist_with_no_fields: false
+custom_storage: false
diff --git a/config/sync/field.storage.rdf_meta_entity.eif_recommendation.yml b/config/sync/field.storage.rdf_meta_entity.eif_recommendation.yml
new file mode 100644
index 0000000000000000000000000000000000000000..4bcbfd3a3133102ac4fb1f86c4f27b60822c834f
--- /dev/null
+++ b/config/sync/field.storage.rdf_meta_entity.eif_recommendation.yml
@@ -0,0 +1,30 @@
+uuid: f4cfbcf0-a29d-4da2-aba4-af33d738785a
+langcode: en
+status: true
+dependencies:
+  module:
+    - eif
+    - field_permissions
+    - rdf_meta_entity
+    - sparql_entity_storage
+third_party_settings:
+  sparql_entity_storage:
+    mapping:
+      target_id:
+        predicate: 'http://data.europa.eu/eif/Recommendation'
+        format: resource
+  field_permissions:
+    permission_type: public
+id: rdf_meta_entity.eif_recommendation
+field_name: eif_recommendation
+entity_type: rdf_meta_entity
+type: entity_reference
+settings:
+  target_type: eif_wrapper
+module: core
+locked: false
+cardinality: -1
+translatable: true
+indexes: {  }
+persist_with_no_fields: false
+custom_storage: false
diff --git a/config/sync/field.storage.rdf_meta_entity.field_eif_description.yml b/config/sync/field.storage.rdf_meta_entity.field_eif_description.yml
new file mode 100644
index 0000000000000000000000000000000000000000..fa54b8538343918e72c394b2e391d0586bcf579a
--- /dev/null
+++ b/config/sync/field.storage.rdf_meta_entity.field_eif_description.yml
@@ -0,0 +1,32 @@
+uuid: 93f9a891-86af-4e25-9892-a8fe3e22af95
+langcode: en
+status: true
+dependencies:
+  module:
+    - field_permissions
+    - rdf_meta_entity
+    - sparql_entity_storage
+    - text
+third_party_settings:
+  sparql_entity_storage:
+    mapping:
+      value:
+        predicate: 'http://purl.org/dc/terms/description'
+        format: 'xsd:string'
+      format:
+        predicate: 'http://joinup.eu/rdf_meta_entity/fields/description#format'
+        format: literal
+  field_permissions:
+    permission_type: public
+id: rdf_meta_entity.field_eif_description
+field_name: field_eif_description
+entity_type: rdf_meta_entity
+type: text_long
+settings: {  }
+module: text
+locked: false
+cardinality: 1
+translatable: true
+indexes: {  }
+persist_with_no_fields: false
+custom_storage: false
diff --git a/config/sync/field.storage.rdf_meta_entity.field_eif_solution_type.yml b/config/sync/field.storage.rdf_meta_entity.field_eif_solution_type.yml
new file mode 100644
index 0000000000000000000000000000000000000000..49a23cc4eee5a9016354dd2b1a15f9e1dd996dd1
--- /dev/null
+++ b/config/sync/field.storage.rdf_meta_entity.field_eif_solution_type.yml
@@ -0,0 +1,30 @@
+uuid: e01aa716-2548-43fd-85bf-d67a32f3b39b
+langcode: en
+status: true
+dependencies:
+  module:
+    - field_permissions
+    - rdf_meta_entity
+    - sparql_entity_storage
+    - taxonomy
+third_party_settings:
+  sparql_entity_storage:
+    mapping:
+      target_id:
+        predicate: 'http://joinup.eu/rdf_meta_entity/fields/type'
+        format: resource
+  field_permissions:
+    permission_type: public
+id: rdf_meta_entity.field_eif_solution_type
+field_name: field_eif_solution_type
+entity_type: rdf_meta_entity
+type: entity_reference
+settings:
+  target_type: taxonomy_term
+module: core
+locked: false
+cardinality: -1
+translatable: true
+indexes: {  }
+persist_with_no_fields: false
+custom_storage: false
diff --git a/config/sync/rdf_meta_entity.type.eif_perspective.yml b/config/sync/rdf_meta_entity.type.eif_perspective.yml
new file mode 100644
index 0000000000000000000000000000000000000000..583436f2ed55570d9440f797572ddbe6c78d99b1
--- /dev/null
+++ b/config/sync/rdf_meta_entity.type.eif_perspective.yml
@@ -0,0 +1,14 @@
+uuid: ffd106d5-3b01-4485-9460-c19df459fde8
+langcode: en
+status: true
+dependencies: {  }
+_core:
+  default_config_hash: hVv6uOKGMcWjYreZwL7Nbg41Ina-v-54lq1jqcsTlgE
+id: eif_perspective
+label: 'EIF perspective'
+description: 'Holds settings related to the EIF toolbox.'
+mapping:
+  rdf_entity:
+    solution:
+      field_name: eif_perspective
+      auto_create: false
diff --git a/config/sync/search_api.index.published.yml b/config/sync/search_api.index.published.yml
index 69a84262a06dc0fc4d8b42190faa2aeaa6648206..c9e2ba1ffc572b20032aa34ad4fc4b031b01473b 100644
--- a/config/sync/search_api.index.published.yml
+++ b/config/sync/search_api.index.published.yml
@@ -58,6 +58,7 @@ third_party_settings:
     finalize: false
     commit_before_finalize: false
     commit_after_finalize: false
+    debug_finalize: false
     highlighter:
       maxAnalyzedChars: 51200
       fragmenter: gap
@@ -73,11 +74,24 @@ third_party_settings:
         requireFieldMatch: false
         snippets: 3
         fragsize: 0
+    mlt:
+      mintf: 1
+      mindf: 1
+      maxdf: 0
+      maxdfpct: 0
+      minwl: 0
+      maxwl: 0
+      maxqt: 100
+      maxntp: 2000
+      boost: false
+      interestingTerms: none
     term_modifiers:
       slop: 10000000
       fuzzy: 2
     advanced:
       index_prefix: ''
+      collection: ''
+      timezone: ''
     multilingual:
       limit_to_content_language: false
       include_language_independent: true
@@ -110,6 +124,14 @@ field_settings:
     dependencies:
       module:
         - node
+  eif_perspective:
+    label: 'EIF perspective reference'
+    datasource_id: 'entity:rdf_entity'
+    property_path: eif_perspective
+    type: string
+    dependencies:
+      module:
+        - meta_entity
   entity_author:
     label: Author
     property_path: aggregated_field
diff --git a/config/sync/sparql_entity_storage.mapping.eif_wrapper.recommendation.yml b/config/sync/sparql_entity_storage.mapping.eif_wrapper.recommendation.yml
new file mode 100644
index 0000000000000000000000000000000000000000..cdfbbd459565d734bbfc5efdff7e61849cf9b090
--- /dev/null
+++ b/config/sync/sparql_entity_storage.mapping.eif_wrapper.recommendation.yml
@@ -0,0 +1,23 @@
+uuid: 16b396d0-2cf6-4ba0-8b2f-7b45a78f7fad
+langcode: en
+status: true
+dependencies:
+  config:
+    - eif.eif_wrapper_type.recommendation
+    - sparql_entity_storage.graph.default
+id: eif_wrapper.recommendation
+entity_type_id: eif_wrapper
+bundle: recommendation
+rdf_type: 'http://joinup.eu/eif-wrapper/rdf-type/recommendation'
+graph:
+  default: 'http://joinup.eu/eif-wrapper/graph/recommendation'
+base_fields_mapping:
+  type:
+    target_id:
+      predicate: 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type'
+      format: resource
+  description:
+    value:
+      predicate: 'http://purl.org/dc/terms/description'
+      format: 'xsd:string'
+entity_id_plugin: default
diff --git a/config/sync/sparql_entity_storage.mapping.rdf_meta_entity.eif_perspective.yml b/config/sync/sparql_entity_storage.mapping.rdf_meta_entity.eif_perspective.yml
new file mode 100644
index 0000000000000000000000000000000000000000..997b34e652df3e81c02a94c8d8c60172648f5a70
--- /dev/null
+++ b/config/sync/sparql_entity_storage.mapping.rdf_meta_entity.eif_perspective.yml
@@ -0,0 +1,58 @@
+uuid: cdb76564-3d18-48dd-926c-ed5206dafb89
+langcode: en
+status: true
+dependencies:
+  config:
+    - rdf_meta_entity.type.eif_perspective
+    - sparql_entity_storage.graph.default
+    - sparql_entity_storage.graph.draft
+  module:
+    - rdf_schema_field_validation
+third_party_settings:
+  rdf_schema_field_validation:
+    property_predicates:
+      - 'http://www.w3.org/2000/01/rdf-schema#domain'
+    graph: 'http://adms-definition'
+    class: 'http://www.w3.org/2000/01/rdf-schema#Class'
+_core:
+  default_config_hash: RRKMp6pOX7i_n6VzOCGpqRIJ5WYU0t9ikl8Ej_J4v0M
+id: rdf_meta_entity.eif_perspective
+entity_type_id: rdf_meta_entity
+bundle: eif_perspective
+rdf_type: 'http://data.europa.eu/eif/adms/PerspectiveEIF'
+graph:
+  default: 'http://joinup.eu/rdf_meta_entity/eif_perspective/graph/published'
+  draft: 'http://joinup.eu/rdf_meta_entity/eif_perspective/graph/draft'
+base_fields_mapping:
+  uuid:
+    value:
+      predicate: 'http://data.europa.eu/eif/adms/PerspectiveEIF/base/uuid'
+      format: t_literal
+  type:
+    target_id:
+      predicate: 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type'
+      format: resource
+  label:
+    value:
+      predicate: 'http://purl.org/dc/terms/title'
+      format: t_literal
+  target:
+    target_id:
+      predicate: 'http://joinup.eu/rdf_meta_entity/fields/target_id'
+      format: resource
+    target_type:
+      predicate: 'http://joinup.eu/rdf_meta_entity/fields/target_type'
+      format: literal
+  created:
+    value:
+      predicate: 'http://purl.org/dc/terms/issued'
+      format: 'xsd:dateTime'
+  changed:
+    value:
+      predicate: 'http://purl.org/dc/terms/modified'
+      format: 'xsd:dateTime'
+  graph:
+    target_id:
+      predicate: 'http://joinup.eu/rdf_meta_entity/fields/graph'
+      format: resource
+entity_id_plugin: default
diff --git a/config/sync/sparql_entity_storage.mapping.taxonomy_term.eif_solution_type.yml b/config/sync/sparql_entity_storage.mapping.taxonomy_term.eif_solution_type.yml
new file mode 100644
index 0000000000000000000000000000000000000000..f971c57bcb87b919390e3d74aa29b990689db924
--- /dev/null
+++ b/config/sync/sparql_entity_storage.mapping.taxonomy_term.eif_solution_type.yml
@@ -0,0 +1,35 @@
+uuid: 5bdca175-4e89-471a-9335-353f4cf1c214
+langcode: en
+status: true
+dependencies:
+  config:
+    - sparql_entity_storage.graph.default
+    - taxonomy.vocabulary.eif_solution_type
+id: taxonomy_term.eif_solution_type
+entity_type_id: taxonomy_term
+bundle: eif_solution_type
+rdf_type: 'http://data.europa.eu/eif/SolutionType/'
+graph:
+  default: 'http://eif_solution_type'
+base_fields_mapping:
+  vid:
+    target_id:
+      predicate: 'http://www.w3.org/2004/02/skos/core#inScheme'
+      format: resource
+  name:
+    value:
+      predicate: 'http://www.w3.org/2004/02/skos/core#prefLabel'
+      format: t_literal
+  description:
+    value:
+      predicate: 'http://www.w3.org/2004/02/skos/core#definition'
+      format: t_literal
+  format:
+    value:
+      predicate: ''
+      format: ''
+  weight:
+    value:
+      predicate: 'http://www.w3.org/ns/adms#identifier'
+      format: 'xsd:integer'
+entity_id_plugin: null
diff --git a/config/sync/taxonomy.vocabulary.eif_solution_type.yml b/config/sync/taxonomy.vocabulary.eif_solution_type.yml
new file mode 100644
index 0000000000000000000000000000000000000000..82e981a850a6779344463e0b134451598be5f44c
--- /dev/null
+++ b/config/sync/taxonomy.vocabulary.eif_solution_type.yml
@@ -0,0 +1,11 @@
+uuid: 22a58657-f451-45b0-8ef6-5c5a833a3beb
+langcode: en
+status: true
+dependencies: {  }
+third_party_settings:
+  rdf_taxonomy:
+    locked: true
+name: 'EIF solution type'
+vid: eif_solution_type
+description: 'A categorization of the solutions for the EIF toolbox.'
+weight: 0
diff --git a/config/sync/theme_rule.rule.eif_perspective_form.yml b/config/sync/theme_rule.rule.eif_perspective_form.yml
new file mode 100644
index 0000000000000000000000000000000000000000..0cb4d7eb7b6cd253fb3158fdca1a30069764811d
--- /dev/null
+++ b/config/sync/theme_rule.rule.eif_perspective_form.yml
@@ -0,0 +1,18 @@
+uuid: 75d0ef37-b33b-4892-afd7-07f862f66c22
+langcode: en
+status: true
+dependencies:
+  module:
+    - joinup_core
+  theme:
+    - ventuno
+id: eif_perspective_form
+label: 'EIF perspective form'
+theme: ventuno
+weight: 0
+conditions:
+  request_route:
+    id: request_route
+    negate: false
+    routes:
+      - eif.eif_perspective_form
diff --git a/config/sync/theme_rule.rule.eif_wrapper.yml b/config/sync/theme_rule.rule.eif_wrapper.yml
new file mode 100644
index 0000000000000000000000000000000000000000..51cbd28e83d312c4f7b7a4b86b9dab1995a8c0e9
--- /dev/null
+++ b/config/sync/theme_rule.rule.eif_wrapper.yml
@@ -0,0 +1,19 @@
+uuid: 5dc46554-3a90-4bc9-99f4-3da51609fe13
+langcode: en
+status: true
+dependencies:
+  module:
+    - joinup_core
+    - system
+  theme:
+    - ventuno
+id: eif_wrapper
+label: 'EIF Wrapper'
+theme: ventuno
+weight: 0
+conditions:
+  request_route:
+    id: request_route
+    negate: false
+    routes:
+      - solution.eif_perspective.form
diff --git a/config/sync/theme_rule.rule.entity.rdf_entity.eif_perspective.yml b/config/sync/theme_rule.rule.entity.rdf_entity.eif_perspective.yml
new file mode 100644
index 0000000000000000000000000000000000000000..1c40ffd7eca804d632768e9706d2cc322f6828bf
--- /dev/null
+++ b/config/sync/theme_rule.rule.entity.rdf_entity.eif_perspective.yml
@@ -0,0 +1,18 @@
+uuid: 99ae5508-e6b8-4402-b496-a7dcfdbaca10
+langcode: en
+status: true
+dependencies:
+  module:
+    - joinup_core
+  theme:
+    - ventuno
+id: entity.rdf_entity.eif_perspective
+label: 'EIF Perspective'
+theme: ventuno
+weight: 0
+conditions:
+  request_route:
+    id: request_route
+    negate: false
+    routes:
+      - entity.rdf_entity.eif_perspective
diff --git a/config/sync/user.role.anonymous.yml b/config/sync/user.role.anonymous.yml
index ca5071b9bc591ea2ba082b72fbaf41e29b880c70..c0c9ff2873d47eee6a216b725f739d975eba45cb 100644
--- a/config/sync/user.role.anonymous.yml
+++ b/config/sync/user.role.anonymous.yml
@@ -7,6 +7,7 @@ dependencies:
     - filter.format.simple_text
   module:
     - comment
+    - eif
     - entity_legal
     - filter
     - joinup_licence
@@ -14,6 +15,7 @@ dependencies:
     - paragraphs_type_permissions
     - rdf_entity
     - rdf_export
+    - rdf_meta_entity
     - search_api_autocomplete
     - system
     - tour
@@ -34,6 +36,8 @@ permissions:
   - 'use text format basic_html'
   - 'use text format simple_text'
   - 'view compatibility documents'
+  - 'view eif wrapper entity'
+  - 'view eif_perspective rdf-meta-entity'
   - 'view media'
   - 'view paragraph content accordion'
   - 'view paragraph content accordion_item'
diff --git a/config/sync/user.role.authenticated.yml b/config/sync/user.role.authenticated.yml
index 03e29c7c32950f0ef40db2ccbc6d1b37facb8b62..7b3dec5f193d5e1b9667c7d680e43a689e492cb3 100644
--- a/config/sync/user.role.authenticated.yml
+++ b/config/sync/user.role.authenticated.yml
@@ -13,6 +13,7 @@ dependencies:
   module:
     - comment
     - contextual
+    - eif
     - entity_legal
     - filter
     - flag
@@ -23,6 +24,7 @@ dependencies:
     - paragraphs_type_permissions
     - rdf_entity
     - rdf_export
+    - rdf_meta_entity
     - search_api_autocomplete
     - state_machine_permissions
     - system
@@ -140,6 +142,8 @@ permissions:
   - 'use text format glossary_html'
   - 'use text format simple_html'
   - 'view compatibility documents'
+  - 'view eif wrapper entity'
+  - 'view eif_perspective rdf-meta-entity'
   - 'view media'
   - 'view own unpublished content'
   - 'view paragraph content accordion'
diff --git a/config/sync/user.role.moderator.yml b/config/sync/user.role.moderator.yml
index 26e9c653d1a18a483e244f2a18330b6f77237717..b455625d2ba0024b759684b02b8491099a4d6c19 100644
--- a/config/sync/user.role.moderator.yml
+++ b/config/sync/user.role.moderator.yml
@@ -18,6 +18,7 @@ dependencies:
     - comment
     - contact_form
     - dashboard
+    - eif
     - entity_legal
     - entityqueue
     - field_permissions
@@ -41,6 +42,7 @@ dependencies:
     - pipeline
     - rdf_draft
     - rdf_entity
+    - rdf_meta_entity
     - site_alert
     - solution
     - state_machine_permissions
@@ -91,6 +93,8 @@ permissions:
   - 'create collection_banner media'
   - 'create collection_logo media'
   - 'create discussion content'
+  - 'create eif wrapper entity'
+  - 'create eif_perspective rdf-meta-entity'
   - 'create event_banner media'
   - 'create event_logo media'
   - 'create field_is_eif_category'
@@ -116,6 +120,7 @@ permissions:
   - 'delete any solution_logo media'
   - 'delete asset_release rdf entity'
   - 'delete contact_information rdf entity'
+  - 'delete eif wrapper entity'
   - 'delete licence rdf entity'
   - 'delete owner rdf entity'
   - 'delete paragraph content iframe'
@@ -280,6 +285,8 @@ permissions:
   - 'unfeature entity'
   - 'update any simple_block block content'
   - 'update collection_settings meta-entity'
+  - 'update eif wrapper entity'
+  - 'update eif_perspective rdf-meta-entity'
   - 'update highlighted_content entityqueue'
   - 'update highlighted_event entityqueue'
   - 'update paragraph content iframe'
@@ -287,6 +294,7 @@ permissions:
   - 'update site alerts'
   - 'update spotlight entityqueue'
   - 'view any unpublished content'
+  - 'view eif wrapper entity'
   - 'view field_is_eif_category'
   - 'view field_is_eif_recommendation'
   - 'view licence overview page'
diff --git a/config/sync/views.view.solutions_meta_entity.yml b/config/sync/views.view.solutions_meta_entity.yml
new file mode 100644
index 0000000000000000000000000000000000000000..654133348f03b98d953b8bae908eb82d19150bca
--- /dev/null
+++ b/config/sync/views.view.solutions_meta_entity.yml
@@ -0,0 +1,578 @@
+uuid: 35e0d80f-d86a-429f-a580-c26a4a8ad72c
+langcode: en
+status: true
+dependencies:
+  config:
+    - field.storage.rdf_entity.field_is_eif_category
+    - search_api.index.published
+  module:
+    - options
+    - search_api
+id: solutions_meta_entity
+label: 'Solutions w/meta entity'
+module: views
+description: ''
+tag: ''
+base_table: search_api_index_published
+base_field: search_api_id
+display:
+  default:
+    id: default
+    display_title: Default
+    display_plugin: default
+    position: 0
+    display_options:
+      title: 'Solutions w/meta entity'
+      fields:
+        label:
+          id: label
+          table: search_api_datasource_published_entity_rdf_entity
+          field: label
+          relationship: none
+          group_type: group
+          admin_label: ''
+          entity_type: rdf_entity
+          plugin_id: search_api_field
+          label: ''
+          exclude: false
+          alter:
+            alter_text: false
+            text: ''
+            make_link: false
+            path: ''
+            absolute: false
+            external: false
+            replace_spaces: false
+            path_case: none
+            trim_whitespace: false
+            alt: ''
+            rel: ''
+            link_class: ''
+            prefix: ''
+            suffix: ''
+            target: ''
+            nl2br: false
+            max_length: 0
+            word_boundary: true
+            ellipsis: true
+            more_link: false
+            more_link_text: ''
+            more_link_path: ''
+            strip_tags: false
+            trim: false
+            preserve_tags: ''
+            html: false
+          element_type: ''
+          element_class: ''
+          element_label_type: ''
+          element_label_class: ''
+          element_label_colon: false
+          element_wrapper_type: ''
+          element_wrapper_class: ''
+          element_default_classes: true
+          empty: ''
+          hide_empty: false
+          empty_zero: false
+          hide_alter_empty: true
+          click_sort_column: value
+          type: string
+          settings:
+            link_to_entity: false
+          group_column: value
+          group_columns: {  }
+          group_rows: true
+          delta_limit: 0
+          delta_offset: 0
+          delta_reversed: false
+          delta_first_last: false
+          multi_type: separator
+          separator: ', '
+          field_api_classes: false
+          field_rendering: true
+          fallback_handler: search_api
+          fallback_options:
+            link_to_item: false
+            use_highlighting: false
+            multi_type: separator
+            multi_separator: ', '
+        eif_perspective_layer:
+          id: eif_perspective_layer
+          table: search_api_index_published
+          field: eif_perspective_layer
+          relationship: none
+          group_type: group
+          admin_label: ''
+          plugin_id: search_api_field
+          label: ''
+          exclude: false
+          alter:
+            alter_text: false
+            text: ''
+            make_link: false
+            path: ''
+            absolute: false
+            external: false
+            replace_spaces: false
+            path_case: none
+            trim_whitespace: false
+            alt: ''
+            rel: ''
+            link_class: ''
+            prefix: ''
+            suffix: ''
+            target: ''
+            nl2br: false
+            max_length: 0
+            word_boundary: true
+            ellipsis: true
+            more_link: false
+            more_link_text: ''
+            more_link_path: ''
+            strip_tags: false
+            trim: false
+            preserve_tags: ''
+            html: false
+          element_type: ''
+          element_class: ''
+          element_label_type: ''
+          element_label_class: ''
+          element_label_colon: false
+          element_wrapper_type: ''
+          element_wrapper_class: ''
+          element_default_classes: true
+          empty: ''
+          hide_empty: false
+          empty_zero: false
+          hide_alter_empty: true
+          click_sort_column: value
+          type: string
+          settings:
+            link_to_entity: false
+          group_column: value
+          group_columns: {  }
+          group_rows: true
+          delta_limit: 0
+          delta_offset: 0
+          delta_reversed: false
+          delta_first_last: false
+          multi_type: separator
+          separator: ', '
+          field_api_classes: false
+          field_rendering: true
+          fallback_handler: search_api
+          fallback_options:
+            link_to_item: false
+            use_highlighting: false
+            multi_type: separator
+            multi_separator: ', '
+        eif_perspective_model:
+          id: eif_perspective_model
+          table: search_api_index_published
+          field: eif_perspective_model
+          relationship: none
+          group_type: group
+          admin_label: ''
+          plugin_id: search_api_field
+          label: ''
+          exclude: false
+          alter:
+            alter_text: false
+            text: ''
+            make_link: false
+            path: ''
+            absolute: false
+            external: false
+            replace_spaces: false
+            path_case: none
+            trim_whitespace: false
+            alt: ''
+            rel: ''
+            link_class: ''
+            prefix: ''
+            suffix: ''
+            target: ''
+            nl2br: false
+            max_length: 0
+            word_boundary: true
+            ellipsis: true
+            more_link: false
+            more_link_text: ''
+            more_link_path: ''
+            strip_tags: false
+            trim: false
+            preserve_tags: ''
+            html: false
+          element_type: ''
+          element_class: ''
+          element_label_type: ''
+          element_label_class: ''
+          element_label_colon: false
+          element_wrapper_type: ''
+          element_wrapper_class: ''
+          element_default_classes: true
+          empty: ''
+          hide_empty: false
+          empty_zero: false
+          hide_alter_empty: true
+          click_sort_column: value
+          type: string
+          settings:
+            link_to_entity: false
+          group_column: value
+          group_columns: {  }
+          group_rows: true
+          delta_limit: 0
+          delta_offset: 0
+          delta_reversed: false
+          delta_first_last: false
+          multi_type: separator
+          separator: ', '
+          field_api_classes: false
+          field_rendering: true
+          fallback_handler: search_api
+          fallback_options:
+            link_to_item: false
+            use_highlighting: false
+            multi_type: separator
+            multi_separator: ', '
+        eif_perspective_principle:
+          id: eif_perspective_principle
+          table: search_api_index_published
+          field: eif_perspective_principle
+          relationship: none
+          group_type: group
+          admin_label: ''
+          plugin_id: search_api_field
+          label: ''
+          exclude: false
+          alter:
+            alter_text: false
+            text: ''
+            make_link: false
+            path: ''
+            absolute: false
+            external: false
+            replace_spaces: false
+            path_case: none
+            trim_whitespace: false
+            alt: ''
+            rel: ''
+            link_class: ''
+            prefix: ''
+            suffix: ''
+            target: ''
+            nl2br: false
+            max_length: 0
+            word_boundary: true
+            ellipsis: true
+            more_link: false
+            more_link_text: ''
+            more_link_path: ''
+            strip_tags: false
+            trim: false
+            preserve_tags: ''
+            html: false
+          element_type: ''
+          element_class: ''
+          element_label_type: ''
+          element_label_class: ''
+          element_label_colon: false
+          element_wrapper_type: ''
+          element_wrapper_class: ''
+          element_default_classes: true
+          empty: ''
+          hide_empty: false
+          empty_zero: false
+          hide_alter_empty: true
+          click_sort_column: value
+          type: string
+          settings:
+            link_to_entity: false
+          group_column: value
+          group_columns: {  }
+          group_rows: true
+          delta_limit: 0
+          delta_offset: 0
+          delta_reversed: false
+          delta_first_last: false
+          multi_type: separator
+          separator: ', '
+          field_api_classes: false
+          field_rendering: true
+          fallback_handler: search_api
+          fallback_options:
+            link_to_item: false
+            use_highlighting: false
+            multi_type: separator
+            multi_separator: ', '
+        field_is_eif_category:
+          id: field_is_eif_category
+          table: search_api_index_published
+          field: field_is_eif_category
+          relationship: none
+          group_type: group
+          admin_label: ''
+          plugin_id: search_api_field
+          label: 'Solution category'
+          exclude: false
+          alter:
+            alter_text: false
+            text: ''
+            make_link: false
+            path: ''
+            absolute: false
+            external: false
+            replace_spaces: false
+            path_case: none
+            trim_whitespace: false
+            alt: ''
+            rel: ''
+            link_class: ''
+            prefix: ''
+            suffix: ''
+            target: ''
+            nl2br: false
+            max_length: 0
+            word_boundary: true
+            ellipsis: true
+            more_link: false
+            more_link_text: ''
+            more_link_path: ''
+            strip_tags: false
+            trim: false
+            preserve_tags: ''
+            html: false
+          element_type: ''
+          element_class: ''
+          element_label_type: ''
+          element_label_class: ''
+          element_label_colon: false
+          element_wrapper_type: ''
+          element_wrapper_class: ''
+          element_default_classes: true
+          empty: ''
+          hide_empty: true
+          empty_zero: false
+          hide_alter_empty: true
+          click_sort_column: value
+          type: list_default
+          settings: {  }
+          group_column: value
+          group_columns: {  }
+          group_rows: true
+          delta_limit: 0
+          delta_offset: 0
+          delta_reversed: false
+          delta_first_last: false
+          multi_type: separator
+          separator: ', '
+          field_api_classes: false
+          field_rendering: true
+          fallback_handler: search_api
+          fallback_options:
+            link_to_item: false
+            use_highlighting: false
+            multi_type: separator
+            multi_separator: ', '
+      pager:
+        type: none
+        options:
+          offset: 0
+          items_per_page: 0
+      exposed_form:
+        type: basic
+        options:
+          submit_button: Apply
+          reset_button: false
+          reset_button_label: Reset
+          exposed_sorts_label: 'Sort by'
+          expose_sort_order: true
+          sort_asc_label: Asc
+          sort_desc_label: Desc
+      access:
+        type: none
+        options: {  }
+      cache:
+        type: search_api_tag
+        options: {  }
+      empty: {  }
+      sorts:
+        label:
+          id: label
+          table: search_api_index_published
+          field: label
+          relationship: none
+          group_type: group
+          admin_label: ''
+          plugin_id: search_api
+          order: ASC
+          expose:
+            label: ''
+            field_identifier: ''
+          exposed: false
+      arguments: {  }
+      filters:
+        entity_bundle:
+          id: entity_bundle
+          table: search_api_index_published
+          field: entity_bundle
+          relationship: none
+          group_type: group
+          admin_label: ''
+          plugin_id: search_api_string
+          operator: '='
+          value:
+            min: ''
+            max: ''
+            value: solution
+          group: 1
+          exposed: false
+          expose:
+            operator_id: ''
+            label: ''
+            description: ''
+            use_operator: false
+            operator: ''
+            operator_limit_selection: false
+            operator_list: {  }
+            identifier: ''
+            required: false
+            remember: false
+            multiple: false
+            remember_roles:
+              authenticated: authenticated
+            min_placeholder: ''
+            max_placeholder: ''
+            placeholder: ''
+          is_grouped: false
+          group_info:
+            label: ''
+            description: ''
+            identifier: ''
+            optional: true
+            widget: select
+            multiple: false
+            remember: false
+            default_group: All
+            default_group_multiple: {  }
+            group_items: {  }
+        eif_perspective:
+          id: eif_perspective
+          table: search_api_index_published
+          field: eif_perspective
+          relationship: none
+          group_type: group
+          admin_label: ''
+          plugin_id: search_api_string
+          operator: 'not empty'
+          value:
+            min: ''
+            max: ''
+            value: ''
+          group: 1
+          exposed: false
+          expose:
+            operator_id: ''
+            label: ''
+            description: ''
+            use_operator: false
+            operator: ''
+            operator_limit_selection: false
+            operator_list: {  }
+            identifier: ''
+            required: false
+            remember: false
+            multiple: false
+            remember_roles:
+              authenticated: authenticated
+            min_placeholder: ''
+            max_placeholder: ''
+            placeholder: ''
+          is_grouped: false
+          group_info:
+            label: ''
+            description: ''
+            identifier: ''
+            optional: true
+            widget: select
+            multiple: false
+            remember: false
+            default_group: All
+            default_group_multiple: {  }
+            group_items: {  }
+      filter_groups:
+        operator: AND
+        groups:
+          1: AND
+      style:
+        type: default
+      row:
+        type: search_api
+        options:
+          view_modes:
+            'entity:node':
+              custom_page: default
+              discussion: default
+              document: default
+              event: default
+              news: default
+              tallinn_report: default
+              video: default
+            'entity:rdf_entity':
+              asset_distribution: default
+              asset_release: default
+              collection: default
+              licence: default
+              solution: view_mode_search_list_item
+              spdx_licence: default
+            'entity:taxonomy_term':
+              eif_conceptual_model: default
+              eif_interoperability_layer: default
+              eif_principle: default
+              eif_recommendation: default
+              topic: default
+            'entity:user':
+              user: default
+      query:
+        type: search_api_query
+        options:
+          bypass_access: false
+          skip_access: false
+          preserve_facet_query_args: false
+      relationships: {  }
+      header: {  }
+      footer: {  }
+      display_extenders: {  }
+    cache_metadata:
+      max-age: -1
+      contexts:
+        - 'languages:language_content'
+        - 'languages:language_interface'
+        - 'user.node_grants:view'
+      tags:
+        - 'config:field.storage.rdf_entity.field_is_eif_category'
+        - 'config:search_api.index.published'
+  solutions_meta_entity_block:
+    id: solutions_meta_entity_block
+    display_title: Block
+    display_plugin: block
+    position: 1
+    display_options:
+      cache:
+        type: none
+        options: {  }
+      defaults:
+        cache: false
+      display_extenders:
+        metatag_display_extender:
+          metatags: {  }
+          tokenize: false
+    cache_metadata:
+      max-age: -1
+      contexts:
+        - 'languages:language_content'
+        - 'languages:language_interface'
+        - 'user.node_grants:view'
+      tags:
+        - 'config:field.storage.rdf_entity.field_is_eif_category'
+        - 'config:search_api.index.published'
diff --git a/resources/fixtures/eif_solution_type.rdf b/resources/fixtures/eif_solution_type.rdf
new file mode 100644
index 0000000000000000000000000000000000000000..8ce821bab5722c95f0166f3a6b9964b077b91b27
--- /dev/null
+++ b/resources/fixtures/eif_solution_type.rdf
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+         xmlns:adms="http://www.w3.org/ns/adms#"
+         xmlns:skos="http://www.w3.org/2004/02/skos/core#"
+         xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
+         xmlns:dc="http://purl.org/dc/terms/">
+
+  <skos:ConceptScheme rdf:about="http://data.europa.eu/eif/SolutionType/">
+    <rdfs:label>The European Interoperability Framework (EIF) solution type</rdfs:label>
+    <skos:prefLabel xml:lang="en">The European Interoperability Framework (EIF) solution type</skos:prefLabel>
+    <adms:identifier></adms:identifier>
+
+  </skos:ConceptScheme>
+
+  <skos:Concept rdf:about="http://data.europa.eu/eif/SolutionType/71244b7e-67cf-4fe4-b937-6346844ce645">
+    <skos:prefLabel xml:lang="en">Assessment tools</skos:prefLabel>
+    <skos:inScheme rdf:resource="http://data.europa.eu/eif/SolutionType/"/>
+    <adms:identifier>1</adms:identifier>
+  </skos:Concept>
+
+  <skos:Concept rdf:about="http://data.europa.eu/eif/SolutionType/4168f0f9-461f-4292-9198-c71a22a157e1">
+    <skos:prefLabel xml:lang="en">Common frameworks</skos:prefLabel>
+    <skos:inScheme rdf:resource="http://data.europa.eu/eif/SolutionType/"/>
+    <adms:identifier>2</adms:identifier>
+  </skos:Concept>
+
+  <skos:Concept rdf:about="http://data.europa.eu/eif/SolutionType/0670b7fa-f56d-4c16-918d-82ca359c4331">
+    <skos:prefLabel xml:lang="en">Common services</skos:prefLabel>
+    <skos:inScheme rdf:resource="http://data.europa.eu/eif/SolutionType/"/>
+    <adms:identifier>3</adms:identifier>
+  </skos:Concept>
+
+  <skos:Concept rdf:about="http://data.europa.eu/eif/SolutionType/867a2cf9-bbdb-40c0-ab60-2fa37847ff68">
+    <skos:prefLabel xml:lang="en">Generic tools</skos:prefLabel>
+    <skos:inScheme rdf:resource="http://data.europa.eu/eif/SolutionType/"/>
+    <adms:identifier>4</adms:identifier>
+  </skos:Concept>
+
+  <skos:Concept rdf:about="http://data.europa.eu/eif/SolutionType/b912ca62-ba11-4be7-94f6-0545dc5a3be0">
+    <skos:prefLabel xml:lang="en">Legal interoperability tools</skos:prefLabel>
+    <skos:inScheme rdf:resource="http://data.europa.eu/eif/SolutionType/"/>
+    <adms:identifier>5</adms:identifier>
+  </skos:Concept>
+
+  <skos:Concept rdf:about="http://data.europa.eu/eif/SolutionType/aa625643-c0c1-497d-b25f-852b2b86e4ca">
+    <skos:prefLabel xml:lang="en">Semantic assets</skos:prefLabel>
+    <skos:inScheme rdf:resource="http://data.europa.eu/eif/SolutionType/"/>
+    <adms:identifier>6</adms:identifier>
+  </skos:Concept>
+
+  <skos:Concept rdf:about="http://data.europa.eu/eif/SolutionType/a1074ec0-a479-4517-8529-22eb346e36b1">
+    <skos:prefLabel xml:lang="en">Catalogue of open standards and specifications</skos:prefLabel>
+    <skos:inScheme rdf:resource="http://data.europa.eu/eif/SolutionType/"/>
+    <adms:identifier>7</adms:identifier>
+  </skos:Concept>
+
+</rdf:RDF>
diff --git a/resources/runner/dev.yml b/resources/runner/dev.yml
index 75771ef3b02bc2b2953c03faa9f82b016b3fd701..5a9529e05e3c7741bc514e9cae16eec018da5c4c 100644
--- a/resources/runner/dev.yml
+++ b/resources/runner/dev.yml
@@ -59,7 +59,7 @@ commands:
     # Make sure CAS mock server module is installed.
     - task: run
       command: drush:module-install
-      arguments: cas_mock_server
+      arguments: joinup_cas_mock_server
     - task: exec
       command: ${drush.bin}
       arguments:
@@ -183,6 +183,7 @@ commands:
         - resources/fixtures/eif_interoperability_layer.rdf
         - resources/fixtures/eif_principle.rdf
         - resources/fixtures/eif_recommendation.rdf
+        - resources/fixtures/eif_solution_type.rdf
         - resources/fixtures/EIRA_SKOS.rdf
         - resources/fixtures/filetypes-skos.rdf
         - resources/fixtures/languages-skos.rdf
diff --git a/scripts/check_status_report.php b/scripts/check_status_report.php
index a14dc5a681734be14c7f12489858e81e260f9bcc..78e90596cb35247d19a4d031d979580706b0c5dd 100755
--- a/scripts/check_status_report.php
+++ b/scripts/check_status_report.php
@@ -18,14 +18,14 @@
 $ignored_requirements = getenv('DRUPAL_STATUS_REPORT_IGNORE') ?: 'update status,joinup_core_root_user_blocked,search_api_solr_schema_joinup_modifications';
 $ignored_option = "--ignore='$ignored_requirements'";
 
-function run_status_report(bool $title_only): string {
+function run_status_report(bool $title_only): ?string {
   global $ignored_option;
   $command = __DIR__ . "/../vendor/bin/drush core:requirements --severity=1 $ignored_option ";
   $command .= $title_only ? '--field=title' : '--fields=title,severity,value,description';
-  return trim(shell_exec($command));
+  return shell_exec($command);
 }
 
-if (run_status_report(TRUE)) {
+if (run_status_report(TRUE) !== NULL) {
   print "Status Report shows errors & warnings\n";
   print run_status_report(FALSE) . "\n";
   exit(1);
diff --git a/tests/features/collection/collection.member_administration.feature b/tests/features/collection/collection.member_administration.feature
index e675bb39be6bdf0555acb74ff3581195bafde602..adf5f571700151957a80009ad7dcc39fd14f9897 100644
--- a/tests/features/collection/collection.member_administration.feature
+++ b/tests/features/collection/collection.member_administration.feature
@@ -441,7 +441,7 @@ Feature: Collection membership administration
     When I fill in "E-mail" with "pending_member@example.com"
     And I press "Add"
     Then the page should show the following chips in the Content region:
-      | Pending Member   |
+      | Pending Member |
     And I press "Invite members"
     Then I should not see the success message "Successfully invited the selected users."
     And I should see the error message "1 user has a pending membership. Please, approve their membership request and assign the roles."
diff --git a/tests/features/collection/propose.feature b/tests/features/collection/propose.feature
index f7bb8cd5360e3d0afeb7079c7e71d58088f42397..bf7d9039d5becda1b37cf6e943552de629f7133e 100644
--- a/tests/features/collection/propose.feature
+++ b/tests/features/collection/propose.feature
@@ -191,6 +191,7 @@ Feature: Proposing a collection
 
     When I go to the edit form of the "Just a proposal" collection
     And I press "Additional fields"
+    And I scroll "Logo" into view
     Then I should see the link "logo.png"
 
     # As some entities were created via UI, we should explicitly delete them.
diff --git a/tests/features/communities/eif/api.feature b/tests/features/communities/eif/api.feature
new file mode 100644
index 0000000000000000000000000000000000000000..b9f7fee3443948e2fdfaaca0e472d6f81c25a15b
--- /dev/null
+++ b/tests/features/communities/eif/api.feature
@@ -0,0 +1,61 @@
+@api
+Feature:
+  Basic test steps for the EIF perspective meta entity.
+
+  Scenario: Create an EIF perspective and view the data.
+    Given the following solutions:
+      | title         | description                                      | state     |
+      | EIF solution  | Some description not to be shown in the EIF page | validated |
+      | EIF only type | Some description not to be shown in the EIF page | validated |
+    Given the following EIF perspective data for the "EIF solution" solution:
+      | Description    | This should be in the description field.                                                       |
+      | Solution type  | Common frameworks                                                                              |
+      | Principle      | Underlying Principle 1: Subsidiarity and proportionality, Underlying Principle 3: Transparency |
+      | Layer          | Interoperability Layer 3: Legal interoperability                                               |
+      | Recommendation | name: Recommendation 21, description: This is recommended                                      |
+      | Recommendation | name: Recommendation 15, description: This is also recommended                                 |
+    Given the following EIF perspective data for the "EIF only type" solution:
+      | Description   | This should be in the description field. |
+      | Solution type | Common frameworks                        |
+    Then there should be an EIF perspective associated with the "EIF solution" solution
+    And there should be an EIF perspective associated with the "EIF only type" solution
+
+    When I go to the EIF perspective page of the "EIF solution" solution
+    Then I should see the heading "EIF solution"
+    And I should see the heading "General information"
+
+    And I should see the text "This should be in the description field."
+    But I should not see the text "Some description not to be shown in the EIF page"
+
+    # Verify that only columns with data are shown.
+    And I should see the heading "Principles"
+    And I should see the heading "Interoperability layers"
+    And I should see the text "implements the following EIF recommendations as explained below"
+    But I should not see the heading "Conceptual model"
+
+    And I should see the text "Common frameworks"
+    And I should see the following links:
+      | Subsidiarity and proportionality |
+      | Transparency                     |
+      | Legal interoperability           |
+
+    And I should see the following lines of text:
+      # Recommendation titles appear with their related term a
+      # "Recommendation [identifier] | Term name".
+      | Recommendation 21 \| Interoperability Layer 1: Interoperability governance |
+      | This is recommended                                                        |
+      | Recommendation 15                                                          |
+      | Recommendation 15 \| Underlying Principle 8: Security and privacy          |
+
+    When I go to the EIF perspective page of the "EIF only type" solution
+    Then I should see the heading "EIF only type"
+    And I should see the heading "General information"
+
+    And I should see the text "This should be in the description field."
+    But I should not see the text "Some description not to be shown in the EIF page"
+
+    # Verify that only columns with data are shown.
+    And I should not see the heading "Principles"
+    And I should not see the heading "Interoperability layers"
+    But I should not see the heading "Conceptual model"
+    And I should not see the text "implements the following EIF recommendations as explained below"
diff --git a/tests/features/communities/eif/rdf_meta_entity.bundles.feature b/tests/features/communities/eif/rdf_meta_entity.bundles.feature
new file mode 100644
index 0000000000000000000000000000000000000000..ea64f1295a313bf4a90aeee98f863ece4747cfaa
--- /dev/null
+++ b/tests/features/communities/eif/rdf_meta_entity.bundles.feature
@@ -0,0 +1,63 @@
+@api
+Feature:
+  In order to manage the EIF perspective
+  as a user of the website
+  I need to be able to access a page where I can configure them.
+
+  Background:
+    Given solutions:
+      | title             | state     |
+      | Some EIF solution | validated |
+
+  Scenario Outline: Only moderators can access the EIF perspective page.
+    Given I am <role>
+    And I go to the "Some EIF solution" solution
+    Then I should <see or not see> the link "EIF perspective"
+
+    Examples:
+      | role                                                           | see or not see |
+      | not logged in                                                  | not see        |
+      | logged in as a user with the authenticated role                | not see        |
+      | logged in as a facilitator of the "Some EIF solution" solution | not see        |
+      | logged in as a user with the moderator role                    | see            |
+
+  Scenario: The authorized user should be able to add edit all available fields.
+    Given I am logged in as a user with the moderator role
+    And I go to the "Some EIF solution" solution
+    And I click "EIF perspective"
+    Then I should see the heading "Some EIF solution EIF perspective"
+    And the following fields should be present "Description, Type of solution"
+    And the following field widgets should be present "Principle, Layer, Model, Recommendation"
+
+    When I press "Save"
+    Then I should see the following error messages:
+      | error messages                                                                                    |
+      | Type of solution field is required.                                                               |
+      | An EIF perspective cannot be created without any information. Please, fill in at least one field. |
+
+    Given I fill in "Description" with "It will be an amazing principle."
+    # Solution type.
+    And I check "Assessment tools"
+    And I check "Common frameworks"
+    # Principle.
+    And I check "Subsidiarity and proportionality"
+    And I check "Openness"
+    # Model.
+    And I check "Coordination function"
+    When I press "Save"
+
+    Then I should see the heading "Some EIF solution"
+    When I click "EIF perspective"
+
+    And I press "Add new"
+    # Test the '_none' option label, the better naming of the recommendations
+    # and the order - that 10 does not come after 1 (string comparison) and 2
+    # follows normally.
+    Then the "EIF qualifier" select should contain the following options:
+      | - Select a Recommendation -                                                 |
+      | Recommendation 1 - Underlying Principle 1: Subsidiarity and proportionality |
+      | Recommendation 2 - Underlying Principle 2: Openness                         |
+
+    Given I select "Recommendation 2 - Underlying Principle 2: Openness" from "EIF qualifier"
+    And I press "Save"
+    Then I should see the heading "Some EIF solution"
diff --git a/tests/features/communities/eif/toolbox.feature b/tests/features/communities/eif/toolbox.feature
new file mode 100644
index 0000000000000000000000000000000000000000..7496dc9600c622343018eac4f09f593121bc86b6
--- /dev/null
+++ b/tests/features/communities/eif/toolbox.feature
@@ -0,0 +1,183 @@
+@api @eif_community @terms @group-e
+Feature:
+  As the owner of the EIF toolbox
+  in order to make it easier for users to find appropriate solutions
+  I need to be able to present them in a nice searchable way.
+
+  @javascript
+  Scenario: Present and search the solutions.
+    Given owner:
+      | name | type    |
+      | ACDC | Company |
+    And collections:
+      | title   | state     |
+      | Killjoy | validated |
+      | Sage    | validated |
+      | Phoenix | draft     |
+    And solutions:
+      | title    | eif reference                      | eif category    | collection | state     |
+      | Jordan 1 | Recommendation 1, Recommendation 2 | Common services | Killjoy    | validated |
+      | Jordan 2 | Recommendation 4                   | Common services | Sage       | validated |
+      | Jordan 3 | Recommendation 5, Recommendation 2 | Common services | Sage       | draft     |
+      | Jordan 4 | Recommendation 3, Recommendation 1 | Common services | Phoenix    | validated |
+      | Jordan 5 | Recommendation 4                   | Common services | Killjoy    | draft     |
+
+    # Visit the toolbox page once to ensure that solutions are properly
+    # re-indexed when an EIF perspective is created or deleted and that
+    # cache is invalidated properly.
+    Given I visit the "Online Assistant" custom page
+    Then I should not see the following headings:
+      | Jordan 1 |
+      | Jordan 2 |
+      | Jordan 3 |
+      | Jordan 4 |
+      | Jordan 5 |
+
+    Given the following EIF perspective data for the "Jordan 1" solution:
+      | Description      | It will be an amazing principle.                                                                                     |
+      | Type of solution | Common services                                                                                                      |
+      | Solution type    | Assessment tools, Generic tools                                                                                      |
+      | Layer            | Interoperability Layer 3: Legal interoperability                                                                     |
+      | Model            | Basic Component 1: Coordination function                                                                             |
+      | Principle        | Underlying Principle 2: Openness, Underlying Principle 3: Transparency, Underlying Principle 8: Security and privacy |
+    And the following EIF perspective data for the "Jordan 2" solution:
+      | Description   | It will be an amazing principle.                 |
+      | Solution type | Assessment tools, Generic tools                  |
+      | Layer         | Interoperability Layer 3: Legal interoperability |
+      | Model         | Basic Component 1: Coordination function         |
+      | Principle     | Underlying Principle 3: Transparency             |
+    And the following EIF perspective data for the "Jordan 3" solution:
+      | Description   | It will be an amazing principle.                      |
+      | Solution type | Common services                                       |
+      | Principle     | Underlying Principle 11: Preservation of information  |
+      | Layer         | Interoperability Layer 1: Interoperability governance |
+      | Model         | Basic Component 4: Open data                          |
+    And the following EIF perspective data for the "Jordan 4" solution:
+      | Description   | It will be an amazing principle.                      |
+      | Solution type | Common services                                       |
+      | Principle     | Underlying Principle 11: Preservation of information  |
+      | Layer         | Interoperability Layer 1: Interoperability governance |
+      | Model         | Basic Component 4: Open data                          |
+
+    When I visit the "Online Assistant" custom page
+    And I should see the following filter categories in the correct order:
+      | Underlying principles  |
+      | Interoperability layer |
+      | Conceptual model       |
+      | Solution category      |
+    And I should see the following headings:
+      | Jordan 1 |
+      | Jordan 2 |
+      | Jordan 4 |
+    But I should not see the following headings:
+      | Jordan 3 |
+      | Jordan 5 |
+
+    # Test the principles.
+    When I click "Transparency" in the "Content" region
+    Then I should see the following headings:
+      | Jordan 1 |
+      | Jordan 2 |
+    But I should not see the following headings:
+      | Jordan 3 |
+      | Jordan 4 |
+      | Jordan 5 |
+
+    # Test multiple options. Both "Transparency" and "Security and privacy" are
+    # selected.
+    When I click "Security and privacy" in the "Content" region
+    Then I should see the following headings:
+      | Jordan 1 |
+    But I should not see the following headings:
+      | Jordan 2 |
+      | Jordan 3 |
+      | Jordan 4 |
+      | Jordan 5 |
+
+    # Reset the options.
+    When I click "Transparency" in the "Content" region
+    When I click "Security and privacy" in the "Content" region
+    Then I should see the following headings:
+      | Jordan 1 |
+      | Jordan 2 |
+      | Jordan 4 |
+    But I should not see the following headings:
+      | Jordan 3 |
+      | Jordan 5 |
+
+    # Test the interoperability layer.
+    When I click "Legal interoperability" in the "Content" region
+    Then I should see the following headings:
+      | Jordan 1 |
+      | Jordan 2 |
+    But I should not see the following headings:
+      | Jordan 3 |
+      | Jordan 4 |
+      | Jordan 5 |
+
+    # Test selecting terms from more than one vocabularies.
+    When I click "Openness" in the "Content" region
+    Then I should see the following headings:
+      | Jordan 1 |
+    But I should not see the following headings:
+      | Jordan 2 |
+      | Jordan 3 |
+      | Jordan 4 |
+      | Jordan 5 |
+
+    # Reset the options.
+    When I click "Openness" in the "Content" region
+    When I click "Legal interoperability" in the "Content" region
+    Then I should see the following headings:
+      | Jordan 1 |
+      | Jordan 2 |
+      | Jordan 4 |
+    But I should not see the following headings:
+      | Jordan 3 |
+      | Jordan 5 |
+
+    # Test the conceptual model.
+    When I click "Open data" in the "Content" region
+    Then I should see the following headings:
+      | Jordan 4 |
+    But I should not see the following headings:
+      | Jordan 1 |
+      | Jordan 2 |
+      | Jordan 3 |
+      | Jordan 5 |
+
+    # Reset the options.
+    When I click "Open data" in the "Content" region
+    Then I should see the following headings:
+      | Jordan 1 |
+      | Jordan 2 |
+      | Jordan 4 |
+    But I should not see the following headings:
+      | Jordan 3 |
+      | Jordan 5 |
+
+    # Test the solution category.
+    When I click "Assessment tools" in the "Content" region
+    Then I should see the following headings:
+      | Jordan 1 |
+      | Jordan 2 |
+    Then I should not see the following headings:
+      | Jordan 3 |
+      | Jordan 4 |
+      | Jordan 5 |
+
+    # Reset the options.
+    When I click "Assessment tools" in the "Content" region
+    Then I should see the following headings:
+      | Jordan 1 |
+      | Jordan 2 |
+      | Jordan 4 |
+    But I should not see the following headings:
+      | Jordan 3 |
+      | Jordan 5 |
+
+    # Ensure that deleting an EIF perspective, the online assistant is updated
+    # as well.
+    Given I delete the EIF perspective of the "Jordan 1" solution
+    When I visit the "Online Assistant" custom page
+    And I should not see the heading "Jordan 1"
diff --git a/tests/features/update/post_update_108100.feature b/tests/features/update/post_update_108100.feature
new file mode 100644
index 0000000000000000000000000000000000000000..89ff5a7928fffa56b1d1a2c147961e46287c5a8e
--- /dev/null
+++ b/tests/features/update/post_update_108100.feature
@@ -0,0 +1,6 @@
+@api @group-clone
+Feature: Test update joinup_core_post_update_108100.
+
+  Scenario: Ensure that solution types have been imported.
+    Given I visit "/taxonomy/term/http_e_f_fdata_ceuropa_ceu_feif_fSolutionType_f0670b7fa_bf56d_b4c16_b918d_b82ca359c4331"
+    Then I should see the heading "Common services"
diff --git a/tests/src/Context/EifContext.php b/tests/src/Context/EifContext.php
index 756d9bca7b80ff968caf83862864dac8f4e17bf2..cb39ea8e2715c85d00331dccc6a06efb59bbd744 100644
--- a/tests/src/Context/EifContext.php
+++ b/tests/src/Context/EifContext.php
@@ -6,16 +6,24 @@
 
 use Behat\Behat\Hook\Scope\AfterScenarioScope;
 use Behat\Behat\Hook\Scope\BeforeScenarioScope;
+use Behat\Gherkin\Node\TableNode;
 use Drupal\Core\StringTranslation\StringTranslationTrait;
 use Drupal\Core\Url;
 use Drupal\DrupalExtension\Context\RawDrupalContext;
 use Drupal\eif\EifInterface;
+use Drupal\eif\EifWrapperInterface;
+use Drupal\eif\Entity\EifWrapper;
+use Drupal\joinup\Traits\EntityReferenceTrait;
+use Drupal\joinup\Traits\RdfEntityTrait;
 use Drupal\joinup\Traits\SearchTrait;
+use Drupal\joinup\Traits\TestingEntitiesTrait;
+use Drupal\joinup\Traits\UtilityTrait;
 use Drupal\menu_link_content\Entity\MenuLinkContent;
 use Drupal\node\Entity\Node;
 use Drupal\og\OgGroupAudienceHelperInterface;
 use Drupal\paragraphs\Entity\Paragraph;
 use Drupal\rdf_entity\Entity\Rdf;
+use Drupal\rdf_meta_entity\Entity\RdfMetaEntity;
 use Drupal\sparql_entity_storage\UriEncoder;
 use Drupal\taxonomy\Entity\Term;
 
@@ -24,8 +32,12 @@
  */
 class EifContext extends RawDrupalContext {
 
+  use EntityReferenceTrait;
+  use RdfEntityTrait;
   use SearchTrait;
   use StringTranslationTrait;
+  use TestingEntitiesTrait;
+  use UtilityTrait;
 
   /**
    * Creates the standard 'EIF' solution and a random parent collection.
@@ -92,6 +104,20 @@ public function setupEifData(BeforeScenarioScope $scope): void {
       ]),
     ])->save();
 
+    Node::create([
+      'type' => 'custom_page',
+      'nid' => EifInterface::EIF_ONLINE_ASSISTANT,
+      'title' => 'Online Assistant',
+      'og_audience' => EifInterface::EIF_ID,
+      'field_paragraphs_body' => Paragraph::create([
+        'type' => 'simple_paragraph',
+        'field_body' => [
+          'value' => '',
+          'format' => 'content_editor',
+        ],
+      ]),
+    ])->save();
+
     $instances = \Drupal::entityTypeManager()->getStorage('ogmenu_instance')->loadByProperties([
       'type' => 'navigation',
       OgGroupAudienceHelperInterface::DEFAULT_FIELD => $solution->id(),
@@ -157,4 +183,143 @@ public function cleanEifData(AfterScenarioScope $scope): void {
     $this->enableCommitOnUpdate();
   }
 
+  /**
+   * Generates an EIF perspective entity for a solution.
+   *
+   * @param \Behat\Gherkin\Node\TableNode $table_data
+   *   The table data.
+   * @param string $solution
+   *   The solution label.
+   *
+   * @Given the following EIF perspective data for the :solution solution:
+   */
+  public function givenEifPerspectiveOfSolution(TableNode $table_data, string $solution): void {
+    $solution = $this->getRdfEntityByLabel($solution, 'solution');
+    $qualifiers = [];
+    $eif_perspective_fields = [];
+    foreach ($table_data->getRows() as $row) {
+      switch ($row[0]) {
+        case 'Description':
+          $eif_perspective_fields['field_eif_description'] = trim($row[1]);
+          break;
+
+        case 'Solution type':
+          $eif_perspective_fields['field_eif_solution_type'] = $this->explodeCommaSeparatedStepArgument($row[1]);
+          break;
+
+        case 'Layer':
+        case 'Model':
+        case 'Principle':
+          $eif_perspective_fields['eif_' . strtolower($row[0])] = $this->explodeCommaSeparatedStepArgument($row[1]);
+          break;
+
+        case 'Recommendation':
+          $bundle = strtolower($row[0]);
+          // The following will split a phrase in the format of:
+          // name: Some title without comma, description: Some description.
+          //
+          // The part from the comma symbol on (the description) is optional.
+          preg_match_all('/name:(\s*?)(?<name>[^,]*)(?:,(\s*?)description:(\s*?)(?<description>.*$))?/', $row[1], $matches);
+          if (isset($matches['name'][0])) {
+            $values = ['term' => trim($matches['name'][0])];
+            if (isset($matches['description'][0])) {
+              $values['description'] = trim($matches['description'][0]);
+            }
+
+            $qualifiers['eif_recommendation'][] = $this->createEifWrapper($bundle, $values);
+          }
+          break;
+      }
+    }
+
+    $eif_perspective_fields = $this->convertEntityReferencesValues('rdf_meta_entity', 'eif_perspective', $eif_perspective_fields);
+    $eif_perspective = RdfMetaEntity::create([
+      'type' => 'eif_perspective',
+      'target' => $solution,
+    ] + $eif_perspective_fields + $qualifiers);
+    $eif_perspective->save();
+    $this->entities['rdf_meta_entity'][$eif_perspective->id()] = $eif_perspective;
+  }
+
+  /**
+   * Creates an EIF wrapper entity and returns it. Does not save the entity.
+   *
+   * @param string $bundle
+   *   The bundle of the EIF wrapper.
+   * @param array $values
+   *   An array of values of the EIF wrapper.
+   *
+   * @return \Drupal\eif\EifWrapperInterface
+   *   The created EIF wrapper.
+   */
+  protected function createEifWrapper(string $bundle, array $values): EifWrapperInterface {
+    $values = $this->convertEntityReferencesValues('eif_wrapper', $bundle, $values);
+    $values['type'] = $bundle;
+    $eif_wrapper = EifWrapper::create($values);
+    $eif_wrapper->save();
+    $this->entities['eif_wrapper'][$eif_wrapper->id()] = $eif_wrapper;
+    return $eif_wrapper;
+  }
+
+  /**
+   * Navigates to the EIF perspective page of the given solution.
+   *
+   * @param string $solution
+   *   The solution label.
+   *
+   * @Given I go to the EIF perspective page of the :solution solution
+   */
+  public function goToEifPerspectiveOfSolution(string $solution): void {
+    $solution = $this->getRdfEntityByLabel($solution, 'solution');
+    $url = Url::fromRoute('entity.rdf_entity.eif_perspective', [
+      'rdf_entity' => $solution->id(),
+    ]);
+    $this->visitPath($url->getInternalPath());
+  }
+
+  /**
+   * Navigates to the EIF perspective edit form of the given solution.
+   *
+   * @param string $solution
+   *   The solution label.
+   *
+   * @Given I go to the EIF perspective edit form of the :solution solution
+   */
+  public function goToEifEditFormOfSolution(string $solution): void {
+    $solution = $this->getRdfEntityByLabel($solution, 'solution');
+    $url = Url::fromRoute('eif.eif_perspective_form', [
+      'rdf_entity' => $solution->id(),
+    ]);
+    $this->visitPath($url->getInternalPath());
+  }
+
+  /**
+   * Asserts that there is an EIF perspective entity associated to the solution.
+   *
+   * @param string $solution
+   *   The solution label.
+   *
+   * @Given there should be an EIF perspective associated with the :solution solution
+   */
+  public function assertSolutionWithPerspective(string $solution): void {
+    $solution = $this->getRdfEntityByLabel($solution, 'solution');
+    if (empty(\Drupal::getContainer()->get('rdf_meta_entity.repository')->getMetaEntityForEntity($solution, 'eif_perspective'))) {
+      throw new \Exception('No perspective was found for the solution');
+    }
+  }
+
+  /**
+   * Deletes the EIF perspective of a solution.
+   *
+   * @param string $solution_label
+   *   The solution label.
+   *
+   * @Given I delete the EIF perspective of the :solution_label solution
+   */
+  public function deletePerspectiveOfSolution(string $solution_label): void {
+    $solution = $this->getRdfEntityByLabel($solution_label, 'solution');
+    $eif_perspective = $solution->get('eif_perspective')->entity;
+    $eif_perspective->delete();
+  }
+
 }
diff --git a/tests/src/Context/EuplContext.php b/tests/src/Context/EuplContext.php
index 454d43bb84147f29025d9f5abc36e828c55f42c7..6ff884183647a48d6217ef6e37531f768ee4dfdd 100644
--- a/tests/src/Context/EuplContext.php
+++ b/tests/src/Context/EuplContext.php
@@ -160,7 +160,7 @@ public function assertLegalTypeTagsCategoriesAndOrder(string $spdx, TableNode $t
    */
   public function assertFilterCategoriesAndOrder(TableNode $table): void {
     $expected = $table->getColumn(0);
-    $xpath = '//div[contains(concat(" ", normalize-space(@class), " "), " licence-filter ")]//div[contains(concat(" ", normalize-space(@class), " "), " licence-filter__header ")]';
+    $xpath = '//div[contains(concat(" ", normalize-space(@class), " "), " licence-filter ")]//div[contains(concat(" ", normalize-space(@class), " "), " licence-filter__header ")] | //div[contains(concat(" ", normalize-space(@class), " "), " eif-filter ")]//div[contains(concat(" ", normalize-space(@class), " "), " eif-filter__header ")]';
     $this->assertCategoriesAndOrder($xpath, $expected);
   }
 
diff --git a/tests/src/Context/FeatureContext.php b/tests/src/Context/FeatureContext.php
index 40acaf186a93d39b53f94fb6567a6bdf7477586b..73f38992a2e67a9cf10e4522b1b4fcf7bfa2490d 100644
--- a/tests/src/Context/FeatureContext.php
+++ b/tests/src/Context/FeatureContext.php
@@ -272,8 +272,12 @@ public function assertFieldsetsPresent(string $fieldsets): void {
     $page = $this->getSession()->getPage();
     $not_found = [];
     foreach ($fieldsets as $fieldset) {
-      $is_found = $page->find('named', ['fieldset', $fieldset]);
+      // Find by fieldset legend or by details summary depending on how the
+      // fieldset is rendered.
+      $is_found = $page->find('named', ['fieldset', $fieldset])
+        || $page->find('xpath', "//details/summary[contains(text(), '$fieldset')]");
       if (!$is_found) {
+        // Try to find the fieldset according to the collapse button.
         $not_found[] = $fieldset;
       }
     }
@@ -478,6 +482,7 @@ public function assertOptionNotSelected(string $text): void {
    *   not the expected one.
    *
    * @Then the option with text :option from select :select is selected
+   * @Then the option with text :option from select :select should be selected
    */
   public function assertFieldOptionSelected(string $option, string $select): void {
     $this->assertFieldOptionSelectedInRegion($option, $select);
@@ -2427,6 +2432,22 @@ public function removeFirstFileFromField(string $field_name): void {
     $button->press();
   }
 
+  /**
+   * Asserts that a link has an attribute set to a specific value.
+   *
+   * @param string $link_text
+   *   The link text.
+   * @param string $attribute_name
+   *   The name of the attribute to assert.
+   * @param string $attribute_value
+   *   The value of the attribute to assert.
+   *
+   * @Then the :link_text link should have the :attribute_name attribute set to :attribute_value
+   */
+  public function givenLinkHasAttribute(string $link_text, string $attribute_name, string $attribute_value): void {
+    Assert::assertNotNull($this->getSession()->getPage()->find('xpath', "//a[@$attribute_name='$attribute_value' and text()='$link_text']"));
+  }
+
   /**
    * Disables cookie consent banner for all tests.
    *
diff --git a/tests/src/Traits/EntityReferenceTrait.php b/tests/src/Traits/EntityReferenceTrait.php
index 6e4b98bead4ad72280cbb5c0e371a4c8e8e7203a..fc98efa850d6eabb4a4f33a4d54da4de67ce63a6 100644
--- a/tests/src/Traits/EntityReferenceTrait.php
+++ b/tests/src/Traits/EntityReferenceTrait.php
@@ -41,6 +41,10 @@ public function convertEntityReferencesValues($entity_type, $entity_bundle, arra
         $values[$name] = [$values[$name]];
       }
 
+      if (is_string($values[$name])) {
+        $values[$name] = [$values[$name]];
+      }
+
       foreach ($values[$name] as &$label) {
         $id = $this->getEntityIdByLabel($label, $target_entity_type, $target_entity_bundles);
 
diff --git a/web/modules/custom/collection/src/Controller/CollectionSettingsController.php b/web/modules/custom/collection/src/Controller/CollectionSettingsController.php
index 89c9abc6f28dd7e4a3a7d07011db1a68d5b42f2f..78b1a80b41f8913525787a880c57ae80bc2410c9 100644
--- a/web/modules/custom/collection/src/Controller/CollectionSettingsController.php
+++ b/web/modules/custom/collection/src/Controller/CollectionSettingsController.php
@@ -90,7 +90,7 @@ public function settings(CollectionInterface $rdf_entity): array {
   }
 
   /**
-   * Povides an access controller for the 'collection.settings_form' route.
+   * Provides an access controller for the 'collection.settings_form' route.
    *
    * @param \Drupal\collection\Entity\CollectionInterface $rdf_entity
    *   The collection.
diff --git a/web/modules/custom/contact_information/contact_information.module b/web/modules/custom/contact_information/contact_information.module
index 0ff8e1bd3732035f95e6d30795127b8b2de2f20a..8e4317497232f99918cf9d754e2429c4f9771678 100644
--- a/web/modules/custom/contact_information/contact_information.module
+++ b/web/modules/custom/contact_information/contact_information.module
@@ -9,6 +9,7 @@
 
 use Drupal\Core\Access\AccessResult;
 use Drupal\Core\Entity\EntityInterface;
+use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Session\AccountInterface;
 use Drupal\contact_information\Entity\ContactInformation;
 use Drupal\contact_information\Entity\ContactInformationInterface;
@@ -69,7 +70,10 @@ function contact_information_inline_entity_form_table_fields_alter(&$fields, $co
  * the entity until the parent entity is saved. Due to this, the label column
  * in the widget table would be empty.
  */
-function contact_information_inline_entity_form_entity_form_alter(&$entity_form, &$form_state) {
+function contact_information_inline_entity_form_entity_form_alter(array &$entity_form, FormStateInterface &$form_state): void {
+  if ($entity_form['#entity_type'] !== 'rdf_entity' || $entity_form['#bundle'] !== 'contact_information') {
+    return;
+  }
   // Add an entity builder callback to fill the label field with the values of
   // the name field. This is needed because inline entity form doesn't save
   // the entity until the parent entity is saved. Due to this, the label column
@@ -85,11 +89,7 @@ function contact_information_inline_entity_form_entity_form_alter(&$entity_form,
  * @param \Drupal\Core\Entity\EntityInterface $entity
  *   The entity being built.
  */
-function contact_information_inline_entity_form_entity_builder($entity_type, EntityInterface $entity) {
-  // Handle only contact information entities.
-  if ($entity->bundle() != 'contact_information') {
-    return;
-  }
+function contact_information_inline_entity_form_entity_builder(string $entity_type, EntityInterface $entity): void {
   contact_information_entity_auto_label($entity);
 }
 
diff --git a/web/modules/custom/joinup_communities/eif/config/schema/eif.schema.yml b/web/modules/custom/joinup_communities/eif/config/schema/eif.schema.yml
index 590fa48507a5ff8dca44364306c97a5c1dca1658..da341fbc489387291c5de894b42d6d5d9ae6f7a5 100644
--- a/web/modules/custom/joinup_communities/eif/config/schema/eif.schema.yml
+++ b/web/modules/custom/joinup_communities/eif/config/schema/eif.schema.yml
@@ -9,3 +9,14 @@ condition.plugin.eif_solutions_page:
 views.argument_validator.eif_toolbox:
   type: views.argument_validator_entity
   label: 'EIF Toolbox argument validator'
+
+eif.eif_wrapper_type.*:
+  type: config_entity
+  label: 'EIF Wrapper type'
+  mapping:
+    id:
+      type: string
+      label: 'Machine-readable name'
+    label:
+      type: label
+      label: 'Label'
diff --git a/web/modules/custom/joinup_communities/eif/eif.info.yml b/web/modules/custom/joinup_communities/eif/eif.info.yml
index 2826cc0753d4a47392d41f0e49af9034ae781bdd..d91ccae97c4bee9af1b299cef1be5decd920842e 100644
--- a/web/modules/custom/joinup_communities/eif/eif.info.yml
+++ b/web/modules/custom/joinup_communities/eif/eif.info.yml
@@ -5,4 +5,7 @@ core_version_requirement: ^8.9 || ^9.1
 php: 7.1
 package: Joinup communities
 dependencies:
+  - drupal:text
+  - inline_entity_form:inline_entity_form
   - joinup:custom_page
+  - rdf_meta_entity:rdf_meta_entity
diff --git a/web/modules/custom/joinup_communities/eif/eif.libraries.yml b/web/modules/custom/joinup_communities/eif/eif.libraries.yml
index 9fc5f38a506335d0879bafcd818614511996a33b..6af80b54b8fe7c9cc27b46fa3e5bc2cb3c53c77b 100644
--- a/web/modules/custom/joinup_communities/eif/eif.libraries.yml
+++ b/web/modules/custom/joinup_communities/eif/eif.libraries.yml
@@ -3,3 +3,10 @@ recommendations.selector:
     js/eif_recommendations.js: {}
   dependencies:
     - core/drupal
+
+eif-filter:
+  js:
+    js/eif_filter.js: {}
+  dependencies:
+    - core/jquery
+    - core/drupal
diff --git a/web/modules/custom/joinup_communities/eif/eif.links.action.yml b/web/modules/custom/joinup_communities/eif/eif.links.action.yml
new file mode 100644
index 0000000000000000000000000000000000000000..08ca9d81cef7803d51cc346f04641e45f57f4342
--- /dev/null
+++ b/web/modules/custom/joinup_communities/eif/eif.links.action.yml
@@ -0,0 +1,10 @@
+eif_wrapper_type.add_form:
+  route_name: entity.eif_wrapper_type.add_form
+  title: 'Add EIF Wrapper type'
+  appears_on:
+    - entity.eif_wrapper_type.collection
+eif_wrapper.add_form:
+  route_name: entity.eif_wrapper.add_form
+  title: 'Add EIF Wrapper'
+  appears_on:
+    - entity.eif_wrapper.collection
diff --git a/web/modules/custom/joinup_communities/eif/eif.links.menu.yml b/web/modules/custom/joinup_communities/eif/eif.links.menu.yml
new file mode 100644
index 0000000000000000000000000000000000000000..71fcf8f769d6ab5005312c8df402a8a58276c2d6
--- /dev/null
+++ b/web/modules/custom/joinup_communities/eif/eif.links.menu.yml
@@ -0,0 +1,11 @@
+entity.eif_wrapper_type.collection:
+  title: EIF Wrapper
+  description: Configure an EIF Wrapper bundles
+  route_name: entity.eif_wrapper_type.collection
+  parent: system.admin_structure
+
+entity.eif_wrapper.collection:
+  title: EIF Wrappers
+  description: List of EIF Wrappers
+  route_name: entity.eif_wrapper.collection
+  parent: system.admin_content
diff --git a/web/modules/custom/joinup_communities/eif/eif.links.task.yml b/web/modules/custom/joinup_communities/eif/eif.links.task.yml
new file mode 100644
index 0000000000000000000000000000000000000000..4517dcfc6b7ba66a7ab2c1635a257c1209db3ae6
--- /dev/null
+++ b/web/modules/custom/joinup_communities/eif/eif.links.task.yml
@@ -0,0 +1,35 @@
+eif.eif_perspective_form:
+  route_name: eif.eif_perspective_form
+  title: 'EIF perspective'
+  base_route: entity.rdf_entity.canonical
+
+# EIF Wrapper Type links
+entity.eif_wrapper_type.collection:
+  title: EIF Wrapper
+  route_name: entity.eif_wrapper_type.collection
+  base_route: system.admin_structure
+
+entity.eif_wrapper_type.edit_form:
+  title: Edit
+  route_name: entity.eif_wrapper_type.edit_form
+  base_route: entity.eif_wrapper_type.edit_form
+
+## EIF Wrapper links
+entity.eif_wrapper.collection:
+  title: EIF Wrapper
+  route_name: entity.eif_wrapper.collection
+  base_route: system.admin_content
+  weight: 10
+entity.eif_wrapper.view:
+  title: View
+  route_name: entity.eif_wrapper.canonical
+  base_route: entity.eif_wrapper.canonical
+entity.eif_wrapper.edit_form:
+  title: Edit
+  route_name: entity.eif_wrapper.edit_form
+  base_route: entity.eif_wrapper.canonical
+entity.eif_wrapper.delete_form:
+  title: Delete
+  route_name: entity.eif_wrapper.delete_form
+  base_route: entity.eif_wrapper.canonical
+  weight: 10
diff --git a/web/modules/custom/joinup_communities/eif/eif.module b/web/modules/custom/joinup_communities/eif/eif.module
index def34af34bc71326ba09b2971c7f0dab898dcec0..aebdf4cf42b5bb4660f5431900072bfbec997413 100644
--- a/web/modules/custom/joinup_communities/eif/eif.module
+++ b/web/modules/custom/joinup_communities/eif/eif.module
@@ -7,29 +7,67 @@
 
 declare(strict_types = 1);
 
+use Drupal\Core\Access\AccessResult;
+use Drupal\Core\Access\AccessResultInterface;
+use Drupal\Core\Cache\Cache;
+use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Render\Element;
+use Drupal\Core\Session\AccountInterface;
 use Drupal\eif\EifInterface;
+use Drupal\eif\Form\EifWrapperInlineForm;
 use Drupal\eif\Plugin\views\argument\EifGroupArgument;
+use Drupal\field\FieldConfigInterface;
 use Drupal\og\OgGroupAudienceHelperInterface;
+use Drupal\rdf_meta_entity\Entity\RdfMetaEntityInterface;
+use Drupal\views\ViewExecutable;
 
 /**
  * Implements hook_theme().
  */
 function eif_theme(array $existing, string $type, string $theme, string $path): array {
   return [
+    'eif_wrapper' => [
+      'render element' => 'elements',
+    ],
     'eif_category_navigator' => [
       'variables' => [
         'all_link' => NULL,
         'category_links' => [],
       ],
     ],
+    'eif_filter_list' => [
+      'variables' => [
+        'items' => NULL,
+      ],
+    ],
   ];
 }
 
+/**
+ * Prepares variables for EIF wrapper templates.
+ *
+ * Default template: eif-wrapper.html.twig.
+ *
+ * @param array $variables
+ *   An associative array containing:
+ *   - elements: An associative array containing the user information and any
+ *     fields attached to the entity. Properties used:
+ *     - #eif_wrapper: A \Drupal\eif\Entity\EifWrapper
+ *       object. The entity being viewed.
+ *   - attributes: HTML attributes for the containing element.
+ */
+function template_preprocess_eif_wrapper(array &$variables): void {
+  $variables['eif_wrapper'] = $variables['elements']['#eif_wrapper'];
+  foreach (Element::children($variables['elements']) as $key) {
+    $variables['content'][$key] = $variables['elements'][$key];
+  }
+}
+
 /**
  * Implements hook_views_plugins_argument_alter().
  */
-function eif_views_plugins_argument_alter(array &$plugins) {
+function eif_views_plugins_argument_alter(array &$plugins): void {
   // We don't want to apply a group contextual filter for eif_recommendation
   // view. The contextual filter is added only for validation. Swapping the
   // class to treat this exception.
@@ -42,7 +80,7 @@ function eif_views_plugins_argument_alter(array &$plugins) {
 /**
  * Implements hook_preprocess_HOOK().
  */
-function eif_preprocess_views_view_field(&$variables) {
+function eif_preprocess_views_view_field(array &$variables): void {
   if ($variables['view']->id() !== 'eif_recommendation') {
     return;
   }
@@ -157,3 +195,217 @@ function eif_preprocess_menu__og__navigation(array &$variables): void {
 
   $variables['items'][$plugin_id]['in_active_trail'] = TRUE;
 }
+
+/**
+ * Implements hook_entity_type_build().
+ */
+function eif_entity_type_build(array &$entity_types): void {
+  /** @var \Drupal\Core\Entity\EntityTypeInterface[] $entity_types */
+  if (isset($entity_types['eif_wrapper']) && !$entity_types['eif_wrapper']->getHandlerClass('inline_form')) {
+    // Use a dedicated inline form handler for 'eif_wrapper' entities.
+    $entity_types['eif_wrapper']->setHandlerClass('inline_form', EifWrapperInlineForm::class);
+  }
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ */
+function eif_form_rdf_meta_entity_eif_perspective_form_alter(array &$form, FormStateInterface $form_state, string $form_id): void {
+  foreach (Element::children($form) as $name) {
+    if (!empty($form[$name]['widget']['form'])) {
+      // Don't show the EIF Wrapper bundle label as sub-form title.
+      $form[$name]['widget']['form']['#title'] = NULL;
+    }
+  }
+
+  $form['#validate'][] = '_eif_form_rdf_meta_entity_no_empty_field_validate';
+}
+
+/**
+ * Validation callback for the EIF perspective form.
+ *
+ * @param array $form
+ *   The form array.
+ * @param \Drupal\Core\Form\FormStateInterface $form_state
+ *   The form state object.
+ */
+function _eif_form_rdf_meta_entity_no_empty_field_validate(array &$form, FormStateInterface $form_state): void {
+  // No field is required but the user needs to fill in at least 1 field in the
+  // form.
+  if (empty($form_state->getValue('field_eif_description')[0]['value'])
+    && empty($form_state->getValue('eif_solution_type'))
+    && empty($form_state->getValue('eif_model'))
+    && empty($form_state->getValue('eif_layer'))
+    && empty($form_state->getValue('eif_principle'))
+    && empty($form_state->getValue('eif_recommendation')['entities'])
+  ) {
+    $form_state->setError($form, 'An EIF perspective cannot be created without any information. Please, fill in at least one field.');
+  }
+}
+
+/**
+ * Implements hook_ENTITY_TYPE_create_access().
+ */
+function eif_eif_wrapper_create_access(AccountInterface $account, array $context, $entity_bundle): AccessResultInterface {
+  return AccessResult::allowedIf($account->hasPermission('create eif wrapper entity'));
+}
+
+/**
+ * Implements hook_ENTITY_TYPE_access().
+ */
+function eif_eif_wrapper_access(EntityInterface $entity, string $operation, AccountInterface $account): AccessResultInterface {
+  return AccessResult::allowedIf($account->hasPermission("{$operation} eif wrapper entity"));
+}
+
+/**
+ * Implements hook_ENTITY_TYPE_insert().
+ */
+function eif_rdf_meta_entity_insert(RdfMetaEntityInterface $entity): void {
+  _eif_reindex_parent_solution($entity);
+}
+
+/**
+ * Implements hook_ENTITY_TYPE_update().
+ */
+function eif_rdf_meta_entity_update(RdfMetaEntityInterface $entity): void {
+  _eif_reindex_parent_solution($entity);
+}
+
+/**
+ * Implements hook_ENTITY_TYPE_delete().
+ */
+function eif_rdf_meta_entity_delete(RdfMetaEntityInterface $entity): void {
+  _eif_reindex_parent_solution($entity);
+}
+
+/**
+ * Re index the parent solution to include the reference to the perspective.
+ *
+ * @param \Drupal\rdf_meta_entity\Entity\RdfMetaEntityInterface $entity
+ *   The RDF meta entity.
+ */
+function _eif_reindex_parent_solution(RdfMetaEntityInterface $entity): void {
+  if ($entity->bundle() !== 'eif_perspective') {
+    return;
+  }
+
+  $solution = \Drupal::entityTypeManager()->getStorage('rdf_entity')->loadUnchanged($entity->target->target_id);
+
+  // Manually update the entry of the solution in the SOLR index as we need to
+  // index the extra property for the EIF perspective.
+  $tracking_manager = \Drupal::getContainer()->get('search_api.entity_datasource.tracking_manager');
+  $tracking_manager->trackEntityChange($solution);
+
+  // Invalidate cache tags of the solution and the RDF meta entity in order to
+  // invalidate screens that are presenting them, like the EIF toolbox. The
+  // solution cache tags are needed because text from the solution is displayed
+  // in the EIF toolbox. The solution entity type list tags are not though, as
+  // there needs to be a change to an EIF perspective in order to have an
+  // addition or a deletion to/from the EIF toolbox. Deletion of solutions will
+  // trigger the deletion of the EIF perspective. Creation of a solution 'with'
+  // an EIF perspective, will trigger the invalidation of cache as well. The
+  // solution cache tags are added independently to ensure minimal performance
+  // impact in CRUD operations of the EIF perspective.
+  // @see eif_views_pre_render().
+  $cache_tags_invalidator = \Drupal::service('cache_tags.invalidator');
+  $list_cache_tags = ["{$entity->getEntityTypeId()}_list:{$entity->bundle()}"];
+  $tags_to_invalidate = Cache::mergeTags($solution->getCacheTagsToInvalidate(), $list_cache_tags, $entity->getCacheTagsToInvalidate());
+  $cache_tags_invalidator->invalidateTags($tags_to_invalidate);
+}
+
+/**
+ * Implements hook_views_pre_render().
+ */
+function eif_views_pre_render(ViewExecutable $view): void {
+  if ($view->current_display !== 'solutions_meta_entity_block') {
+    return;
+  }
+
+  $cache_tags = [];
+
+  /** @var \Drupal\search_api\Plugin\views\ResultRow $result_row */
+  foreach ($view->result as $result_row) {
+    $solution = $result_row->_entity;
+    $cache_tags = Cache::mergeTags($cache_tags, $solution->getCacheTags());
+  }
+
+  $eif_perspective_list_cache_tags = \Drupal::entityTypeManager()
+    ->getStorage('rdf_meta_entity_type')
+    ->load('eif_perspective')
+    ->getCacheTags();
+  $cache_tags[] = 'rdf_meta_entity_list:eif_perspective';
+  $cache_tags = Cache::mergeTags($cache_tags, $eif_perspective_list_cache_tags);
+  $view->element['#cache']['tags'] = Cache::mergeTags($view->element['#cache']['tags'], $cache_tags);
+}
+
+/**
+ * Implements hook_options_list_alter().
+ */
+function eif_options_list_alter(array &$options, array $context): void {
+  // @todo Remove this in ISAICP-7110 apart from the sorting part.
+  // @see https://citnet.tech.ec.europa.eu/CITnet/jira/browse/ISAICP-7110.
+  if (empty($context['fieldDefinition']) || !($context['fieldDefinition'] instanceof FieldConfigInterface)) {
+    return;
+  }
+
+  $fields = ['eif_layer', 'eif_model', 'eif_principle'];
+  if (in_array($context['fieldDefinition']->getName(), $fields)) {
+    foreach ($options as $key => $value) {
+      $parts = explode(':', $value);
+      // Some labels do not have prefix.
+      if (count($parts) === 2) {
+        $options[$key] = trim($parts[1]);
+      }
+    }
+  }
+  elseif ($context['fieldDefinition']->id() === 'eif_wrapper.recommendation.term') {
+    $empty_option = [];
+    if (isset($options['_none'])) {
+      $empty_option['_none'] = t('- Select a Recommendation -');
+    }
+
+    $terms = \Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadByProperties([
+      'vid' => 'eif_recommendation',
+    ]);
+    foreach ($options as $key => $value) {
+      if (isset($terms[$key]) && !empty($terms[$key]->field_eif_related_term->entity)) {
+        $options[$key] = $value . ' - ' . $terms[$key]->field_eif_related_term->entity->label();
+      }
+    }
+
+    // Remove the empty option - if available - to re-add it later first.
+    unset($options['_none']);
+    uksort($options, function (string $key1, string $key2) use ($terms): bool {
+      return $terms[$key1]->field_eif_identifier->value > $terms[$key2]->field_eif_identifier->value;
+    });
+    $options = $empty_option + $options;
+  }
+}
+
+/**
+ * Implements hook_inline_entity_form_entity_form_alter().
+ */
+function eif_inline_entity_form_entity_form_alter(array &$entity_form, FormStateInterface &$form_state): void {
+  if ($entity_form['#entity_type'] !== 'eif_wrapper' || $entity_form['#bundle'] !== 'recommendation') {
+    return;
+  }
+
+  $entity_form['term']['widget']['#title_display'] = 'invisible';
+  $entity_form['#after_build'][] = '_eif_inline_entity_form_actions_alter';
+}
+
+/**
+ * Callback function to rename IEF action buttons for the EIF recommendation.
+ *
+ * @param array $entity_form
+ *   The entity form.
+ * @param \Drupal\Core\Form\FormStateInterface $form_state
+ *   The form API form state object.
+ *
+ * @return array
+ *   The processed form array.
+ */
+function _eif_inline_entity_form_actions_alter(array $entity_form, FormStateInterface $form_state): array {
+  $entity_form['actions']['ief_add_save']['#value'] = t('Save recommendation');
+  return $entity_form;
+}
diff --git a/web/modules/custom/joinup_communities/eif/eif.permissions.yml b/web/modules/custom/joinup_communities/eif/eif.permissions.yml
new file mode 100644
index 0000000000000000000000000000000000000000..817cda4adff8a2c2c7529d884cceb7381a749393
--- /dev/null
+++ b/web/modules/custom/joinup_communities/eif/eif.permissions.yml
@@ -0,0 +1,11 @@
+# EIF wrappers are meant to be helper entities. There is no point
+# having bundle level permissions as the actual check should happen
+# in the parent entity.
+view eif wrapper entity:
+  title: 'View EIF wrapper entity'
+create eif wrapper entity:
+  title: 'Create EIF wrapper entity'
+update eif wrapper entity:
+  title: 'Update EIF wrapper entity'
+delete eif wrapper entity:
+  title: 'Delete EIF wrapper entity'
diff --git a/web/modules/custom/joinup_communities/eif/eif.routing.yml b/web/modules/custom/joinup_communities/eif/eif.routing.yml
index 88fa67af5ac2b4e0d086754039adf905d1ceb7bc..da0ce8e520106a7adf0825d360bd87786ec829bd 100644
--- a/web/modules/custom/joinup_communities/eif/eif.routing.yml
+++ b/web/modules/custom/joinup_communities/eif/eif.routing.yml
@@ -10,3 +10,30 @@ eif.solutions:
     parameters:
       eif_category:
         type: eif_category
+
+eif.eif_perspective_form:
+  path: '/rdf_entity/{rdf_entity}/eif-perspective/edit'
+  defaults:
+    _controller: Drupal\eif\Controller\EifPerspectiveController::settings
+    _title_callback: Drupal\eif\Controller\EifPerspectiveController::title
+  requirements:
+    _custom_access: Drupal\eif\Controller\EifPerspectiveController::editAccess
+  options:
+    parameters:
+      rdf_entity:
+        type: entity:rdf_entity
+        bundle:
+          - solution
+
+entity.rdf_entity.eif_perspective:
+  path: '/rdf_entity/{rdf_entity}/eif-perspective'
+  defaults:
+    _entity_view: 'rdf_entity.eif_perspective'
+  requirements:
+    _custom_access: Drupal\eif\Controller\EifPerspectiveController::viewAccess
+  options:
+    parameters:
+      rdf_entity:
+        type: entity:rdf_entity
+        bundle:
+          - solution
diff --git a/web/modules/custom/joinup_communities/eif/js/eif_filter.js b/web/modules/custom/joinup_communities/eif/js/eif_filter.js
new file mode 100644
index 0000000000000000000000000000000000000000..7d5542c9b4e4dacc86caa6308bf6b4ba460845a7
--- /dev/null
+++ b/web/modules/custom/joinup_communities/eif/js/eif_filter.js
@@ -0,0 +1,55 @@
+/**
+ * @file
+ * Eif filter functionality.
+ */
+
+(function ($, drupalSettings) {
+  "use strict";
+  function checkEifCategories() {
+    var $eifTile = $('.eif-tile');
+
+    // Remove hidden class before further processing.
+    $eifTile.each(function () {
+      $(this).removeClass('visually-hidden');
+    });
+
+    // Check every active filter item and hide tiles which don't contain proper
+    // data-eif-category.
+    $('.eif-filter__item a.is-active').each(function () {
+      const currentEifCategory = $(this).attr('data-eif-category');
+      if (typeof currentEifCategory !== 'undefined') {
+        $eifTile.each(function () {
+          const eifCategory = $(this).attr('data-eif-category');
+          if (typeof eifCategory !== 'undefined') {
+            const eifCategoryArray = eifCategory.split(' ');
+            if ($.inArray(currentEifCategory, eifCategoryArray) < 0 && !$(this).hasClass('visually-hidden')) {
+              $(this).addClass('visually-hidden');
+            }
+          }
+        });
+      }
+    });
+  }
+
+  // Trigger if eif filter is clicked.
+  $('.eif-filter__item a').each(function () {
+    $(this).on('click', function (event) {
+      event.preventDefault();
+
+      $(this).toggleClass('is-active');
+      checkEifCategories();
+    });
+  });
+
+  // Reset eif listing.
+  $('#eif-reset').on('click', function (event) {
+    $('.eif-filter__item a.is-active').removeClass('is-active');
+    checkEifCategories();
+  });
+
+  // Filter on window load. Needed for eif search filter.
+  $(window).on('load', function () {
+    checkEifCategories();
+  });
+
+})(jQuery, drupalSettings);
diff --git a/web/modules/custom/joinup_communities/eif/src/Controller/EifPerspectiveController.php b/web/modules/custom/joinup_communities/eif/src/Controller/EifPerspectiveController.php
new file mode 100644
index 0000000000000000000000000000000000000000..a332f90f41da31e0a01d119257de6d254853b221
--- /dev/null
+++ b/web/modules/custom/joinup_communities/eif/src/Controller/EifPerspectiveController.php
@@ -0,0 +1,134 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\eif\Controller;
+
+use Drupal\Component\Render\MarkupInterface;
+use Drupal\Core\Access\AccessResult;
+use Drupal\Core\Access\AccessResultInterface;
+use Drupal\Core\Controller\ControllerBase;
+use Drupal\Core\Entity\EntityTypeManagerInterface;
+use Drupal\Core\Url;
+use Drupal\og\OgAccessInterface;
+use Drupal\rdf_meta_entity\Entity\RdfMetaEntity;
+use Drupal\solution\Entity\SolutionInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Controller class for the solution EIF perspective.
+ */
+class EifPerspectiveController extends ControllerBase {
+
+  /**
+   * The entity type manager service.
+   *
+   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
+   */
+  protected $entityTypeManager;
+
+  /**
+   * The OG access service.
+   *
+   * @var \Drupal\og\OgAccessInterface
+   */
+  protected $ogAccess;
+
+  /**
+   * Constructs a new controller instance.
+   *
+   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
+   *   The entity type manager service.
+   * @param \Drupal\og\OgAccessInterface $og_access
+   *   The OG access service.
+   */
+  public function __construct(EntityTypeManagerInterface $entity_type_manager, OgAccessInterface $og_access) {
+    $this->entityTypeManager = $entity_type_manager;
+    $this->ogAccess = $og_access;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('entity_type.manager'),
+      $container->get('og.access')
+    );
+  }
+
+  /**
+   * Provides a controller for the 'eif.eif_perspective_form' route title.
+   *
+   * @param \Drupal\solution\Entity\SolutionInterface $rdf_entity
+   *   The solution.
+   *
+   * @return \Drupal\Component\Render\MarkupInterface
+   *   The content as a render array.
+   */
+  public function title(SolutionInterface $rdf_entity): MarkupInterface {
+    return $this->t('@solution EIF perspective', [
+      '@solution' => $rdf_entity->label(),
+    ]);
+  }
+
+  /**
+   * Provides a controller for the 'eif.eif_perspective_form' route.
+   *
+   * @param \Drupal\solution\Entity\SolutionInterface $rdf_entity
+   *   The solution.
+   *
+   * @return array
+   *   The content as a render array.
+   */
+  public function settings(SolutionInterface $rdf_entity): array {
+    $meta_entity = RdfMetaEntity::loadOrCreate('eif_perspective', $rdf_entity);
+    return $this->entityFormBuilder()->getForm($meta_entity, 'default', [
+      'redirect' => Url::fromRoute('entity.rdf_entity.canonical', [
+        'rdf_entity' => $rdf_entity->id(),
+      ]),
+    ]);
+  }
+
+  /**
+   * Provides an access callback for the 'eif.eif_perspective_form' route.
+   *
+   * @param \Drupal\solution\Entity\SolutionInterface $rdf_entity
+   *   The solution.
+   *
+   * @return \Drupal\Core\Access\AccessResultInterface
+   *   The access result.
+   */
+  public function editAccess(SolutionInterface $rdf_entity): AccessResultInterface {
+    $meta_entity = RdfMetaEntity::loadOrCreate('eif_perspective', $rdf_entity);
+    if (!$meta_entity->isNew()) {
+      $access_result = $meta_entity->access('update', NULL, TRUE);
+    }
+    else {
+      $access_result = $this->entityTypeManager->getAccessControlHandler('rdf_meta_entity')->createAccess('eif_perspective', NULL, [], TRUE);
+    }
+
+    if ($access_result->isAllowed()) {
+      return $access_result;
+    }
+    return $access_result->orIf($this->ogAccess->userAccess($rdf_entity, 'update eif_perspective rdf-meta-entity'));
+  }
+
+  /**
+   * Provides an access callback to view the EIF perspective.
+   *
+   * @param \Drupal\solution\Entity\SolutionInterface $rdf_entity
+   *   The solution.
+   *
+   * @return \Drupal\Core\Access\AccessResultInterface
+   *   The access result.
+   */
+  public function viewAccess(SolutionInterface $rdf_entity): AccessResultInterface {
+    if (empty($rdf_entity->eif_perspective->entity) || !$rdf_entity->access('view')) {
+      return AccessResult::forbidden();
+    }
+
+    return $this->entityTypeManager->getAccessControlHandler('rdf_meta_entity')->access($rdf_entity->eif_perspective->entity, 'view', NULL, TRUE);
+  }
+
+}
diff --git a/web/modules/custom/joinup_communities/eif/src/EifInterface.php b/web/modules/custom/joinup_communities/eif/src/EifInterface.php
index 1a34b1fc7be75f1d9b47fd8d651ae4de04fac22d..63a157a18ca265c076721bb3a1742f044969b67e 100644
--- a/web/modules/custom/joinup_communities/eif/src/EifInterface.php
+++ b/web/modules/custom/joinup_communities/eif/src/EifInterface.php
@@ -40,6 +40,13 @@ interface EifInterface {
    */
   public const EIF_SOLUTIONS_NID = 703013;
 
+  /**
+   * The node ID of the EIF Online Assistant solutions custom page.
+   *
+   * @var int
+   */
+  public const EIF_ONLINE_ASSISTANT = 705372;
+
   /**
    * Returns the EIF categories.
    *
diff --git a/web/modules/custom/joinup_communities/eif/src/EifWrapperInterface.php b/web/modules/custom/joinup_communities/eif/src/EifWrapperInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..6d7912c7de1fd53c5cc230f1a359d46d50445559
--- /dev/null
+++ b/web/modules/custom/joinup_communities/eif/src/EifWrapperInterface.php
@@ -0,0 +1,14 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\eif;
+
+use Drupal\Core\Entity\ContentEntityInterface;
+
+/**
+ * Provides an interface defining an EIF Wrapper entity type.
+ */
+interface EifWrapperInterface extends ContentEntityInterface {
+
+}
diff --git a/web/modules/custom/joinup_communities/eif/src/EifWrapperListBuilder.php b/web/modules/custom/joinup_communities/eif/src/EifWrapperListBuilder.php
new file mode 100644
index 0000000000000000000000000000000000000000..05154d942bc8594f06cea4a708d1ef5a1d7d9d8b
--- /dev/null
+++ b/web/modules/custom/joinup_communities/eif/src/EifWrapperListBuilder.php
@@ -0,0 +1,96 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\eif;
+
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\Core\Entity\EntityListBuilder;
+use Drupal\Core\Entity\EntityStorageInterface;
+use Drupal\Core\Entity\EntityTypeInterface;
+use Drupal\Core\Routing\RedirectDestinationInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Provides a list controller for the eif wrapper entity type.
+ */
+class EifWrapperListBuilder extends EntityListBuilder {
+
+  /**
+   * The redirect destination service.
+   *
+   * @var \Drupal\Core\Routing\RedirectDestinationInterface
+   */
+  protected $redirectDestination;
+
+  /**
+   * Constructs a new EifWrapperListBuilder object.
+   *
+   * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type
+   *   The entity type definition.
+   * @param \Drupal\Core\Entity\EntityStorageInterface $storage
+   *   The entity storage class.
+   * @param \Drupal\Core\Routing\RedirectDestinationInterface $redirect_destination
+   *   The redirect destination service.
+   */
+  public function __construct(EntityTypeInterface $entity_type, EntityStorageInterface $storage, RedirectDestinationInterface $redirect_destination) {
+    parent::__construct($entity_type, $storage);
+    $this->redirectDestination = $redirect_destination;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function createInstance(ContainerInterface $container, EntityTypeInterface $entity_type): self {
+    return new static(
+      $entity_type,
+      $container->get('entity_type.manager')->getStorage($entity_type->id()),
+      $container->get('redirect.destination')
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function render(): array {
+    $build['table'] = parent::render();
+
+    $total = $this->getStorage()
+      ->getQuery()
+      ->count()
+      ->execute();
+
+    $build['summary']['#markup'] = $this->t('Total EIF wrappers: @total', ['@total' => $total]);
+    return $build;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildHeader(): array {
+    $header['id'] = $this->t('ID');
+    return $header + parent::buildHeader();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildRow(EntityInterface $entity): array {
+    /** @var \Drupal\eif\EifWrapperInterface $entity */
+    $row['id'] = $entity->toLink();
+    return $row + parent::buildRow($entity);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getDefaultOperations(EntityInterface $entity): array {
+    $operations = parent::getDefaultOperations($entity);
+    $destination = $this->redirectDestination->getAsArray();
+    foreach ($operations as $key => $operation) {
+      $operations[$key]['query'] = $destination;
+    }
+    return $operations;
+  }
+
+}
diff --git a/web/modules/custom/joinup_communities/eif/src/EifWrapperTypeListBuilder.php b/web/modules/custom/joinup_communities/eif/src/EifWrapperTypeListBuilder.php
new file mode 100644
index 0000000000000000000000000000000000000000..aa6754e1fe64d5e71089a9905e3ae58ef5439a37
--- /dev/null
+++ b/web/modules/custom/joinup_communities/eif/src/EifWrapperTypeListBuilder.php
@@ -0,0 +1,33 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\eif;
+
+use Drupal\Core\Config\Entity\ConfigEntityListBuilder;
+use Drupal\Core\Entity\EntityInterface;
+
+/**
+ * List builder for 'eif_wrapper_type' entities.
+ */
+class EifWrapperTypeListBuilder extends ConfigEntityListBuilder {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildHeader(): array {
+    return [
+      'type' => $this->t('Type'),
+    ] + parent::buildHeader();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildRow(EntityInterface $entity): array {
+    return [
+      'type' => $entity->toLink(NULL, 'edit-form'),
+    ] + parent::buildRow($entity);
+  }
+
+}
diff --git a/web/modules/custom/joinup_communities/eif/src/Entity/EifWrapper.php b/web/modules/custom/joinup_communities/eif/src/Entity/EifWrapper.php
new file mode 100644
index 0000000000000000000000000000000000000000..42339b1a720206fa499e8e4e5ad76059649c81ae
--- /dev/null
+++ b/web/modules/custom/joinup_communities/eif/src/Entity/EifWrapper.php
@@ -0,0 +1,92 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\eif\Entity;
+
+use Drupal\Core\Entity\ContentEntityBase;
+use Drupal\Core\Entity\EntityTypeInterface;
+use Drupal\Core\Field\BaseFieldDefinition;
+use Drupal\eif\EifWrapperInterface;
+
+/**
+ * Acts as a wrapper around EIF reference to term and description.
+ *
+ * An 'EIF Perspective' RDF Meta Entity should link a multi-value field having
+ * two columns:
+ * - Taxonomy term reference, pointing to EIF vocabularies,
+ * - Description.
+ * Currently, fields of entity types using SPARQL Entity Storage cannot have
+ * multiple columns and multiple values in the same time. This is a well known
+ * limitation handled in ISAICP-3576. This entity type acts in the same way as
+ * the custom field type and is a temporary solution until ISAICP-3576 is fixed.
+ *
+ * @ContentEntityType(
+ *   id = "eif_wrapper",
+ *   label = @Translation("EIF Wrapper"),
+ *   label_collection = @Translation("EIF Wrappers"),
+ *   bundle_label = @Translation("EIF Wrapper type"),
+ *   handlers = {
+ *     "form" = {
+ *       "default" = "Drupal\eif\Form\EifWrapperForm",
+ *       "delete" = "Drupal\Core\Entity\ContentEntityDeleteForm",
+ *     },
+ *     "list_builder" = "Drupal\eif\EifWrapperListBuilder",
+ *     "route_provider" = {
+ *       "html" = "Drupal\Core\Entity\Routing\AdminHtmlRouteProvider",
+ *     },
+ *     "storage" = "\Drupal\sparql_entity_storage\SparqlEntityStorage",
+ *   },
+ *   base_table = NULL,
+ *   admin_permission = "administer rdf meta entity",
+ *   entity_keys = {
+ *     "id" = "id",
+ *     "label" = "id",
+ *     "bundle" = "type",
+ *   },
+ *   links = {
+ *     "add-form" = "/admin/content/eif-wrapper/add",
+ *     "canonical" = "/admin/content/eif-wrapper/manage/{eif_wrapper}",
+ *     "edit-form" = "/admin/content/eif-wrapper/manage/{eif_wrapper}/edit",
+ *     "delete-form" = "/admin/content/eif-wrapper/manage/{eif_wrapper}/delete",
+ *     "collection" = "/admin/content/eif-wrapper"
+ *   },
+ *   field_ui_base_route = "entity.eif_wrapper_type.edit_form",
+ *   bundle_entity_type = "eif_wrapper_type",
+ * )
+ *
+ * @todo Move the whole logic to a custom field type once ISAICP-3576 lands.
+ *
+ * @see https://citnet.tech.ec.europa.eu/CITnet/jira/browse/ISAICP-3576
+ */
+class EifWrapper extends ContentEntityBase implements EifWrapperInterface {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function baseFieldDefinitions(EntityTypeInterface $entity_type): array {
+    $fields = parent::baseFieldDefinitions($entity_type);
+
+    $fields['id'] = BaseFieldDefinition::create('uri')
+      ->setLabel(t('ID'))
+      ->setTranslatable(FALSE);
+
+    $fields['description'] = BaseFieldDefinition::create('text_long')
+      ->setLabel(t('Description'))
+      ->setRevisionable(FALSE)
+      ->setTranslatable(FALSE)
+      ->setCardinality(1)
+      ->setDisplayConfigurable('form', TRUE)
+      ->setDisplayConfigurable('view', TRUE);
+
+    return $fields;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function label(): string {
+    return $this->hasField('term') ? $this->get('term')->entity->label() : $this->id();
+  }
+
+}
diff --git a/web/modules/custom/joinup_communities/eif/src/Entity/EifWrapperType.php b/web/modules/custom/joinup_communities/eif/src/Entity/EifWrapperType.php
new file mode 100644
index 0000000000000000000000000000000000000000..c0ac4325d86bf3442927af4590960d214ea383e0
--- /dev/null
+++ b/web/modules/custom/joinup_communities/eif/src/Entity/EifWrapperType.php
@@ -0,0 +1,61 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\eif\Entity;
+
+use Drupal\Core\Config\Entity\ConfigEntityBundleBase;
+
+/**
+ * Defines the EIF Wrapper type configuration entity.
+ *
+ * @ConfigEntityType(
+ *   id = "eif_wrapper_type",
+ *   label = @Translation("EIF Wrapper Type"),
+ *   handlers = {
+ *     "form" = {
+ *       "add" = "Drupal\eif\Form\EifWrapperTypeForm",
+ *       "edit" = "Drupal\eif\Form\EifWrapperTypeForm",
+ *       "delete" = "Drupal\Core\Entity\EntityDeleteForm",
+ *     },
+ *     "route_provider" = {
+ *       "html" = "Drupal\Core\Entity\Routing\AdminHtmlRouteProvider",
+ *     },
+ *     "list_builder" = "Drupal\eif\EifWrapperTypeListBuilder",
+ *   },
+ *   links = {
+ *     "add-form" = "/admin/structure/eif-wrapper/add",
+ *     "edit-form" = "/admin/structure/eif-wrapper/manage/{eif_wrapper_type}",
+ *     "delete-form" = "/admin/structure/eif-wrapper/manage/{eif_wrapper_type}/delete",
+ *     "collection" = "/admin/structure/eif-wrapper",
+ *   },
+ *   admin_permission = "administer rdf meta entity",
+ *   bundle_of = "eif_wrapper",
+ *   config_prefix = "eif_wrapper_type",
+ *   entity_keys = {
+ *     "id" = "id",
+ *     "label" = "label",
+ *   },
+ *   config_export = {
+ *     "id",
+ *     "label",
+ *   },
+ * )
+ */
+class EifWrapperType extends ConfigEntityBundleBase {
+
+  /**
+   * The entity ID.
+   *
+   * @var string
+   */
+  protected string $id;
+
+  /**
+   * The human-readable name of the EIF Wrapper type.
+   *
+   * @var string
+   */
+  protected string $label;
+
+}
diff --git a/web/modules/custom/joinup_communities/eif/src/Form/EifWrapperInlineForm.php b/web/modules/custom/joinup_communities/eif/src/Form/EifWrapperInlineForm.php
new file mode 100644
index 0000000000000000000000000000000000000000..f2b4b3d418a438e1cb73119882ea1af6b48a1357
--- /dev/null
+++ b/web/modules/custom/joinup_communities/eif/src/Form/EifWrapperInlineForm.php
@@ -0,0 +1,42 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\eif\Form;
+
+use Drupal\inline_entity_form\Form\EntityInlineForm;
+use Drupal\inline_entity_form\InlineFormInterface;
+
+/**
+ * Inline form handler for 'eif_wrapper' entity type.
+ */
+class EifWrapperInlineForm extends EntityInlineForm implements InlineFormInterface {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getTableFields($bundles): array {
+    $fields = parent::getTableFields($bundles);
+
+    $fields['label']['label'] = $this->t('Qualifier');
+    $fields['description'] = [
+      'type' => 'field',
+      'label' => $this->t('Description'),
+      'weight' => 10,
+      'display_options' => [
+        'type' => 'text_trimmed',
+        'settings' => ['trim_length' => 250],
+      ],
+    ];
+
+    return $fields;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function isTableDragEnabled($element): bool {
+    return FALSE;
+  }
+
+}
diff --git a/web/modules/custom/joinup_communities/eif/src/Form/EifWrapperTypeForm.php b/web/modules/custom/joinup_communities/eif/src/Form/EifWrapperTypeForm.php
new file mode 100644
index 0000000000000000000000000000000000000000..3f453690c0bd177700e14f2aaedc07d23f036274
--- /dev/null
+++ b/web/modules/custom/joinup_communities/eif/src/Form/EifWrapperTypeForm.php
@@ -0,0 +1,14 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\eif\Form;
+
+use Drupal\Core\Entity\BundleEntityFormBase;
+
+/**
+ * EIF Wrapper Type edit form.
+ */
+class EifWrapperTypeForm extends BundleEntityFormBase {
+
+}
diff --git a/web/modules/custom/joinup_communities/eif/src/Plugin/Block/EifFilterBlock.php b/web/modules/custom/joinup_communities/eif/src/Plugin/Block/EifFilterBlock.php
new file mode 100644
index 0000000000000000000000000000000000000000..dcf456d815208b66aa55e8e18b8324f6456524f7
--- /dev/null
+++ b/web/modules/custom/joinup_communities/eif/src/Plugin/Block/EifFilterBlock.php
@@ -0,0 +1,130 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\eif\Plugin\Block;
+
+use Drupal\Core\Block\BlockBase;
+use Drupal\Core\Entity\EntityStorageInterface;
+use Drupal\Core\Entity\EntityTypeManagerInterface;
+use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Provides the block that displays the Eif filters.
+ *
+ * @Block(
+ *   id = "eif_filter_block",
+ *   admin_label = @Translation("EIF filter block"),
+ *   category = @Translation("EIF")
+ * )
+ */
+class EifFilterBlock extends BlockBase implements ContainerFactoryPluginInterface {
+
+  /**
+   * The entity type manager service.
+   *
+   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
+   */
+  protected EntityTypeManagerInterface $entityTypeManager;
+
+  /**
+   * Constructs a new EifFilterBlock.
+   *
+   * @param array $configuration
+   *   A configuration array containing information about the plugin instance.
+   * @param string $plugin_id
+   *   The plugin_id for the plugin instance.
+   * @param array $plugin_definition
+   *   The plugin implementation definition.
+   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entityTypeManager
+   *   The entity type manager service.
+   */
+  public function __construct(array $configuration, $plugin_id, array $plugin_definition, EntityTypeManagerInterface $entityTypeManager) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition);
+    $this->entityTypeManager = $entityTypeManager;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition): self {
+    return new static(
+      $configuration,
+      $plugin_id,
+      $plugin_definition,
+      $container->get('entity_type.manager')
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function build(): array {
+    $tree = [];
+    $term_storage = $this->entityTypeManager->getStorage('taxonomy_term');
+
+    $vocabularies = [
+      'eif_principle' => $this->t('Underlying principles'),
+      'eif_interoperability_layer' => $this->t('Interoperability layer'),
+      'eif_conceptual_model' => $this->t('Conceptual model'),
+      'eif_solution_type' => $this->t('Solution category'),
+    ];
+
+    foreach ($vocabularies as $machine_name => $name) {
+      $principle_terms = $term_storage->loadTree($machine_name);
+      $id = htmlentities(str_replace([' ', '/', ':'], ['-', '-', ''], strtolower((string) $name)));
+      foreach ($principle_terms as $term) {
+        $tree = $this->getTree($id, (string) $name, $tree, $term, $term_storage);
+      }
+    }
+
+    if (empty($tree)) {
+      return [];
+    }
+
+    $build['tree_filters'] = [
+      '#theme' => 'eif_filter_list',
+      '#items' => $tree,
+    ];
+    $build['#attached']['library'][] = 'eif/eif-filter';
+    return $build;
+  }
+
+  /**
+   * Get taxonomy term data.
+   *
+   * @param string $id
+   *   Filter identify.
+   * @param string $name
+   *   Filter name.
+   * @param array $tree
+   *   Items in filter.
+   * @param object $term
+   *   Taxonomy term.
+   * @param \Drupal\Core\Entity\EntityStorageInterface $storage
+   *   The entity storage.
+   *
+   * @return array
+   *   Added items for filters.
+   */
+  public function getTree(string $id, string $name, array $tree, \stdClass $term, EntityStorageInterface $storage): array {
+    $tree[$id]['title'] = $name;
+    $tree[$id]['class'] = 'eif-filter--' . $id;
+
+    // @todo Use an alternative title instead of dynamically splitting it.
+    // @see https://citnet.tech.ec.europa.eu/CITnet/jira/browse/ISAICP-7110.
+    $parts = explode(':', $term->name);
+    $name = empty($parts[1]) ? $term->name : trim($parts[1]);
+
+    $tree[$id]['items'][] = [
+      'title' => $name,
+      'description' => $storage->load($term->tid)->getDescription(),
+      'eif_category' => htmlentities(
+        str_replace([' ', '/', ':'], ['-', '-', ''], strtolower($term->name))
+      ),
+    ];
+    return $tree;
+  }
+
+}
diff --git a/web/modules/custom/joinup_communities/eif/templates/eif-filter-list.html.twig b/web/modules/custom/joinup_communities/eif/templates/eif-filter-list.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..e8e22d9eb83aac2215bd2c4d2a007060e9c07eca
--- /dev/null
+++ b/web/modules/custom/joinup_communities/eif/templates/eif-filter-list.html.twig
@@ -0,0 +1,37 @@
+{#
+/**
+ * @file
+ * Default implementation of displaying a grid of lists.
+ *
+ * Available variables:
+ * - items: A nested list of items. Each item contains:
+ * -- title: The title of the parent.
+ * -- class: The explicit parent class to pass to the list
+ * -- children: A nested list of items. Each item contains:
+ * --- data-eif-category: The eif category to pass to the data attribute data-eif-category.
+ * --- title: The title of the child.
+ * --- description: The description of the field to pass to the data attribute.
+ */
+#}
+<div class="listing listing--grid">
+  <div class="row">
+    <div>
+      {% for parent_item in items %}
+        <div class="eif-filter {{ parent_item.class }}">
+          <div class="eif__card">
+            <div class="eif-filter__header">
+              <span>{{ parent_item.title }}</span>
+            </div>
+            <div class="eif-filter__content">
+              <ul class="eif-filter__list">
+                {% for child in parent_item.items %}
+                  <li class="eif-filter__item"><a data-eif-category="{{ child.eif_category }}" href="#" title="{{ child.description }}">{{ child.title }}</a></li>
+                {% endfor %}
+              </ul>
+            </div>
+          </div>
+        </div>
+      {% endfor %}
+    </div>
+  </div>
+</div>
diff --git a/web/modules/custom/joinup_communities/eif/templates/eif-wrapper.html.twig b/web/modules/custom/joinup_communities/eif/templates/eif-wrapper.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..b17618a52da65cfbf09371411fcd1da7a4cac2f5
--- /dev/null
+++ b/web/modules/custom/joinup_communities/eif/templates/eif-wrapper.html.twig
@@ -0,0 +1,9 @@
+{#
+/**
+ * @file
+ * Themeing for EIF wrapper.
+ */
+#}
+<article {{ attributes }}>
+  <a title="{{ content.description.0['#text']|striptags }}" href="{{ content.term.0['#url'] }}">{{ content.term.0['#title'] }}</a>
+</article>
diff --git a/web/modules/custom/joinup_core/joinup_core.install b/web/modules/custom/joinup_core/joinup_core.install
index 4f923d06dad967128beff1c21fc52e8413d3f725..0c7093f5ef20e9f2273dcc8cdd59b64a651eff89 100644
--- a/web/modules/custom/joinup_core/joinup_core.install
+++ b/web/modules/custom/joinup_core/joinup_core.install
@@ -91,3 +91,13 @@ function joinup_core_requirements($phase): array {
 
   return $requirements;
 }
+
+/**
+ * Install 'EIF Wrapper' entity type.
+ */
+function joinup_core_update_108300(?array &$sandbox = NULL): void {
+  $entity_type_manager = \Drupal::entityTypeManager();
+  $entity_definition_manager = \Drupal::entityDefinitionUpdateManager();
+  $entity_definition_manager->installEntityType($entity_type_manager->getDefinition('eif_wrapper_type'));
+  $entity_definition_manager->installEntityType($entity_type_manager->getDefinition('eif_wrapper'));
+}
diff --git a/web/modules/custom/joinup_core/joinup_core.post_update.php b/web/modules/custom/joinup_core/joinup_core.post_update.php
index 031777be204cd926bb93f68c66d13c042bed6816..80a8eaa320cbb987a95a9a6dcd539842b35bc07a 100644
--- a/web/modules/custom/joinup_core/joinup_core.post_update.php
+++ b/web/modules/custom/joinup_core/joinup_core.post_update.php
@@ -14,3 +14,11 @@
  */
 
 declare(strict_types = 1);
+
+/**
+ * Import the EIF solution type vocabulary.
+ */
+function joinup_core_post_update_108300(?array &$sandbox = NULL): void {
+  $fixtures_helper = \Drupal::getContainer()->get('joinup_rdf.vocabulary_fixtures.helper');
+  $fixtures_helper->importFixtures('eif_solution_type');
+}
diff --git a/web/modules/custom/joinup_rdf/src/VocabularyFixturesHelper.php b/web/modules/custom/joinup_rdf/src/VocabularyFixturesHelper.php
index 1b25b8507f402ed102d9181c5f50f053e6dcdf43..b6277cfebca9113a3b2bccf9d437cf0d627bbe6e 100644
--- a/web/modules/custom/joinup_rdf/src/VocabularyFixturesHelper.php
+++ b/web/modules/custom/joinup_rdf/src/VocabularyFixturesHelper.php
@@ -52,6 +52,11 @@ protected function getFixturesData(): array {
           'WITH <http://licence-legal-type> INSERT { ?member skos:broaderTransitive ?collection } WHERE { ?collection a skos:Collection . ?collection skos:member ?member };',
         ],
       ],
+      'eif_solution_type' => [
+        'graph' => 'http://eif_solution_type',
+        'filename' => 'eif_solution_type.rdf',
+        'extra queries' => [],
+      ],
     ];
   }
 
diff --git a/web/modules/custom/joinup_search/joinup_search.module b/web/modules/custom/joinup_search/joinup_search.module
index de7ab05ab5fc15cf8d2350d2ea2415150e69b04e..f8c4af6dd0ab362284f10c1c08911a8d7f2bc17d 100644
--- a/web/modules/custom/joinup_search/joinup_search.module
+++ b/web/modules/custom/joinup_search/joinup_search.module
@@ -184,7 +184,7 @@ function joinup_search_search_api_index_items_alter(IndexInterface $index, array
     [, $raw_id] = Utility::splitCombinedId($item_id);
     [, $langcode] = Utility::splitPropertyPath($raw_id);
     // Unset non-english content from the index.
-    if ($langcode != 'en') {
+    if (!in_array($langcode, ['en', 'und'])) {
       unset($items[$item_id]);
     }
   }
diff --git a/web/modules/custom/joinup_search/src/Plugin/views/row/JoinupSearchApiRow.php b/web/modules/custom/joinup_search/src/Plugin/views/row/JoinupSearchApiRow.php
index e52a96d79e53fa8e7c61dacddc2a0d163dc8adb5..a455de49ab3f8780d4360ab07bc1f2290c634de2 100644
--- a/web/modules/custom/joinup_search/src/Plugin/views/row/JoinupSearchApiRow.php
+++ b/web/modules/custom/joinup_search/src/Plugin/views/row/JoinupSearchApiRow.php
@@ -12,7 +12,7 @@
  *
  * @ViewsRow(
  *   id = "joinup_search_api",
- *   title = @Translation("Rendered entity"),
+ *   title = @Translation("Rendered entity with 3 featured items"),
  *   help = @Translation("Displays entity of the matching search API item"),
  * )
  *
diff --git a/web/modules/custom/owner/owner.module b/web/modules/custom/owner/owner.module
index 6e6598a74f73fa5a3e199896a9dfbf487a6dfb92..e17e8ac42fa0a168eb1c74c52c9c2655328ad69e 100644
--- a/web/modules/custom/owner/owner.module
+++ b/web/modules/custom/owner/owner.module
@@ -92,7 +92,7 @@ function owner_inline_entity_form_entity_form_alter(&$entity_form, &$form_state)
  * @param \Drupal\Core\Entity\EntityInterface $entity
  *   The entity being built.
  */
-function owner_inline_entity_form_entity_builder($entity_type, EntityInterface $entity) {
+function owner_inline_entity_form_entity_builder(string $entity_type, EntityInterface $entity) {
   owner_entity_auto_label($entity);
 }
 
diff --git a/web/modules/custom/solution/solution.routing.yml b/web/modules/custom/solution/solution.routing.yml
index 855b5151dc5a08c8854a086aac2c8ec113de4e0c..8ad88b78c6b68ab4e2571fc137b93bbb7b035ba3 100644
--- a/web/modules/custom/solution/solution.routing.yml
+++ b/web/modules/custom/solution/solution.routing.yml
@@ -63,3 +63,17 @@ solution.change_collection:
     parameters:
       rdf_entity:
         type: entity:rdf_entity
+
+solution.eif_perspective.form:
+  path: '/rdf_entity/{rdf_entity}/eif-perspective'
+  defaults:
+    _controller: Drupal\collection\Controller\CollectionSettingsController::settings
+    _title_callback: Drupal\collection\Controller\CollectionSettingsController::title
+  requirements:
+    _custom_access: Drupal\collection\Controller\CollectionSettingsController::access
+  options:
+    parameters:
+      rdf_entity:
+        type: entity:rdf_entity
+        bundle:
+          - collection
diff --git a/web/themes/joinup/joinup_theme.theme b/web/themes/joinup/joinup_theme.theme
index f08fa4ea8a58554e7663f2c15384ddeb199d7b9a..ac86695d7d8a610000fb9127e4780fccb8a14ff6 100644
--- a/web/themes/joinup/joinup_theme.theme
+++ b/web/themes/joinup/joinup_theme.theme
@@ -1846,6 +1846,109 @@ function joinup_theme_preprocess_rdf_entity__licence__search_list_item(&$variabl
   }
 }
 
+/**
+ * Implements hook_preprocess_HOOK().
+ */
+function joinup_theme_preprocess_rdf_entity__solution__view_mode_search_list_item(array &$variables): void {
+  /** @var \Drupal\joinup_licence\Entity\LicenceInterface $entity */
+  $entity = $variables['elements']['#rdf_entity'];
+  $eif_perspective = $entity->eif_perspective->entity;
+  if (empty($eif_perspective)) {
+    return;
+  }
+
+  // Provides variables needed for the search_list_item view mode of licences.
+  // This is used on the Joinup Licence Assistant overview page.
+  $data_property_categories = [];
+
+  $parent_id = 'solution-category';
+  $category_lists[$parent_id] = [
+    'title' => 'Solution category',
+    'weight' => 3,
+    'class' => 'eif-tile__line--' . $parent_id,
+  ];
+  $category_lists[$parent_id]['items'] = [];
+  foreach ($eif_perspective->field_eif_solution_type as $solution_type) {
+    $solution_type = $solution_type->entity;
+    $category_lists[$parent_id]['items'][] = [
+      'title' => $solution_type->label(),
+      'weight' => 0,
+      'description' => '',
+    ];
+
+    $normalized_title = htmlentities(str_replace([' ', '/'], ['-', '-'], strtolower($solution_type->label())));
+    $data_property_categories[$solution_type->id()] = $normalized_title;
+  }
+
+  $data = [
+    'layer' => [
+      'field' => 'eif_layer',
+      'label' => 'Interoperability layer',
+      'class' => 'interoperability-layer',
+    ],
+    'principle' => [
+      'field' => 'eif_principle',
+      'label' => 'Underlying principle',
+      'class' => 'underlying-principles',
+    ],
+    'model' => [
+      'field' => 'eif_model',
+      'label' => 'Conceptual model',
+      'class' => 'conceptual-model',
+    ],
+  ];
+
+  $search = [' ', '/', ':'];
+  $replace = ['-', '-', ''];
+  foreach ($data as $key => $key_data) {
+    $category_lists[$key] = [
+      'title' => $key_data['label'],
+      'weight' => 3,
+      'class' => 'eif-tile__line--' . $key_data['class'],
+    ];
+    $category_lists[$key]['items'] = [];
+    foreach ($eif_perspective->{$key_data['field']} as $eif_wrapper_reference) {
+      // @todo Use an alternative title instead of dynamically splitting it.
+      // @see https://citnet.tech.ec.europa.eu/CITnet/jira/browse/ISAICP-7110.
+      $term = $eif_wrapper_reference->entity;
+      $parts = explode(':', $term->label());
+      $name = empty($parts[1]) ? $term->label() : trim($parts[1]);
+
+      $category_lists[$key]['items'][] = [
+        'title' => $name,
+        'weight' => $term->getWeight(),
+        'description' => $eif_wrapper_reference->entity->description->value,
+      ];
+
+      $normalized_title = htmlentities(str_replace($search, $replace, strtolower($term->label())));
+      $data_property_categories[$term->id()] = $normalized_title;
+    }
+  }
+
+  $variables['attributes']['data-eif-category'] = implode(' ', $data_property_categories);
+  $variables['attributes']['class'][] = 'eif-tile';
+
+  if (!empty($data_property_categories)) {
+    $sort_function = function ($a, $b) {
+      return $a['weight'] <=> $b['weight'];
+    };
+
+    usort($category_lists, $sort_function);
+    foreach ($category_lists as &$category_data) {
+      usort($category_data['items'], $sort_function);
+    }
+
+    $variables['eif_categories'] = implode(' ', $data_property_categories);
+    $variables['category_lists'] = $category_lists;
+  }
+
+  $eif_perspective_view = \Drupal::entityTypeManager()->getViewBuilder('rdf_meta_entity')->viewField($eif_perspective->field_eif_description, [
+    'label' => 'hidden',
+  ]);
+  $variables['eif_perspective_description'] = $eif_perspective_view;
+  $variables['solution_url'] = $entity->toUrl()->setAbsolute()->toString();
+}
+
 /**
  * Implements hook_preprocess_HOOK() for rdf-entity--solution--listing-item.html.twig.
  *
diff --git a/web/themes/joinup/scss/app.scss b/web/themes/joinup/scss/app.scss
index 1bcd314898a4307918b05c456cf3375c37976e2f..6563dd63cf0d43c2b77203f5d86589e9c1f0c0c3 100644
--- a/web/themes/joinup/scss/app.scss
+++ b/web/themes/joinup/scss/app.scss
@@ -12,79 +12,80 @@
 // Basic html elements
 //
 // Styleguide 1
+@import "base/blockquote";
 @import "base/body";
-@import "base/paragraph";
+@import "base/checkbox";
+@import "base/cookie_consent_kit";
 @import "base/heading";
-@import "base/blockquote";
+@import "base/input";
 @import "base/link";
 @import "base/ordered_list";
-@import "base/unordered_list";
-@import "base/table";
+@import "base/paragraph";
 @import "base/radio";
-@import "base/checkbox";
-@import "base/cookie_consent_kit";
-@import "base/input";
 @import "base/shared";
+@import "base/table";
+@import "base/unordered_list";
 
 // Components
 //
 // Joinup components
 //
 // Styleguide 2
-@import "components/search-bar";
-@import "components/header";
-@import "components/header-logo";
-@import "components/header-menu";
-@import "components/login-menu";
-@import "components/icons-bar";
-@import "components/sidebar-menu";
-@import "components/listing";
-@import "components/featured";
-@import "components/featured-interoperable-europe";
-@import "components/featured-lg";
-@import "components/icon";
+@import "components/accordion";
+@import "components/action-link";
+@import "components/alert";
+@import "components/announcement";
+@import "components/avatar";
 @import "components/background";
+@import "components/block";
 @import "components/button";
-@import "components/form";
-@import "components/editor-area";
-@import "components/tab";
-@import "components/alert";
-@import "components/tallinn";
-@import "components/form-table";
-@import "components/file-upload";
-@import "components/field-image-widget";
-@import "components/draggable";
-@import "components/vertical-table";
-@import "components/vertical-tabs";
+@import "components/chip";
+@import "components/chipfield";
 @import "components/circle-menu";
-@import "components/filters";
+@import "components/comment";
 @import "components/details";
-@import "components/action-link";
+@import "components/draggable";
+@import "components/editor-area";
+@import "components/eif";
 @import "components/etiquette";
-@import "components/timeline";
-@import "components/announcement";
-@import "components/avatar";
-@import "components/comment";
-@import "components/load-more";
+@import "components/featured";
+@import "components/featured-interoperable-europe";
+@import "components/featured-lg";
+@import "components/field-image-widget";
 @import "components/fieldset";
-@import "components/pager";
-@import "components/share-box";
+@import "components/file-upload";
+@import "components/filters";
 @import "components/footer";
 @import "components/footer-ec-menu";
 @import "components/footer-social-media";
-@import "components/vertical-menu";
-@import "components/page";
-@import "components/block";
+@import "components/form";
+@import "components/form-table";
+@import "components/glossary";
+@import "components/header";
+@import "components/header-logo";
+@import "components/header-menu";
+@import "components/icon";
 @import "components/icon-card";
+@import "components/icons-bar";
+@import "components/image-caption";
 @import "components/inline-social-media";
-@import "components/chip";
-@import "components/chipfield";
 @import "components/invite-form";
-@import "components/navigation-bottom";
-@import "components/image-caption";
 @import "components/licence";
-@import "components/glossary";
-@import "components/accordion";
+@import "components/listing";
+@import "components/load-more";
+@import "components/login-menu";
+@import "components/navigation-bottom";
+@import "components/page";
+@import "components/pager";
+@import "components/search-bar";
+@import "components/share-box";
+@import "components/sidebar-menu";
+@import "components/tab";
+@import "components/tallinn";
+@import "components/timeline";
+@import "components/vertical-menu";
+@import "components/vertical-table";
+@import "components/vertical-tabs";
 // Revamp (Ventuno theme) components
 @import "components/navbar-search--revamp";
 
diff --git a/web/themes/joinup/scss/components/_eif.scss b/web/themes/joinup/scss/components/_eif.scss
new file mode 100644
index 0000000000000000000000000000000000000000..48ce60a3263eda8e909c80c27c888ef318da8192
--- /dev/null
+++ b/web/themes/joinup/scss/components/_eif.scss
@@ -0,0 +1,559 @@
+// EIF
+//
+
+// Component
+// --------------------------------------------------
+
+// Elements
+// --------------------------------------------------
+.eif-filter__header {
+  height: 45px;
+  color: #fff;
+  text-align: center;
+
+  span {
+    font-weight: $font-weight-medium;
+    vertical-align: middle;
+    line-height: 45px;
+  }
+}
+
+.eif-filter__label {
+  color: $color-blue-dark;
+  font-weight: bold;
+  margin: 0 0 10px;
+}
+
+.eif-filter__content {
+  margin: 7px 0;
+}
+
+.eif__card {
+  height: 100%;
+}
+
+.eif-filter__list {
+  padding: 0;
+  margin: 0;
+  list-style: none;
+
+  .eif-filter__item {
+    font-size: $font-size-small;
+
+    &:last-child {
+      margin-bottom: 0;
+    }
+
+    a {
+      display: block;
+      padding: 7px 14px;
+      text-decoration: none;
+
+      &:hover {
+        text-decoration: underline;
+      }
+
+      &.is-active {
+        padding: 7px 14px 6px;
+        background: $color-grey-input;
+        border-bottom: 1px solid #fff;
+        color: #fff;
+      }
+    }
+  }
+}
+
+.eif-tile {
+  display: block;
+}
+
+.eif-tile__title {
+  div {
+    display: inline;
+  }
+
+  .icon {
+    margin-left: 0;
+    margin-right: 5px;
+    float: left;
+  }
+
+  @include breakpoint(mobile) {
+    margin-left: -21px;
+  }
+}
+
+.eif-tile__line {
+  font-size: $font-size-xsmall;
+  display: flex;
+  align-items: center;
+}
+
+.eif-tile__label {
+  color: #fff;
+  padding: 5px 10px;
+  margin-right: 10px;
+}
+
+.eif-tile__label-wrapper {
+  min-width: 150px;
+  text-align: right;
+}
+
+.eif-tile__button {
+  display: inline-block;
+  text-decoration: none;
+  padding: 10px 30px;
+  border: 2px solid $color-blue-warm;
+  font-size: $font-size-small;
+  border-radius: 5px;
+  background: $color-blue-warm;
+  color: #fff;
+
+  &:hover {
+    color: $color-base;
+    background: transparent;
+  }
+}
+
+.eif-tile__button--disabled {
+  background: transparent;
+  color: $color-base;
+  border-color: $color-orange-warm;
+  pointer-events: none;
+}
+
+.eif-tile__actions {
+  @include z-index(highlight + 1);
+  @include breakpoint(lg-desktop) {
+    position: absolute;
+    right: 20px;
+    bottom: 20px;
+  }
+}
+
+.eif-tile__actions-item {
+  display: inline-block;
+  margin-right: $field-margin;
+  margin-bottom: $field-margin;
+
+  &:last-child {
+    margin-right: 0;
+    margin-bottom: 0;
+  }
+
+  @include breakpoint(lg-desktop) {
+    margin-bottom: 0;
+  }
+}
+
+.eif-counter {
+  font-weight: bold;
+  margin: 10px 0;
+
+  @include breakpoint(desktop) {
+    margin: 0 0 10px;
+  }
+}
+
+.eif-search__label {
+  color: $color-blue-dark;
+  font-weight: bold;
+  display: inline-block;
+  vertical-align: middle;
+}
+
+.eif-search__input {
+  display: inline-block;
+  vertical-align: middle;
+
+  @include breakpoint(mobile) {
+    margin: 0 10px 5px 10px;
+  }
+}
+
+.eif-search__form {
+  .eif-search__reset {
+    margin: 10px 0;
+  }
+
+  @include breakpoint(desktop) {
+    margin: 0;
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+  }
+}
+
+.eif-comparer__dialog {
+  /* hack to correctly center jquery ui-dialog. */
+  left: 50% !important;
+  top: 50% !important;
+  transform: translate(-50%, -50%);
+  margin: 0 !important;
+
+  .ui-dialog-content {
+    margin-top: 20px;
+  }
+  .ui-dialog-buttonset {
+    margin-top: 0 !important;
+  }
+  .ui-button {
+    background: white;
+    border: 3px solid #227BD9;
+    padding: 12px 25px;
+    font-size: 16px;
+    &:focus {
+      outline: none;
+    }
+    &:hover {
+      background: #227BD9;
+      color:white;
+    }
+  }
+}
+
+// Modifiers
+// --------------------------------------------------
+.eif-filter--underlying-principles {
+  .eif-filter__header {
+    background-color: $color-green-warm;
+  }
+
+  .eif-filter__item {
+    a {
+      color: $color-green-warm;
+    }
+  }
+
+  &.eif-comparer__sidebar-header {
+    background-color: $color-green-warm;
+  }
+
+  &.eif-comparer__sidebar-cell {
+    color: $color-green-warm;
+  }
+}
+
+.eif-filter--must {
+  .eif-filter__header {
+    background-color: $color-beige-warm;
+  }
+
+  .eif-filter__item {
+    a {
+      color: $color-beige-warm;
+    }
+  }
+
+  &.eif-comparer__sidebar-header {
+    background-color: $color-beige-warm;
+  }
+
+  &.eif-comparer__sidebar-cell {
+    color: $color-beige-warm;
+  }
+}
+
+.eif-filter--cannot {
+  .eif-filter__header {
+    background-color: $color-red-warm;
+  }
+
+  .eif-filter__item {
+    a {
+      color: $color-red-warm;
+    }
+  }
+
+  &.eif-comparer__sidebar-header {
+    background-color: $color-red-warm;
+  }
+
+  &.eif-comparer__sidebar-cell {
+    color: $color-red-warm;
+  }
+}
+
+.eif-filter--conceptual-model {
+  .eif-filter__header {
+    background-color: $color-blue-warm;
+  }
+
+  .eif-filter__item {
+    a {
+      color: $color-blue-warm;
+    }
+  }
+
+  &.eif-comparer__sidebar-header {
+    background-color: $color-blue-warm;
+  }
+
+  &.eif-comparer__sidebar-cell {
+    color: $color-blue-warm;
+  }
+}
+
+.eif-filter--solution-category {
+  .eif-filter__header {
+    background-color: $color-grey-warm;
+  }
+
+  .eif-filter__item {
+    a {
+      color: $color-grey-warm;
+    }
+  }
+
+  &.eif-comparer__sidebar-header {
+    background-color: $color-grey-warm;
+  }
+
+  &.eif-comparer__sidebar-cell {
+    color: $color-grey-warm;
+  }
+}
+
+.eif-filter--interoperability-layer {
+  .eif-filter__header {
+    background-color: $color-orange-warm;
+  }
+
+  .eif-filter__item {
+    a {
+      color: $color-orange-warm;
+    }
+  }
+
+  &.eif-comparer__sidebar-header {
+    background-color: $color-orange-warm;
+  }
+
+  &.eif-comparer__sidebar-cell {
+    color: $color-orange-warm;
+  }
+}
+
+.eif-tile__line--underlying-principles {
+  .eif-tile__label {
+    background-color: $color-green-warm;
+  }
+
+  .eif-tile__value {
+    color: $color-green-warm;
+  }
+}
+
+.eif-tile__line--must {
+  .eif-tile__label {
+    background-color: $color-beige-warm;
+  }
+
+  .eif-tile__value {
+    color: $color-beige-warm;
+  }
+}
+
+.eif-tile__line--cannot {
+  .eif-tile__label {
+    background-color: $color-red-warm;
+  }
+
+  .eif-tile__value {
+    color: $color-red-warm;
+  }
+}
+
+.eif-tile__line--conceptual-model {
+  .eif-tile__label {
+    background-color: $color-blue-warm;
+  }
+
+  .eif-tile__value {
+    color: $color-blue-warm;
+  }
+}
+
+.eif-tile__line--solution-category {
+  .eif-tile__label {
+    background-color: $color-grey-warm;
+  }
+
+  .eif-tile__value {
+    color: $color-grey-warm;
+  }
+}
+
+.eif-tile__line--interoperability-layer {
+  .eif-tile__label {
+    background-color: $color-orange-warm;
+  }
+
+  .eif-tile__value {
+    color: $color-orange-warm;
+  }
+}
+
+.eif-comparer {
+  border-spacing: 0;
+  width: 100%;
+
+  @include breakpoint(tablet) {
+    table-layout: fixed;
+  }
+
+  td {
+    padding: 5px;
+  }
+
+  .icon {
+    font-size: $font-size-xsmall;
+    color: #fff;
+    background: $color-orange;
+    border-radius: 50%;
+    padding: 5px;
+  }
+
+  .icon--info {
+    font-size: $font-size-medium;
+    color: #000;
+    background: transparent;
+    border-radius: initial;
+  }
+
+  &__wrapper {
+    overflow-x: auto;
+  }
+
+  &__cell, &__header {
+    background: #fff;
+    padding: 5px;
+    border: 5px solid $color-grey-bg;
+    text-align: center;
+
+    &:nth-child(2) {
+      border-left-width: 10px;
+    }
+  }
+
+  &__header {
+    font-weight: $font-weight-bold;
+    padding: 7px;
+
+    span {
+      display: inline-block;
+      vertical-align: middle;
+      padding: 0 5px;
+
+      &.icon--info {
+        cursor: pointer;
+      }
+    }
+  }
+
+  &__sidebar-header {
+    color: #fff;
+    padding: 5px;
+    height: 45px;
+    text-align: center;
+    font-weight: $font-weight-medium;
+    font-size: $font-size-base;
+  }
+
+  &__sidebar-cell {
+    border: 5px solid #fff;
+    background: #fff;
+  }
+
+  &__empty-cell {
+    background: $color-grey-filler;
+  }
+}
+
+// Modifiers
+// --------------------------------------------------
+.listing__item--compatibility {
+  .listing__card--inline-container {
+    padding: 10px;
+    .listing__inner-tile--shifted {
+      flex: 2 1 300px;
+      padding: 10px;
+
+      .listing__title,
+      .listing__teaser {
+        margin-left: 0;
+        max-height: initial;
+        line-height: initial;
+        overflow: initial;
+      }
+    }
+    .eif-tile__actions {
+      position: initial;
+      top: initial;
+      left: initial;
+    }
+  }
+}
+
+// Dependencies
+// --------------------------------------------------
+.eif-tile {
+  border: 1px solid $color-grey-warm;
+  padding: 1rem;
+  background: white;
+  .listing__card {
+    min-height: 0;
+    flex-direction: column!important;
+    @include breakpoint(tablet) {
+      flex-direction: row!important;
+    }
+    .listing__inner-tile--wider {
+      padding-right: 1rem;
+    }
+    .listing__card--inline-container {
+      border: 1px solid $color-grey-warm;
+      border-radius: .5rem;
+      .listing__inner-tile:first-of-type {
+        display: none;
+        @include breakpoint(tablet) {
+          display: flex;
+          align-items: center;
+          flex: 0 0 25%;
+        }
+      }
+      .listing__inner-tile:last-of-type {
+        flex: 0 0 100%;
+        @include breakpoint(tablet) {
+          flex: 0 0 75%;
+        }
+        .listing__field {
+          .listing__title {
+            font-size: 16px;
+            font-weight: $font-weight-bold;
+            max-height: unset;
+          }
+          li, p {
+            font-size: 12px;
+            line-height: 1.2;
+          }
+          li {
+            color: $color-grey-medium;
+            list-style-type: none;
+          }
+        }
+        .eif-tile__button {
+          float: right;
+        }
+      }
+    }
+  }
+}
+
+// States
+// --------------------------------------------------
+.eif-tile {
+  &.is-hidden {
+    display: none;
+  }
+}
diff --git a/web/themes/joinup/templates/parts/eif-filter-list.html.twig b/web/themes/joinup/templates/parts/eif-filter-list.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..288ec7b9e5305cdbb7f077c7f0a11552d9cac4ab
--- /dev/null
+++ b/web/themes/joinup/templates/parts/eif-filter-list.html.twig
@@ -0,0 +1,37 @@
+{#
+/**
+ * @file
+ * Default implementation of displaying a grid of lists.
+ *
+ * Available variables:
+ * - items: A nested list of items. Each item contains:
+ * -- title: The title of the parent.
+ * -- class: The explicit parent class to pass to the list
+ * -- children: A nested list of items. Each item contains:
+ * --- data-eif-category: The eif category to pass to the data attribute data-eif-category.
+ * --- title: The title of the child.
+ * --- description: The description of the field to pass to the data attribute.
+ */
+#}
+<div class="listing listing--grid">
+  <div class="row">
+    <div class="mdl-grid">
+      {% for parent_item in items %}
+        <div class="eif-filter {{ parent_item.class }} mdl-cell mdl-cell--3-col mdl-cell--3-col-wide">
+          <div class="eif__card mdl-card">
+            <div class="eif-filter__header">
+              <span>{{ parent_item.title }}</span>
+            </div>
+            <div class="eif-filter__content">
+              <ul class="eif-filter__list">
+                {% for child in parent_item.items %}
+                  <li class="eif-filter__item"><a data-eif-category="{{ child.eif_category }}" href="#" title="{{ child.description }}">{{ child.title }}</a></li>
+                {% endfor %}
+              </ul>
+            </div>
+          </div>
+        </div>
+      {% endfor %}
+    </div>
+  </div>
+</div>
diff --git a/web/themes/joinup/templates/rdf_entity/rdf-entity--solution--view-mode-search-list-item.html.twig b/web/themes/joinup/templates/rdf_entity/rdf-entity--solution--view-mode-search-list-item.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..4da24e52cac245c6cd1af3fe775d8d097efd679b
--- /dev/null
+++ b/web/themes/joinup/templates/rdf_entity/rdf-entity--solution--view-mode-search-list-item.html.twig
@@ -0,0 +1,67 @@
+{#
+/**
+ * @file
+ * Themeing for the search_list_item view mode of solution rdf entities.
+ *
+ * Available variables:
+ * - eif_title: The eif title.
+ * - category_lists: An array of variables with details on the category lists. Contains variables:
+ */
+#}
+{%
+  set classes = [
+    'eif-tile',
+    'mdl-cell',
+    'mdl-cell--12-col',
+    'mdl-cell--12-col-wide',
+  ]
+%}
+<div class="listing listing--grid">
+  <div class="row">
+    <div class="mdl-grid">
+      <div {{ attributes.addClass(classes) }} data-eif-category="{{ eif_categories }}">
+        <div class="listing__card listing__card--inline-container mdl-card">
+          <div class="listing__inner-tile listing__inner-tile--wider">
+            {% for category_list in category_lists  %}
+              <div class="listing__field">
+                <div class="eif-tile__line {{ category_list.class }}">
+                  <div class="eif-tile__label-wrapper">
+                    <span class="eif-tile__label">
+                      {{ category_list.title }}
+                    </span>
+                  </div>
+                  <div class="eif-tile__value">
+                    {% for item in category_list.items %}
+                      <span title="{{ item.description }}">{{ item.title }}</span>{% if loop.last == false %}, {% endif %}
+                    {% endfor %}
+                  </div>
+                </div>
+              </div>
+            {% endfor %}
+          </div>
+          <div class="listing__card listing__card--inline-container">
+            <div class="listing__inner-tile">
+              <div class="listing__field">
+                {{ content.field_is_logo }}
+              </div>
+            </div>
+            <div class="listing__inner-tile">
+              <div class="listing__field">
+                {{ title_prefix }}<h2 class="listing__title licence-tile__title">{{ label }}</h2>{{ title_suffix }}
+              </div>
+              <div class="listing__field">
+                {{ eif_perspective_description }}
+              </div>
+              <div class="listing__field">
+                <li class="mb-2"><strong>{{ 'Solution\'s owner'|t }}:</strong> {{ content.field_is_owner|render|striptags }}</li>
+              </div>
+              <div class="listing__field">
+                <a class="eif-tile__button eif-tile__button--compare " href="{{ solution_url }}">{{ 'Go to Solution'|t }}</a>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</div>
diff --git a/web/themes/ventuno/bcl-builder.config.js b/web/themes/ventuno/bcl-builder.config.js
index af353afe1cbf12e1a90866478d507728ab62d2fc..772ed17fa6334c460cccdb986b5a6f5a4b8f4a2c 100644
--- a/web/themes/ventuno/bcl-builder.config.js
+++ b/web/themes/ventuno/bcl-builder.config.js
@@ -173,6 +173,14 @@ module.exports = {
         sourceMap: "file",
       },
     },
+    {
+      entry: path.resolve(outputFolder, "src/scss/form-checkboxes.scss"),
+      dest: path.resolve(outputFolder, "assets/css/form-checkboxes.css"),
+      options: {
+        includePaths,
+        sourceMap: "file",
+      },
+    },
     {
       entry: path.resolve(outputFolder, "src/scss/forms.scss"),
       dest: path.resolve(outputFolder, "assets/css/forms.css"),
@@ -415,11 +423,13 @@ module.exports = {
             'folder2-open.svg',
             'info-circle.svg',
             'info-circle-fill.svg',
+            'journal-text.svg',
             'justify.svg',
             'lightning-charge.svg',
             'linkedin.svg',
             'newspaper.svg',
             'person-circle.svg',
+            'question-lg.svg',
             'search.svg',
             'star.svg',
             'twitter.svg',
diff --git a/web/themes/ventuno/src/scss/components/_form-checkboxes.scss b/web/themes/ventuno/src/scss/components/_form-checkboxes.scss
new file mode 100644
index 0000000000000000000000000000000000000000..d8439cbfd8a2063259956b27c149c7e633118580
--- /dev/null
+++ b/web/themes/ventuno/src/scss/components/_form-checkboxes.scss
@@ -0,0 +1,8 @@
+.form-checkboxes {
+  .form-switch,
+  .form-check {
+    .form-label {
+      font-weight: $font-weight-base;
+    }
+  }
+}
diff --git a/web/themes/ventuno/src/scss/core/overrides/_utilities.scss b/web/themes/ventuno/src/scss/core/overrides/_utilities.scss
index 57a663a1b26b82c5423da1152d2c2ce11e9594a8..646deafd0cb3df1cfa6f504b1cbb4997bf03e3c7 100644
--- a/web/themes/ventuno/src/scss/core/overrides/_utilities.scss
+++ b/web/themes/ventuno/src/scss/core/overrides/_utilities.scss
@@ -14,15 +14,15 @@ $utilities: map-merge(
       // ),
       // scss-docs-end utils-vertical-align
       // scss-docs-start utils-float
-      // "float": (
-      //   responsive: true,
-      //   property: float,
-      //   values: (
-      //     start: left,
-      //     end: right,
-      //     none: none,
-      //   )
-      // ),
+      "float": (
+        responsive: false,
+        property: float,
+        values: (
+          start: left,
+          end: right,
+          none: none,
+        )
+      ),
       // scss-docs-end utils-float
       // Opacity utilities
       // scss-docs-start utils-opacity
diff --git a/web/themes/ventuno/src/scss/form-checkboxes.scss b/web/themes/ventuno/src/scss/form-checkboxes.scss
new file mode 100644
index 0000000000000000000000000000000000000000..153cbfb0f9da1dd70f493a48a6840887134d4546
--- /dev/null
+++ b/web/themes/ventuno/src/scss/form-checkboxes.scss
@@ -0,0 +1,2 @@
+@import "core";
+@import "components/form-checkboxes";
diff --git a/web/themes/ventuno/templates/eif-wrapper/eif-wrapper--recommendation--default.html.twig b/web/themes/ventuno/templates/eif-wrapper/eif-wrapper--recommendation--default.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..be7742df614f903ebff42b5f59cef21bd9754c97
--- /dev/null
+++ b/web/themes/ventuno/templates/eif-wrapper/eif-wrapper--recommendation--default.html.twig
@@ -0,0 +1,10 @@
+{#
+/**
+ * @file
+ * Themeing for EIF wrapper.
+ */
+#}
+<article {{ attributes.addClass('d-inline') }}>
+{{ content.term }}
+{{ content.description }}
+</article>
diff --git a/web/themes/ventuno/templates/field/field--rdf-entity--eif-perspective--solution.html.twig b/web/themes/ventuno/templates/field/field--rdf-entity--eif-perspective--solution.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..729bc46d99e2516b16157c5fda8857a6702968ac
--- /dev/null
+++ b/web/themes/ventuno/templates/field/field--rdf-entity--eif-perspective--solution.html.twig
@@ -0,0 +1,49 @@
+{#
+/**
+ * @file
+ * Default template for a field.
+ */
+#}
+{%
+  set classes = [
+    'field--name-' ~ field_name|clean_class,
+    bundle|clean_class ~ '__' ~ field_name_clean|clean_class,
+    label_display == 'inline' ? 'd-flex',
+  ]
+%}
+{%
+  set title_classes = [
+    'field__label',
+    'fw-bold',
+    label_display == 'visually_hidden' ? 'visually-hidden',
+  ]
+%}
+
+{% if label_hidden %}
+  {% if multiple %}
+    <div{{ attributes.addClass(classes) }}>
+      {% for item in items %}
+        <div{{ item.attributes.addClass('field__item') }}>{{ item.content }}</div>
+      {% endfor %}
+    </div>
+  {% else %}
+    {% for item in items %}
+      <div{{ attributes.addClass(classes) }}>{{ item.content }}</div>
+    {% endfor %}
+  {% endif %}
+{% else %}
+  <div{{ attributes.addClass(classes) }}>
+    <div{{ title_attributes.addClass(title_classes) }}>
+      {{ label }}{% if label_display == 'inline' %}<span class="me-1">:</span>{% endif %}
+    </div>
+    {% if multiple %}
+    <div class="field__items">
+      {% endif %}
+      {% for item in items %}
+        <div{{ item.attributes.addClass('field__item') }}>{{ item.content }}</div>
+      {% endfor %}
+      {% if multiple %}
+    </div>
+    {% endif %}
+  </div>
+{% endif %}
diff --git a/web/themes/ventuno/templates/field/field--rdf-meta-entity--eif-layer--eif-perspective.html.twig b/web/themes/ventuno/templates/field/field--rdf-meta-entity--eif-layer--eif-perspective.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..b4d05b5f68bf4455e1a1d37f2619656102e356cb
--- /dev/null
+++ b/web/themes/ventuno/templates/field/field--rdf-meta-entity--eif-layer--eif-perspective.html.twig
@@ -0,0 +1,71 @@
+{#
+/**
+ * @file
+ * Default template for a field.
+ */
+#}
+{%
+  set classes = [
+    'ps-0',
+    'field--name-' ~ field_name|clean_class,
+    bundle|clean_class ~ '__' ~ field_name_clean|clean_class,
+  ]
+%}
+{%
+  set title_classes = [
+    'field__label',
+    'fw-bold',
+    label_display == 'visually_hidden' ? 'visually-hidden',
+  ]
+%}
+
+{% if label_hidden %}
+  {% if multiple %}
+    <ul{{ attributes.addClass(classes) }}>
+      {% for item in items %}
+        <li{{ item.attributes.addClass(['field__item', 'list-unstyled', 'mb-2']) }}>
+          <span class="text-success">
+            {{ pattern('icon', {
+              name: 'check-circle-fill',
+              path: bcl_icon_path,
+              size: 's',
+            }) }}
+          </span>
+          {{ item.content }}
+        </li>
+      {% endfor %}
+    </ul>
+  {% else %}
+    {% for item in items %}
+      <div{{ attributes.addClass(classes) }}>{{ item.content }}</div>
+    {% endfor %}
+  {% endif %}
+{% else %}
+  <div{{ attributes.addClass(classes) }}>
+    {% if multiple %}
+      {% if label_display == 'inline' %}
+        <span{{ title_attributes.addClass(title_classes) }}>{{ label }}<span class="me-1">:</span></span>
+      {% else %}
+        <div{{ title_attributes.addClass(title_classes) }}>{{ label }}</div>
+      {% endif %}
+      {% for item in items %}
+        <span{{ item.attributes }}>{{ item.content }}</span>{{ not loop.last ? ', ' }}
+      {% endfor %}
+    {% else %}
+      {% if label_display == 'inline' %}
+        {% for item in items %}
+          <span{{ title_attributes.addClass(title_classes) }}>{{ label }}:</span>
+          <span{{ item.attributes }}>{{ item.content }}</span>
+        {% endfor %}
+      {% else %}
+        <div{{ title_attributes.addClass(title_classes) }}>
+          {{ label }}
+        </div>
+        {% for item in items %}
+          <span{{ title_attributes.addClass(title_classes) }}>{{ label }}:</span>
+          <span{{ item.attributes }}>{{ item.content }}</span>
+        {% endfor %}
+      {% endif %}
+    {% endif %}
+  </div>
+{% endif %}
diff --git a/web/themes/ventuno/templates/field/field--rdf-meta-entity--eif-model--eif-perspective.html.twig b/web/themes/ventuno/templates/field/field--rdf-meta-entity--eif-model--eif-perspective.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..b4d05b5f68bf4455e1a1d37f2619656102e356cb
--- /dev/null
+++ b/web/themes/ventuno/templates/field/field--rdf-meta-entity--eif-model--eif-perspective.html.twig
@@ -0,0 +1,71 @@
+{#
+/**
+ * @file
+ * Default template for a field.
+ */
+#}
+{%
+  set classes = [
+    'ps-0',
+    'field--name-' ~ field_name|clean_class,
+    bundle|clean_class ~ '__' ~ field_name_clean|clean_class,
+  ]
+%}
+{%
+  set title_classes = [
+    'field__label',
+    'fw-bold',
+    label_display == 'visually_hidden' ? 'visually-hidden',
+  ]
+%}
+
+{% if label_hidden %}
+  {% if multiple %}
+    <ul{{ attributes.addClass(classes) }}>
+      {% for item in items %}
+        <li{{ item.attributes.addClass(['field__item', 'list-unstyled', 'mb-2']) }}>
+          <span class="text-success">
+            {{ pattern('icon', {
+              name: 'check-circle-fill',
+              path: bcl_icon_path,
+              size: 's',
+            }) }}
+          </span>
+          {{ item.content }}
+        </li>
+      {% endfor %}
+    </ul>
+  {% else %}
+    {% for item in items %}
+      <div{{ attributes.addClass(classes) }}>{{ item.content }}</div>
+    {% endfor %}
+  {% endif %}
+{% else %}
+  <div{{ attributes.addClass(classes) }}>
+    {% if multiple %}
+      {% if label_display == 'inline' %}
+        <span{{ title_attributes.addClass(title_classes) }}>{{ label }}<span class="me-1">:</span></span>
+      {% else %}
+        <div{{ title_attributes.addClass(title_classes) }}>{{ label }}</div>
+      {% endif %}
+      {% for item in items %}
+        <span{{ item.attributes }}>{{ item.content }}</span>{{ not loop.last ? ', ' }}
+      {% endfor %}
+    {% else %}
+      {% if label_display == 'inline' %}
+        {% for item in items %}
+          <span{{ title_attributes.addClass(title_classes) }}>{{ label }}:</span>
+          <span{{ item.attributes }}>{{ item.content }}</span>
+        {% endfor %}
+      {% else %}
+        <div{{ title_attributes.addClass(title_classes) }}>
+          {{ label }}
+        </div>
+        {% for item in items %}
+          <span{{ title_attributes.addClass(title_classes) }}>{{ label }}:</span>
+          <span{{ item.attributes }}>{{ item.content }}</span>
+        {% endfor %}
+      {% endif %}
+    {% endif %}
+  </div>
+{% endif %}
diff --git a/web/themes/ventuno/templates/field/field--rdf-meta-entity--eif-perspective.html.twig b/web/themes/ventuno/templates/field/field--rdf-meta-entity--eif-perspective.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..be5c321e7c9c61d1cc35c99629e47993ec08f40e
--- /dev/null
+++ b/web/themes/ventuno/templates/field/field--rdf-meta-entity--eif-perspective.html.twig
@@ -0,0 +1,64 @@
+{#
+/**
+ * @file
+ * Default template for a field.
+ */
+#}
+{%
+  set classes = [
+    'ps-0',
+    'field--name-' ~ field_name|clean_class,
+    bundle|clean_class ~ '__' ~ field_name_clean|clean_class,
+  ]
+%}
+{%
+  set title_classes = [
+    'field__label',
+    'fw-bold',
+    label_display == 'visually_hidden' ? 'visually-hidden',
+  ]
+%}
+
+{% if label_hidden %}
+  {% if multiple %}
+    <ul{{ attributes.addClass(classes) }}>
+      {% for item in items %}
+        <li{{ item.attributes.addClass(['field__item', 'list-unstyled', 'mb-2']) }}>
+          {{ item.content }}
+        </li>
+      {% endfor %}
+    </ul>
+  {% else %}
+    {% for item in items %}
+      <div{{ attributes.addClass(classes) }}>{{ item.content }}</div>
+    {% endfor %}
+  {% endif %}
+{% else %}
+  <div{{ attributes.addClass(classes) }}>
+    {% if multiple %}
+      {% if label_display == 'inline' %}
+        <span{{ title_attributes.addClass(title_classes) }}>{{ label }}<span class="me-1">:</span></span>
+      {% else %}
+        <div{{ title_attributes.addClass(title_classes) }}>{{ label }}</div>
+      {% endif %}
+      {% for item in items %}
+        <span{{ item.attributes }}>{{ item.content }}</span>{{ not loop.last ? ', ' }}
+      {% endfor %}
+    {% else %}
+      {% if label_display == 'inline' %}
+        {% for item in items %}
+          <span{{ title_attributes.addClass(title_classes) }}>{{ label }}:</span>
+          <span{{ item.attributes }}>{{ item.content }}</span>
+        {% endfor %}
+      {% else %}
+        <div{{ title_attributes.addClass(title_classes) }}>
+          {{ label }}
+        </div>
+        {% for item in items %}
+          <span{{ title_attributes.addClass(title_classes) }}>{{ label }}:</span>
+          <span{{ item.attributes }}>{{ item.content }}</span>
+        {% endfor %}
+      {% endif %}
+    {% endif %}
+  </div>
+{% endif %}
diff --git a/web/themes/ventuno/templates/field/field--rdf-meta-entity--eif-principle--eif-perspective.html.twig b/web/themes/ventuno/templates/field/field--rdf-meta-entity--eif-principle--eif-perspective.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..e936564520635d8dfff489837aa4fd09f0d69bee
--- /dev/null
+++ b/web/themes/ventuno/templates/field/field--rdf-meta-entity--eif-principle--eif-perspective.html.twig
@@ -0,0 +1,28 @@
+{#
+/**
+ * @file
+ * Default template for a field.
+ */
+#}
+{%
+  set classes = [
+    'ps-0',
+    'field--name-' ~ field_name|clean_class,
+    bundle|clean_class ~ '__' ~ field_name_clean|clean_class,
+  ]
+%}
+
+<ul{{ attributes.addClass(classes) }}>
+  {% for item in items %}
+    <li{{ item.attributes.addClass(['field__item', 'list-unstyled', 'mb-2']) }}>
+      <span class="text-success">
+        {{ pattern('icon', {
+          name: 'check-circle-fill',
+          path: bcl_icon_path,
+          size: 's',
+        }) }}
+      </span>
+      {{ item.content }}
+    </li>
+  {% endfor %}
+</ul>
diff --git a/web/themes/ventuno/templates/field/field--rdf-meta-entity--field-eif-description--eif-perspective.html.twig b/web/themes/ventuno/templates/field/field--rdf-meta-entity--field-eif-description--eif-perspective.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..a9d20ffae668f9bc5dc54451b6f2e5b962cc59dc
--- /dev/null
+++ b/web/themes/ventuno/templates/field/field--rdf-meta-entity--field-eif-description--eif-perspective.html.twig
@@ -0,0 +1,47 @@
+{#
+/**
+ * @file
+ * Default template for a field.
+ */
+#}
+{%
+  set classes = [
+    'mb-2',
+    'field--name-' ~ field_name|clean_class,
+    bundle|clean_class ~ '__' ~ field_name_clean|clean_class,
+  ]
+%}
+{%
+  set title_classes = [
+    'field__label',
+    'fw-bold',
+    label_display == 'visually_hidden' ? 'visually-hidden',
+  ]
+%}
+<div{{ attributes.addClass(classes) }}>
+  {% if multiple %}
+    {% if label_display == 'inline' %}
+      <span{{ title_attributes.addClass(title_classes) }}>{{ label }}<span class="me-1">:</span></span>
+    {% else %}
+      <div{{ title_attributes.addClass(title_classes) }}>{{ label }}</div>
+    {% endif %}
+    {% for item in items %}
+      <span{{ item.attributes }}>{{ item.content }}</span>{{ not loop.last ? ', ' }}
+    {% endfor %}
+  {% else %}
+    {% if label_display == 'inline' %}
+      {% for item in items %}
+        <span{{ title_attributes.addClass(title_classes) }}>{{ label }}:</span>
+        <span{{ item.attributes }}>{{ item.content }}</span>
+      {% endfor %}
+    {% else %}
+      <div{{ title_attributes.addClass(title_classes) }}>
+        {{ label }}
+      </div>
+      {% for item in items %}
+        <span{{ title_attributes.addClass(title_classes) }}>{{ label }}:</span>
+        <span{{ item.attributes }}>{{ item.content }}</span>
+      {% endfor %}
+    {% endif %}
+  {% endif %}
+</div>
diff --git a/web/themes/ventuno/templates/field/field--rdf-meta-entity--field-eif-solution-type--eif-perspective.html.twig b/web/themes/ventuno/templates/field/field--rdf-meta-entity--field-eif-solution-type--eif-perspective.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..1ceae9ae496c3f65599dd39d634e5b663a7482bd
--- /dev/null
+++ b/web/themes/ventuno/templates/field/field--rdf-meta-entity--field-eif-solution-type--eif-perspective.html.twig
@@ -0,0 +1,47 @@
+{#
+/**
+ * @file
+ * Default template for a field.
+ */
+#}
+{%
+  set classes = [
+    'mb-3',
+    'field--name-' ~ field_name|clean_class,
+    bundle|clean_class ~ '__' ~ field_name_clean|clean_class,
+  ]
+%}
+{%
+  set title_classes = [
+    'field__label',
+    'fw-bold',
+  ]
+%}
+
+<div{{ attributes.addClass(classes) }}>
+  {% if multiple %}
+    {% if label_display == 'inline' %}
+      <span{{ title_attributes.addClass(title_classes) }}>{{ label }}<span class="me-1">:</span></span>
+    {% else %}
+      <div{{ title_attributes.addClass(title_classes) }}>{{ label }}</div>
+    {% endif %}
+    {% for item in items %}
+      <span{{ item.attributes }}>{{ item.content }}</span>{{ not loop.last ? ', ' }}
+    {% endfor %}
+  {% else %}
+    {% if label_display == 'inline' %}
+      {% for item in items %}
+        <span{{ title_attributes.addClass(title_classes) }}>{{ label }}:</span>
+        <span{{ item.attributes }}>{{ item.content }}</span>
+      {% endfor %}
+    {% else %}
+      <div{{ title_attributes.addClass(title_classes) }}>
+        {{ label }}
+      </div>
+      {% for item in items %}
+        <span{{ title_attributes.addClass(title_classes) }}>{{ label }}:</span>
+        <span{{ item.attributes }}>{{ item.content }}</span>
+      {% endfor %}
+    {% endif %}
+  {% endif %}
+</div>
diff --git a/web/themes/ventuno/templates/misc/status-messages.html.twig b/web/themes/ventuno/templates/misc/status-messages.html.twig
index c59e0a0880cac8d05b9fd0c72d6eaf29057b5931..430fecd0624a65864d1246793ef506e14ec5d2ec 100644
--- a/web/themes/ventuno/templates/misc/status-messages.html.twig
+++ b/web/themes/ventuno/templates/misc/status-messages.html.twig
@@ -19,7 +19,6 @@
  *   - class: HTML classes.
  */
 #}
-{{ attach_library('ventuno/site-alerts-messages') }}
 <div data-drupal-messages class="container mt-4">
 {% block messages %}
 {% for type, messages in message_list %}
diff --git a/web/themes/ventuno/templates/rdf-entity/rdf-entity--solution--eif-perspective.html.twig b/web/themes/ventuno/templates/rdf-entity/rdf-entity--solution--eif-perspective.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..dc94695498cd381e121c857fea452073bbb5a49b
--- /dev/null
+++ b/web/themes/ventuno/templates/rdf-entity/rdf-entity--solution--eif-perspective.html.twig
@@ -0,0 +1,47 @@
+{#
+/**
+ * @file
+ * Themeing for rdf entities.
+ */
+#}
+<article{{ attributes }}>
+  <div class="d-flex justify-content-between">
+    <div>
+      <a class="btn btn-sm btn-outline-brand rounded-pill mb-1" href="{{ url('<front>')|render }}/node/703244">Back to recommendations</a>
+      <a class="btn btn-sm btn-outline-brand rounded-pill mb-1" href="{{ url('<front>')|render }}/node/703245">Back to solutions</a>
+    </div>
+    <div>
+      <a class="btn btn-sm btn-outline-brand rounded-pill mb-1" href="{{ url('<front>')|render }}/collection/nifo-national-interoperability-framework-observatory/glossary">
+        {{ pattern('icon', {
+          name: 'journal-text',
+          path: bcl_icon_path,
+          size: 'fluid',
+        }) }}
+        {{ 'Glossary'|t }}
+      </a>
+      <a class="btn btn-sm btn-outline-brand rounded-pill mb-1" href="{{ url('<front>')|render }}/collection/nifo-national-interoperability-framework-observatory/solution/eif-toolbox/what-eif">
+        {{ pattern('icon', {
+          name: 'question-lg',
+          path: bcl_icon_path,
+          size: 'fluid',
+        }) }}
+        {{ 'What is EIF'|t }}
+      </a>
+    </div>
+  </div>
+
+  {{ title_prefix }}
+  <h2 class="my-3 fs-4">{{ "General information"|t }}</h2>
+  {{ title_suffix }}
+  <div class="row">
+    <div class="col-12 col-sm-4 col-md-3 col-lg-2">
+      {{ content.field_is_logo }}
+    </div>
+    <div class="col-12 col-sm-8 col-md-9 col-lg-10">
+      <p class="mb-2"><strong>{{ 'Name of the solution'|t }}:</strong> {{ label|striptags }}</p>
+      <p class="mb-2"><strong>{{ 'Solution\'s owner'|t }}:</strong> {{ content.field_is_owner|render|striptags }}</p>
+      <p class="mb-2">{{ content.eif_perspective_fields.field_eif_description }}</p>
+    </div>
+    {{ content.eif_perspective }}
+  </div>
+</article>
diff --git a/web/themes/ventuno/templates/rdf-meta-entity/rdf-meta-entity.html.twig b/web/themes/ventuno/templates/rdf-meta-entity/rdf-meta-entity.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..5c832323a7fe64d8a18554ef0f515d886fc58d81
--- /dev/null
+++ b/web/themes/ventuno/templates/rdf-meta-entity/rdf-meta-entity.html.twig
@@ -0,0 +1,39 @@
+{#
+/**
+ * @file
+ * Themeing for RDF meta entities.
+ */
+#}
+<article{{ attributes.addClass(['mt-3']) }}>
+  {{ content.field_eif_solution_type }}
+  <a class="btn btn-sm btn-outline-brand rounded-pill" href="{{ solution_url }}">{{ 'Go to Solution'|t }}</a>
+  {% if edit_url %}
+    <a class="btn btn-sm btn-outline-brand rounded-pill" href="{{ edit_url }}">{{ 'Edit EIF perspective'|t }}</a>
+  {% endif %}
+  <h3 class="fs-5 mt-4 mb-3">{{ 'The'|t}} {{ solution_label }} {{ 'implements the following'|t }}:</h3>
+  <div class="row">
+    {{ dump(content) }}
+    {% if content.eif_principle.0 %}
+      <div class="col-12 col-md-6 col-lg-4">
+        <h4 class="fs-6 pb-2 border-bottom">Principles</h4>
+        {{ content.eif_principle }}
+      </div>
+    {% endif %}
+    {% if content.eif_layer.0 %}
+      <div class="col-12 col-md-6 col-lg-4">
+        <h4 class="fs-6 pb-2 border-bottom">Interoperability layers</h4>
+        {{ content.eif_layer }}
+      </div>
+    {% endif %}
+    {% if content.eif_model.0 %}
+      <div class="col-12 col-md-6 col-lg-4">
+        <h4 class="fs-6 pb-2 border-bottom">Conceptual model</h4>
+        {{ content.eif_model }}
+      </div>
+    {% endif %}
+  </div>
+  {% if content.eif_recommendation.0 %}
+    <h3 class="fs-5 mt-4 mb-3">{{ solution_label }} {{ 'implements the following EIF recommendations as explained below'|t }}:</h3>
+    {{ content.eif_recommendation }}
+  {% endif %}
+</article>
diff --git a/web/themes/ventuno/templates/taxonomy-term/taxonomy-term--eif-recommendation--eif-recommendation.html.twig b/web/themes/ventuno/templates/taxonomy-term/taxonomy-term--eif-recommendation--eif-recommendation.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..f09a67376450036d2398b98c571194f8024c026d
--- /dev/null
+++ b/web/themes/ventuno/templates/taxonomy-term/taxonomy-term--eif-recommendation--eif-recommendation.html.twig
@@ -0,0 +1,18 @@
+{#
+/**
+ * @file
+ * Themeing for eif_recommendation term.
+ */
+#}
+{{ title_prefix }}
+
+<p class="mb-0">
+  <span class="text-success">
+    {{ pattern('icon', {
+      name: 'check-circle-fill',
+      path: bcl_icon_path,
+      size: 's',
+    }) }}
+  </span>
+  <strong>{{ name.0 }} | {{ content.field_eif_related_term.0 }}</strong></p>
+{{ title_suffix }}
diff --git a/web/themes/ventuno/ventuno.libraries.yml b/web/themes/ventuno/ventuno.libraries.yml
index 210d6544c362678ca189eb3ba217b5dad2ed8fe5..bfb32d09ee324d5d99677dcb8944972920b3d600 100644
--- a/web/themes/ventuno/ventuno.libraries.yml
+++ b/web/themes/ventuno/ventuno.libraries.yml
@@ -24,6 +24,7 @@ components.js:
     assets/js/oe-bcl-joinup.bundle.min.js: { minified: true }
   dependencies:
     - core/drupal
+    - ventuno/site-alerts-messages
 
 theme:
   version: VERSION
@@ -87,6 +88,11 @@ footer:
     theme:
       assets/css/footer.css: {}
 
+form-checkboxes:
+  css:
+    theme:
+      assets/css/form-checkboxes.css: {}
+
 forms:
   css:
     theme:
diff --git a/web/themes/ventuno/ventuno.theme b/web/themes/ventuno/ventuno.theme
index fb28fcacb015941047a958a1e14198eeb370a4b3..9c2b91d63d891ed0f85472f65e100208f32e1136 100644
--- a/web/themes/ventuno/ventuno.theme
+++ b/web/themes/ventuno/ventuno.theme
@@ -26,7 +26,7 @@
  * Adds a theme suggestion for the menus rendered in the footer, so they can be
  * styled in the same way.
  */
-function ventuno_theme_suggestions_menu_alter(array &$suggestions, array $variables) {
+function ventuno_theme_suggestions_menu_alter(array &$suggestions, array $variables): void {
   if (in_array($variables['menu_name'], [
     'footer',
     'support',
@@ -49,7 +49,7 @@ function ventuno_theme_suggestions_menu_alter(array &$suggestions, array $variab
  *   block for the 4 different entity bundles shown in the "Explore" block on
  *   the homepage.
  */
-function ventuno_theme_suggestions_block_alter(array &$suggestions, array $variables) {
+function ventuno_theme_suggestions_block_alter(array &$suggestions, array $variables): void {
   $elements = &$variables['elements'];
   if (
     $elements['#base_plugin_id'] === 'extra_field_block' &&
@@ -62,7 +62,7 @@ function ventuno_theme_suggestions_block_alter(array &$suggestions, array $varia
 /**
  * Implements hook_preprocess_rdf_entity().
  */
-function ventuno_preprocess_rdf_entity(&$variables) {
+function ventuno_preprocess_rdf_entity(array &$variables): void {
   // Workaround for incorrect rendering of RDF entity label.
   // @see https://www.drupal.org/project/rdf_entity/issues/3209500
   $variables['label'] = $variables['rdf_entity']->label();
@@ -71,7 +71,7 @@ function ventuno_preprocess_rdf_entity(&$variables) {
 /**
  * Implements hook_preprocess_HOOK() for html.html.twig.
  */
-function ventuno_preprocess_html(&$variables) {
+function ventuno_preprocess_html(array &$variables): void {
   // Expose the base path so we can use it to generate favicon URIs.
   $variables['base_path'] = base_path();
   // Licence comparer specific styling.
@@ -83,7 +83,7 @@ function ventuno_preprocess_html(&$variables) {
 /**
  * Implements hook_preprocess_page().
  */
-function ventuno_preprocess_page(&$variables) {
+function ventuno_preprocess_page(array &$variables): void {
   // Retrieve the Joinup version and link to display in the footer.
   // @todo Move this into a block.
   /** @var \Drupal\joinup_core\JoinupVersionInterface $joinup_version */
@@ -101,7 +101,7 @@ function ventuno_preprocess_page(&$variables) {
 /**
  * Implements template_preprocess_region().
  */
-function ventuno_preprocess_region__header(&$variables) {
+function ventuno_preprocess_region__header(array &$variables): void {
   // Export the user name to display in the header.
   $variables['user_name'] = \Drupal::currentUser()->getDisplayName();
 
@@ -129,7 +129,7 @@ function ventuno_preprocess_region__header(&$variables) {
 /**
  * Implements hook_preprocess_block().
  */
-function ventuno_preprocess_block__facetsblock_searchpage(&$variables) {
+function ventuno_preprocess_block__facetsblock_searchpage(array &$variables): void {
   $block_manager = \Drupal::getContainer()->get('plugin.manager.block');
   $plugin_block = $block_manager->createInstance('joinup_search_clear_filters');
   $clear_button = $plugin_block->build();
@@ -149,7 +149,7 @@ function ventuno_preprocess_block__facetsblock_searchpage(&$variables) {
  * by the first referenced topic. If no topics are referenced the link will be
  * hidden.
  */
-function ventuno_preprocess_block__entityqueue_block__highlighted_content(&$variables) {
+function ventuno_preprocess_block__entityqueue_block__highlighted_content(array &$variables): void {
   /** @var \Drupal\node\NodeInterface $node */
   $node = $variables['elements']['content']['entities'][0]['#node'] ?? NULL;
 
@@ -184,7 +184,7 @@ function ventuno_preprocess_block__entityqueue_block__highlighted_content(&$vari
  * Page Manager as a variable. This section is using a Layout but needs to be
  * rendered outside the main content region which is controlled by Page Manager.
  */
-function ventuno_preprocess_page__home(&$variables) {
+function ventuno_preprocess_page__home(array &$variables): void {
   /** @var \Drupal\page_manager\Entity\PageVariant $about_section_variant */
   $about_section_variant = \Drupal::entityTypeManager()->getStorage('page_variant')->load('homepage-layout_builder-1');
   $view_builder = \Drupal::entityTypeManager()->getViewBuilder('page_variant');
@@ -194,7 +194,7 @@ function ventuno_preprocess_page__home(&$variables) {
 /**
  * Implements hook_preprocess_HOOK().
  */
-function ventuno_preprocess_node__numbered_listing(&$variables) {
+function ventuno_preprocess_node__numbered_listing(array &$variables): void {
   /** @var \Drupal\node\NodeInterface $node */
   $node = $variables['node'];
 
@@ -221,7 +221,7 @@ function ventuno_preprocess_node__numbered_listing(&$variables) {
 /**
  * Implements hook_preprocess_HOOK().
  */
-function ventuno_preprocess_responsive_image_formatter(&$variables) {
+function ventuno_preprocess_responsive_image_formatter(array &$variables): void {
   if ($variables['url']) {
     $options = $variables['url']->getOptions();
     if ($options['entity'] instanceof CommunityContentInterface) {
@@ -240,7 +240,7 @@ function ventuno_preprocess_responsive_image_formatter(&$variables) {
  * Trim the labels of the items in the Explore block on the homepage down to a
  * manageable size.
  */
-function ventuno_preprocess_node__explore_item(&$variables) {
+function ventuno_preprocess_node__explore_item(array &$variables): void {
   /** @var \Drupal\node\NodeInterface $node */
   $node = $variables['node'];
 
@@ -254,7 +254,7 @@ function ventuno_preprocess_node__explore_item(&$variables) {
  * Trim the labels of the items in the Explore block on the homepage down to a
  * manageable size.
  */
-function ventuno_preprocess_rdf_entity__explore_item(&$variables) {
+function ventuno_preprocess_rdf_entity__explore_item(array &$variables): void {
   /** @var \Drupal\rdf_entity\RdfInterface $entity */
   $entity = $variables['rdf_entity'];
 
@@ -265,7 +265,7 @@ function ventuno_preprocess_rdf_entity__explore_item(&$variables) {
 /**
  * Implements template_preprocess_menu().
  */
-function ventuno_preprocess_menu(&$variables) {
+function ventuno_preprocess_menu(array &$variables): void {
   // Set a class on each link in the social media footer menu, so that the link
   // text can be replaced with an icon.
   if ($variables['menu_name'] === 'footer-social-media') {
@@ -279,7 +279,7 @@ function ventuno_preprocess_menu(&$variables) {
  * These classes identify the social media links so we can replace them with
  * icons. Used for the links to Twitter and LinkedIn.
  */
-function _ventuno_preprocess_menu_items(&$items) {
+function _ventuno_preprocess_menu_items(array &$items): void {
   foreach ($items as $item) {
     /** @var \Drupal\Core\Menu\MenuLinkDefault $menu_link */
     $menu_link ??= $item['original_link'];
@@ -321,49 +321,124 @@ function ventuno_form_facets_form_alter(array &$form, FormStateInterface $form_s
 }
 
 /**
- * Implements hook_theme_suggestions_alter().
+ * Implements hook_theme_suggestions_HOOK_alter().
+ */
+function ventuno_theme_suggestions_user_alter(array &$suggestions, array $variables): void {
+  $view_mode = $variables['elements']['#view_mode'];
+  $suggestions[] = 'user__' . str_replace('-', '_', $view_mode);
+}
+
+/**
+ * Implements hook_theme_suggestions_HOOK_alter().
+ */
+function ventuno_theme_suggestions_eif_wrapper_alter(array &$suggestions, array $variables): void {
+  _ventuno_theme_suggestions_alter($suggestions, $variables);
+}
+
+/**
+ * Implements hook_theme_suggestions_HOOK_alter().
  */
-function ventuno_theme_suggestions_alter(array &$suggestions, array $variables, $hook) {
-  // Add suggestion based on view mode for user entity.
-  if ($hook == 'user' && !empty($variables['elements']['#view_mode'])) {
-    $original_theme_hook = $variables['theme_hook_original'];
-    $view_mode = $variables['elements']['#view_mode'];
-    $suggestions[] = $original_theme_hook . '__' . str_replace('-', '_', $view_mode);
+function ventuno_theme_suggestions_taxonomy_term_alter(array &$suggestions, array $variables): void {
+  _ventuno_theme_suggestions_alter($suggestions, $variables);
+}
+
+/**
+ * Provides a helper to create suggestions per view mode.
+ *
+ * @param array $suggestions
+ *   Current suggestions, passed by reference.
+ * @param array $variables
+ *   Template variables.
+ *
+ * @see ventuno_theme_suggestions_eif_wrapper_alter()
+ * @see ventuno_theme_suggestions_taxonomy_term_alter()
+ */
+function _ventuno_theme_suggestions_alter(array &$suggestions, array $variables): void {
+  $original_theme_hook = $variables['theme_hook_original'];
+  $view_mode = $variables['elements']['#view_mode'];
+  $suggestions[] = $original_theme_hook . '__' . str_replace('-', '_', $view_mode);
+
+  $entity_type_id = $variables['elements']['#entity_type'];
+  $bundle = $variables['elements']["#{$entity_type_id}"]->bundle();
+  $suggestions[] = $original_theme_hook . '__' . str_replace('-', '_', $bundle) . '__' . str_replace('-', '_', $view_mode);
+}
+
+/**
+ * Implements hook_preprocess_HOOK().
+ */
+function ventuno_preprocess_rdf_meta_entity(array &$variables): void {
+  /** @var \Drupal\rdf_meta_entity\Entity\RdfMetaEntityInterface $rdf_meta_entity */
+  $rdf_meta_entity = $variables['rdf_meta_entity'];
+  /** @var \Drupal\solution\Entity\SolutionInterface $solution */
+  $solution = $variables['rdf_meta_entity']->getTargetEntity();
+  $variables['solution_label'] = $solution->label();
+  $variables['solution_url'] = $solution->toUrl()->setAbsolute()->toString();
+  $route_parameters = ['rdf_meta_entity' => $rdf_meta_entity->id()];
+  $url_options = [
+    'query' => [
+      'destination' => Url::fromRoute('entity.rdf_entity.eif_perspective', [
+        'rdf_entity' => $solution->id(),
+      ])->getInternalPath(),
+    ],
+  ];
+  $edit_url = Url::fromRoute('entity.rdf_meta_entity.edit_form', $route_parameters, $url_options);
+  if ($edit_url->access()) {
+    $variables['edit_url'] = $edit_url->setAbsolute()->toString();
   }
 }
 
 /**
  * Implements hook_preprocess_user().
  */
-function ventuno_preprocess_user(&$variables) {
+function ventuno_preprocess_user(array &$variables): void {
   $variables['full_name'] = $variables['user']->getDisplayName();
 }
 
 /**
  * Implements hook_preprocess_HOOK().
  */
-function ventuno_preprocess_rdf_entity__search_result_featured(&$variables) {
+function ventuno_preprocess_rdf_entity__search_result_featured(array &$variables): void {
   _ventuno_preprocess_search_result($variables, 'rdf_entity');
 }
 
 /**
  * Implements hook_preprocess_HOOK().
  */
-function ventuno_preprocess_rdf_entity__search_result(&$variables) {
+function ventuno_preprocess_rdf_entity__search_result(array &$variables): void {
   _ventuno_preprocess_search_result($variables, 'rdf_entity');
 }
 
 /**
  * Implements hook_preprocess_HOOK().
  */
-function ventuno_preprocess_node__search_result_featured(&$variables) {
+function ventuno_preprocess_rdf_entity__solution__eif_perspective(array &$variables): void {
+  /** @var \Drupal\solution\Entity\SolutionInterface $solution */
+  $solution = $variables['rdf_entity'];
+  if (empty($solution)) {
+    return;
+  }
+
+  $rdf_meta_entity = $solution->eif_perspective->entity;
+  if (empty($rdf_meta_entity)) {
+    return;
+  }
+
+  $eif_description = \Drupal::entityTypeManager()->getViewBuilder('rdf_meta_entity')->viewField($rdf_meta_entity->get('field_eif_description'), 'eif_perspective');
+  $eif_description[0]['#text'] = strip_tags($eif_description[0]['#text']);
+  $variables['content']['eif_perspective_fields']['field_eif_description'] = $eif_description;
+}
+
+/**
+ * Implements hook_preprocess_HOOK().
+ */
+function ventuno_preprocess_node__search_result_featured(array &$variables): void {
   _ventuno_preprocess_search_result($variables, 'node');
 }
 
 /**
  * Implements hook_preprocess_HOOK().
  */
-function ventuno_preprocess_node__search_result(&$variables) {
+function ventuno_preprocess_node__search_result(array &$variables): void {
   _ventuno_preprocess_search_result($variables, 'node');
 }
 
@@ -454,7 +529,7 @@ function _ventuno_get_default_icon_render_array(string $entity_type_id, string $
 /**
  * Implements hook_preprocess().
  */
-function ventuno_preprocess(&$variables) {
+function ventuno_preprocess(array &$variables): void {
   /** @var \Drupal\Core\Extension\ThemeHandler $themeHandler */
   $themeHandler = \Drupal::service('theme_handler');
   $ventuno = $themeHandler->getTheme('ventuno')->getPath();
@@ -473,7 +548,7 @@ function ventuno_theme_suggestions_form_element_alter(array &$suggestions, array
 /**
  * Implements hook_form_alter().
  */
-function ventuno_form_alter(&$form, FormStateInterface $form_state, $form_id): void {
+function ventuno_form_alter(array &$form, FormStateInterface $form_state, string $form_id): void {
   // Check if the form contains exposed filter form element.
   if ($form_id === 'views_exposed_form') {
     $route_name = \Drupal::routeMatch()->getRouteName();
@@ -510,7 +585,7 @@ function ventuno_form_alter(&$form, FormStateInterface $form_state, $form_id): v
  * We use the 16:9 ratio as a premise: ratios are not fixed, we allow users to
  * upload images without restrictions. It's not possible to match them exaclty.
  */
-function ventuno_preprocess_responsive_image(&$variables) {
+function ventuno_preprocess_responsive_image(array &$variables): void {
   $style_id = $variables['responsive_image_style_id'];
   switch ($style_id) {
     // 'In the spotlight' section on homepage
@@ -536,7 +611,7 @@ function ventuno_preprocess_responsive_image(&$variables) {
 /**
  * Implements hook_preprocess_image().
  */
-function ventuno_preprocess_image(&$variables) {
+function ventuno_preprocess_image(array &$variables): void {
   $variables['attributes']['loading'] = 'lazy';
 }
 
@@ -552,6 +627,20 @@ function ventuno_theme_suggestions_field_alter(array &$suggestions, array $varia
   }
 }
 
+/**
+ * Implements hook_preprocess_container__text_format_filter_help().
+ */
+function ventuno_preprocess_container__text_format_filter_help(array &$variables): void {
+  $variables['attributes']['class'] = ['text-end', 'fs-sm'];
+}
+
+/**
+ * Implements hook_preprocess_form_element_label().
+ */
+function ventuno_preprocess_form_element_label(array &$variables): void {
+  $variables['#attached']['library'][] = 'ventuno/form-checkboxes';
+}
+
 /**
  * Implements hook_theme_suggestions_HOOK_alter() for container.html.twig.
  */