diff --git a/SciPost_v1/settings.py b/SciPost_v1/settings.py
index 93080c61d9e7012a312a59d231d697b70c22c400..9c9c14867438a7d096c4c664dcf8975f8434dd0d 100644
--- a/SciPost_v1/settings.py
+++ b/SciPost_v1/settings.py
@@ -107,7 +107,11 @@ SHELL_PLUS_POST_IMPORTS = (
     ('theses.factories', ('ThesisLinkFactory')),
     ('comments.factories', ('CommentFactory')),
     ('submissions.factories', ('SubmissionFactory', 'EICassignedSubmissionFactory')),
-    ('commentaries.factories', ('EmptyCommentaryFactory', 'VettedCommentaryFactory', 'UnvettedCommentaryFactory')),
+    ('commentaries.factories',
+        ('EmptyCommentaryFactory',
+        'VettedCommentaryFactory',
+        'UnvettedCommentaryFactory',
+        'UnpublishedVettedCommentaryFactory',)),
 )
 
 MATHJAX_ENABLED = True
diff --git a/commentaries/factories.py b/commentaries/factories.py
index 82319e0cd3c3aa39d06b7c1c2338b4d45b6ee67c..31f1354fa2c7c811daccdbfa7bd9a27cdf55850f 100644
--- a/commentaries/factories.py
+++ b/commentaries/factories.py
@@ -1,11 +1,11 @@
 import factory
 
-from .models import Commentary, COMMENTARY_TYPES
-
 from scipost.constants import DISCIPLINE_PHYSICS, SCIPOST_SUBJECT_AREAS
 from scipost.factories import ContributorFactory
 from journals.models import SCIPOST_JOURNALS_DOMAINS
+from common.helpers import random_arxiv_identifier_with_version_number
 
+from .models import Commentary, COMMENTARY_TYPES
 
 class CommentaryFactory(factory.django.DjangoModelFactory):
     class Meta:
@@ -18,12 +18,16 @@ class CommentaryFactory(factory.django.DjangoModelFactory):
     discipline = DISCIPLINE_PHYSICS
     domain = SCIPOST_JOURNALS_DOMAINS[0][0]
     subject_area = SCIPOST_SUBJECT_AREAS[0][1][0][0]
-    pub_title = factory.Sequence(lambda n: "Commentary %d" % n)
+    pub_title = factory.Faker('bs')
     pub_DOI = '10.1103/PhysRevB.92.214427'
-    arxiv_identifier = '1610.06911v1'
+    arxiv_identifier = factory.Sequence(lambda n: random_arxiv_identifier_with_version_number())
     author_list = factory.Faker('name')
     pub_abstract = factory.Faker('text')
 
+    @factory.post_generation
+    def create_urls(self, create, extracted, **kwargs):
+        self.parse_links_into_urls(commit=create)
+
 
 class EmptyCommentaryFactory(CommentaryFactory):
     pub_DOI = None
@@ -34,5 +38,9 @@ class VettedCommentaryFactory(CommentaryFactory):
     vetted = True
 
 
+class UnpublishedVettedCommentaryFactory(VettedCommentaryFactory):
+    pub_DOI = ''
+
+
 class UnvettedCommentaryFactory(CommentaryFactory):
     vetted = False
diff --git a/common/helpers/__init__.py b/common/helpers/__init__.py
index d91d1905c12f9529071e5406d04f90cd16891b0f..d1875920b99074217a6ce3d80fa10128bd4e568a 100644
--- a/common/helpers/__init__.py
+++ b/common/helpers/__init__.py
@@ -1,3 +1,6 @@
+import random
+import string
+
 def model_form_data(model, form_class, form_kwargs={}):
     '''
     Returns a dict that can be used to instantiate a form object.
@@ -25,6 +28,14 @@ def model_form_data(model, form_class, form_kwargs={}):
     form_fields = list(form_class(**form_kwargs).fields.keys())
     return filter_keys(model_data, form_fields)
 
+def random_arxiv_identifier_with_version_number():
+    return random_arxiv_identifier_without_version_number() + "v0"
+
+def random_arxiv_identifier_without_version_number():
+    return random_digits(4) + "." + random_digits(5)
+
+def random_digits(n):
+    return "".join(random.choice(string.digits) for _ in range(n))
 
 def filter_keys(dictionary, keys_to_keep):
     # Field is empty if not on model.
diff --git a/submissions/factories.py b/submissions/factories.py
index ade2eba39812e9f88f26b2ebcf660bae3c6d0546..1abdf6974e4c7caa28ae6ebcb49a9eb1096df83a 100644
--- a/submissions/factories.py
+++ b/submissions/factories.py
@@ -1,8 +1,7 @@
 import factory
-import random
-import string
 
 from scipost.factories import ContributorFactory
+from common.helpers import random_arxiv_identifier_with_version_number
 
 from .models import Submission
 
@@ -18,7 +17,6 @@ class SubmissionFactory(factory.django.DjangoModelFactory):
     abstract = factory.Faker('text')
     arxiv_link = factory.Faker('uri')
     arxiv_identifier_w_vn_nr = factory.Sequence(lambda n: random_arxiv_identifier_with_version_number())
-    arxiv_identifier_wo_vn_nr = factory.LazyAttribute(lambda obj: obj.arxiv_identifier_w_vn_nr[0:-2])
     domain = 'E'
 
 
@@ -26,13 +24,3 @@ class EICassignedSubmissionFactory(SubmissionFactory):
     status = 'EICassigned'
     editor_in_charge = factory.SubFactory(ContributorFactory)
     open_for_commenting = True
-
-
-def random_arxiv_identifier_with_version_number():
-    return random_arxiv_identifier_without_version_number() + "v0"
-
-def random_arxiv_identifier_without_version_number():
-    return random_digits(4) + "." + random_digits(5)
-
-def random_digits(n):
-    return "".join(random.choice(string.digits) for _ in range(n))