diff --git a/config/schema/views_daterange_cte.schema.yml b/config/schema/views_daterange_cte.schema.yml
new file mode 100644
index 0000000000000000000000000000000000000000..6ea4d670eb501b6466b7c2d08e63150a9459f213
--- /dev/null
+++ b/config/schema/views_daterange_cte.schema.yml
@@ -0,0 +1,14 @@
+views_daterange_cte.daterange_date.*:
+  type: config_entity
+  label: Daterange date
+  mapping:
+    id:
+      type: string
+      label: ID
+    label:
+      type: label
+      label: Label
+    uuid:
+      type: string
+    description:
+      type: string
diff --git a/src/DaterangeDateInterface.php b/src/DaterangeDateInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..6e1651d963a6cd06142b23beb25880f13d62630e
--- /dev/null
+++ b/src/DaterangeDateInterface.php
@@ -0,0 +1,14 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Drupal\views_daterange_cte;
+
+use Drupal\Core\Config\Entity\ConfigEntityInterface;
+
+/**
+ * Provides an interface defining a daterange date entity type.
+ */
+interface DaterangeDateInterface extends ConfigEntityInterface {
+
+}
diff --git a/src/DaterangeDateListBuilder.php b/src/DaterangeDateListBuilder.php
new file mode 100644
index 0000000000000000000000000000000000000000..8149d0d56b828a171d2291f5bf0cab1da0c6e511
--- /dev/null
+++ b/src/DaterangeDateListBuilder.php
@@ -0,0 +1,36 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Drupal\views_daterange_cte;
+
+use Drupal\Core\Config\Entity\ConfigEntityListBuilder;
+use Drupal\Core\Entity\EntityInterface;
+
+/**
+ * Provides a listing of daterange dates.
+ */
+final class DaterangeDateListBuilder extends ConfigEntityListBuilder {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildHeader(): array {
+    $header['label'] = $this->t('Label');
+    $header['id'] = $this->t('Machine name');
+    $header['status'] = $this->t('Status');
+    return $header + parent::buildHeader();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildRow(EntityInterface $entity): array {
+    /** @var \Drupal\views_daterange_cte\DaterangeDateInterface $entity */
+    $row['label'] = $entity->label();
+    $row['id'] = $entity->id();
+    $row['status'] = $entity->status() ? $this->t('Enabled') : $this->t('Disabled');
+    return $row + parent::buildRow($entity);
+  }
+
+}
diff --git a/src/Entity/DaterangeDate.php b/src/Entity/DaterangeDate.php
new file mode 100644
index 0000000000000000000000000000000000000000..c55e1dee974011fa7756edf53d6db956450852f2
--- /dev/null
+++ b/src/Entity/DaterangeDate.php
@@ -0,0 +1,68 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Drupal\views_daterange_cte\Entity;
+
+use Drupal\Core\Config\Entity\ConfigEntityBase;
+use Drupal\views_daterange_cte\DaterangeDateInterface;
+
+/**
+ * Defines the daterange date entity type.
+ *
+ * @ConfigEntityType(
+ *   id = "daterange_date",
+ *   label = @Translation("Daterange date"),
+ *   label_collection = @Translation("Daterange dates"),
+ *   label_singular = @Translation("daterange date"),
+ *   label_plural = @Translation("daterange dates"),
+ *   label_count = @PluralTranslation(
+ *     singular = "@count daterange date",
+ *     plural = "@count daterange dates",
+ *   ),
+ *   handlers = {
+ *     "list_builder" = "Drupal\views_daterange_cte\DaterangeDateListBuilder",
+ *     "form" = {
+ *       "add" = "Drupal\views_daterange_cte\Form\DaterangeDateForm",
+ *       "edit" = "Drupal\views_daterange_cte\Form\DaterangeDateForm",
+ *       "delete" = "Drupal\Core\Entity\EntityDeleteForm",
+ *     },
+ *   },
+ *   config_prefix = "daterange_date",
+ *   admin_permission = "administer daterange_date",
+ *   links = {
+ *     "collection" = "/admin/structure/daterange-date",
+ *     "add-form" = "/admin/structure/daterange-date/add",
+ *     "edit-form" = "/admin/structure/daterange-date/{daterange_date}",
+ *     "delete-form" = "/admin/structure/daterange-date/{daterange_date}/delete",
+ *   },
+ *   entity_keys = {
+ *     "id" = "id",
+ *     "label" = "label",
+ *     "uuid" = "uuid",
+ *   },
+ *   config_export = {
+ *     "id",
+ *     "label",
+ *     "description",
+ *   },
+ * )
+ */
+final class DaterangeDate extends ConfigEntityBase implements DaterangeDateInterface {
+
+  /**
+   * The example ID.
+   */
+  protected string $id;
+
+  /**
+   * The example label.
+   */
+  protected string $label;
+
+  /**
+   * The example description.
+   */
+  protected string $description;
+
+}
diff --git a/src/Form/DaterangeDateForm.php b/src/Form/DaterangeDateForm.php
new file mode 100644
index 0000000000000000000000000000000000000000..de77f13aaf65f0a8007bef15413df74523e1c17f
--- /dev/null
+++ b/src/Form/DaterangeDateForm.php
@@ -0,0 +1,71 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Drupal\views_daterange_cte\Form;
+
+use Drupal\Core\Entity\EntityForm;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\views_daterange_cte\Entity\DaterangeDate;
+
+/**
+ * Daterange date form.
+ */
+final class DaterangeDateForm extends EntityForm {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function form(array $form, FormStateInterface $form_state): array {
+
+    $form = parent::form($form, $form_state);
+
+    $form['label'] = [
+      '#type' => 'textfield',
+      '#title' => $this->t('Label'),
+      '#maxlength' => 255,
+      '#default_value' => $this->entity->label(),
+      '#required' => TRUE,
+    ];
+
+    $form['id'] = [
+      '#type' => 'machine_name',
+      '#default_value' => $this->entity->id(),
+      '#machine_name' => [
+        'exists' => [DaterangeDate::class, 'load'],
+      ],
+      '#disabled' => !$this->entity->isNew(),
+    ];
+
+    $form['status'] = [
+      '#type' => 'checkbox',
+      '#title' => $this->t('Enabled'),
+      '#default_value' => $this->entity->status(),
+    ];
+
+    $form['description'] = [
+      '#type' => 'textarea',
+      '#title' => $this->t('Description'),
+      '#default_value' => $this->entity->get('description'),
+    ];
+
+    return $form;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function save(array $form, FormStateInterface $form_state): int {
+    $result = parent::save($form, $form_state);
+    $message_args = ['%label' => $this->entity->label()];
+    $this->messenger()->addStatus(
+      match($result) {
+        \SAVED_NEW => $this->t('Created new example %label.', $message_args),
+        \SAVED_UPDATED => $this->t('Updated example %label.', $message_args),
+      }
+    );
+    $form_state->setRedirectUrl($this->entity->toUrl('collection'));
+    return $result;
+  }
+
+}
diff --git a/views_daterange_cte.links.action.yml b/views_daterange_cte.links.action.yml
new file mode 100644
index 0000000000000000000000000000000000000000..631fe23b3dbc798225e1220d44c435e2cf72393d
--- /dev/null
+++ b/views_daterange_cte.links.action.yml
@@ -0,0 +1,5 @@
+entity.daterange_date.add_form:
+  route_name: 'entity.daterange_date.add_form'
+  title: 'Add daterange date'
+  appears_on:
+    - entity.daterange_date.collection
diff --git a/views_daterange_cte.links.menu.yml b/views_daterange_cte.links.menu.yml
new file mode 100644
index 0000000000000000000000000000000000000000..5a9221bc52cf9370ecdfe91975b083f2f686c1d5
--- /dev/null
+++ b/views_daterange_cte.links.menu.yml
@@ -0,0 +1,5 @@
+entity.daterange_date.overview:
+  title: Daterange dates
+  parent: system.admin_structure
+  description: 'List of daterange dates to extend site functionality.'
+  route_name: entity.daterange_date.collection
diff --git a/views_daterange_cte.module b/views_daterange_cte.module
index ba9b3f69f1da1a534ef795c55e6a60bc40d51075..14fdcd4c7be92c47c5b39c498568fa919b3dfd8e 100644
--- a/views_daterange_cte.module
+++ b/views_daterange_cte.module
@@ -31,6 +31,7 @@ function views_daterange_cte_help($route_name, RouteMatchInterface $route_match)
 function views_daterange_cte_views_data() {
   $data = [];
   $data['cte_daterange']['table']['name'] = 'cte_daterange';
+  $data['cte_daterange']['table']['entity type'] = 'daterange_date';
   $data['cte_daterange']['table']['group'] = t('Daterange');
   $data['cte_daterange']['table']['base'] = [
     'title' => t('Daterange'),
diff --git a/views_daterange_cte.permissions.yml b/views_daterange_cte.permissions.yml
new file mode 100644
index 0000000000000000000000000000000000000000..c38a76adf94abe9513b71c609c48383c5a41adbf
--- /dev/null
+++ b/views_daterange_cte.permissions.yml
@@ -0,0 +1,2 @@
+administer daterange_date:
+  title: 'Administer daterange date'
diff --git a/views_daterange_cte.routing.yml b/views_daterange_cte.routing.yml
new file mode 100644
index 0000000000000000000000000000000000000000..8890c4f3fe8d6547676d24ff492c333e068ff34a
--- /dev/null
+++ b/views_daterange_cte.routing.yml
@@ -0,0 +1,31 @@
+entity.daterange_date.collection:
+  path: '/admin/structure/daterange-date'
+  defaults:
+    _entity_list: 'daterange_date'
+    _title: 'Daterange date configuration'
+  requirements:
+    _permission: 'administer daterange_date'
+
+entity.daterange_date.add_form:
+  path: '/admin/structure/daterange_date/add'
+  defaults:
+    _entity_form: 'daterange_date.add'
+    _title: 'Add a daterange date'
+  requirements:
+    _permission: 'administer daterange_date'
+
+entity.daterange_date.edit_form:
+  path: '/admin/structure/daterange-date/{daterange_date}'
+  defaults:
+    _entity_form: 'daterange_date.edit'
+    _title: 'Edit a daterange date'
+  requirements:
+    _permission: 'administer daterange_date'
+
+entity.daterange_date.delete_form:
+  path: '/admin/structure/daterange-date/{daterange_date}/delete'
+  defaults:
+    _entity_form: 'daterange_date.delete'
+    _title: 'Delete a daterange date'
+  requirements:
+    _permission: 'administer daterange_date'