diff --git a/journals/models.py b/journals/models.py
index c0747db2a26d169784dd4afc747bec195f08b618..3d4077434d3b50ccbe061b5799ce9bd6bb355419 100644
--- a/journals/models.py
+++ b/journals/models.py
@@ -4,6 +4,8 @@ from django.template import Template, Context
 from django.utils import timezone
 from django.urls import reverse
 
+from .behaviors import doi_journal_validator, doi_volume_validator,\
+                       doi_issue_validator, doi_publication_validator
 from .constants import SCIPOST_JOURNALS, SCIPOST_JOURNALS_DOMAINS,\
                        STATUS_DRAFT, STATUS_PUBLISHED, ISSUE_STATUSES
 from .helpers import paper_nr_string, journal_name_abbrev_citation
@@ -24,7 +26,8 @@ class UnregisteredAuthor(models.Model):
 
 class Journal(models.Model):
     name = models.CharField(max_length=100, choices=SCIPOST_JOURNALS, unique=True)
-    doi_string = models.CharField(max_length=200, blank=True, unique=True)
+    doi_string = models.CharField(max_length=200, unique=True, db_index=True,
+                                  validators=[doi_journal_validator])
     issn = models.CharField(max_length=16, default='2542-4653')
     active = models.BooleanField(default=True)
 
@@ -43,7 +46,8 @@ class Volume(models.Model):
     number = models.PositiveSmallIntegerField()
     start_date = models.DateField(default=timezone.now)
     until_date = models.DateField(default=timezone.now)
-    doi_string = models.CharField(max_length=200, blank=True, unique=True)
+    doi_string = models.CharField(max_length=200, unique=True, db_index=True,
+                                  validators=[doi_volume_validator])
 
     class Meta:
         unique_together = ('number', 'in_journal')
@@ -58,7 +62,8 @@ class Issue(models.Model):
     start_date = models.DateField(default=timezone.now)
     until_date = models.DateField(default=timezone.now)
     status = models.CharField(max_length=20, choices=ISSUE_STATUSES, default=STATUS_PUBLISHED)
-    doi_string = models.CharField(max_length=200, blank=True, unique=True)
+    doi_string = models.CharField(max_length=200, unique=True, db_index=True,
+                                  validators=[doi_issue_validator])
     # absolute path on filesystem: (JOURNALS_DIR)/journal/vol/issue/
     path = models.CharField(max_length=200)
 
@@ -122,7 +127,8 @@ class Publication(models.Model):
     metadata = JSONField(default={}, blank=True, null=True)
     metadata_xml = models.TextField(blank=True, null=True)  # for Crossref deposit
     BiBTeX_entry = models.TextField(blank=True, null=True)
-    doi_string = models.CharField(max_length=200, blank=True, unique=True)  # Used for file name
+    doi_string = models.CharField(max_length=200, unique=True, db_index=True,
+                                  validators=[doi_publication_validator])
     submission_date = models.DateField(verbose_name='submission date')
     acceptance_date = models.DateField(verbose_name='acceptance date')
     publication_date = models.DateField(verbose_name='publication date')