diff --git a/app/static/js/CorpusAnalysis/CorpusAnalysisStaticVisualization.js b/app/static/js/CorpusAnalysis/CorpusAnalysisStaticVisualization.js
index bdebb152d4fa17b06d0864d139b612ef0dcc5029..38c48c3c1bf3d1f5f488f5f8973bca320765c450 100644
--- a/app/static/js/CorpusAnalysis/CorpusAnalysisStaticVisualization.js
+++ b/app/static/js/CorpusAnalysis/CorpusAnalysisStaticVisualization.js
@@ -75,7 +75,7 @@ class CorpusAnalysisStaticVisualization {
 
   getStopwords() {
     this.data.promises.getStopwords = new Promise((resolve, reject) => {
-      Requestscorpora.entity.getStopwords()
+      Requests.corpora.entity.getStopwords()
         .then((response) => {
           response.json()
             .then((json) => {
diff --git a/app/static/js/ResourceLists/AdminUserList.js b/app/static/js/ResourceLists/AdminUserList.js
index 3bbd73caa0aaa54750bc49b8dc747b80591d8389..0b8f0c16fb88c2b80e598a8f8c6fcd92ff3a66ef 100644
--- a/app/static/js/ResourceLists/AdminUserList.js
+++ b/app/static/js/ResourceLists/AdminUserList.js
@@ -91,7 +91,7 @@ class AdminUserList extends ResourceList {
     let listAction = listActionElement === null ? 'view' : listActionElement.dataset.listAction;
     switch (listAction) {
       case 'delete': {
-        Requestsusers.entity.delete(itemId);
+        Requests.users.entity.delete(itemId);
         if (itemId === currentUserId) {window.location.href = '/';}
         break;
       }
diff --git a/app/static/js/ResourceLists/CorpusFileList.js b/app/static/js/ResourceLists/CorpusFileList.js
index af718a4d7aa6179f1461375b9463ec2489938d27..9997b061db4c1e855714f9cc38e8db985eb9efe6 100644
--- a/app/static/js/ResourceLists/CorpusFileList.js
+++ b/app/static/js/ResourceLists/CorpusFileList.js
@@ -153,12 +153,12 @@ class CorpusFileList extends ResourceList {
         let confirmElement = modalElement.querySelector('.action-button[data-action="confirm"]');
         confirmElement.addEventListener('click', (event) => {
           if (currentUserId != this.userId) {
-            Requestscorpora.entity.files.ent.delete(this.corpusId, itemId)
+            Requests.corpora.entity.files.ent.delete(this.corpusId, itemId)
             .then(() => {
               window.location.reload();
             });
           } else {
-            Requestscorpora.entity.files.ent.delete(this.corpusId, itemId)
+            Requests.corpora.entity.files.ent.delete(this.corpusId, itemId)
           }
         });
         modal.open();
@@ -250,12 +250,12 @@ class CorpusFileList extends ResourceList {
         confirmElement.addEventListener('click', (event) => {
           this.selectedItemIds.forEach(selectedItemId => {
             if (currentUserId != this.userId) {
-              Requestscorpora.entity.files.ent.delete(this.corpusId, selectedItemId)
+              Requests.corpora.entity.files.ent.delete(this.corpusId, selectedItemId)
               .then(() => {
                 window.location.reload();
               });
             } else {
-              Requestscorpora.entity.files.ent.delete(this.corpusId, selectedItemId);
+              Requests.corpora.entity.files.ent.delete(this.corpusId, selectedItemId);
             }
           });
           this.selectedItemIds.clear();
diff --git a/app/static/js/ResourceLists/CorpusFollowerList.js b/app/static/js/ResourceLists/CorpusFollowerList.js
index d4950a06ffb10638e1c8e8e0f3ca053717eab96c..ca70a6c76786c7d2850cd4d04663a87881fa3b8e 100644
--- a/app/static/js/ResourceLists/CorpusFollowerList.js
+++ b/app/static/js/ResourceLists/CorpusFollowerList.js
@@ -124,7 +124,7 @@ class CorpusFollowerList extends ResourceList {
       case 'update-role': {
         let followerId = listItemElement.dataset.followerId;
         let roleName = event.target.value;
-        Requestscorpora.entity.followers.entity.role.update(this.corpusId, followerId, roleName);
+        Requests.corpora.entity.followers.entity.role.update(this.corpusId, followerId, roleName);
         break;
       }
       default: {
@@ -144,12 +144,12 @@ class CorpusFollowerList extends ResourceList {
       case 'unfollow-request': {
         let followerId = listItemElement.dataset.followerId;
         if (currentUserId != this.userId) {
-          Requestscorpora.entity.followers.entity.delete(this.corpusId, followerId)
+          Requests.corpora.entity.followers.entity.delete(this.corpusId, followerId)
             .then(() => {
               window.location.reload();
             });
         } else {
-          Requestscorpora.entity.followers.entity.delete(this.corpusId, followerId);
+          Requests.corpora.entity.followers.entity.delete(this.corpusId, followerId);
         }
         break;
       }
diff --git a/app/static/js/ResourceLists/CorpusList.js b/app/static/js/ResourceLists/CorpusList.js
index 0906eaacf5aaa53f67bc46e77470eeaf1aacb7ec..985ff1d1cf55765de7d688e756d711efac52c0f8 100644
--- a/app/static/js/ResourceLists/CorpusList.js
+++ b/app/static/js/ResourceLists/CorpusList.js
@@ -171,12 +171,12 @@ class CorpusList extends ResourceList {
         let confirmElement = modalElement.querySelector('.action-button[data-action="confirm"]');
         confirmElement.addEventListener('click', (event) => {
           if (!values['is-owner']) {
-            Requestscorpora.entity.followers.entity.delete(itemId, currentUserId)
+            Requests.corpora.entity.followers.entity.delete(itemId, currentUserId)
               .then((response) => {
                 window.location.reload();
               });
           } else {
-            Requestscorpora.entity.delete(itemId);
+            Requests.corpora.entity.delete(itemId);
           }
         });
         modal.open();
@@ -272,9 +272,9 @@ class CorpusList extends ResourceList {
             let listItem = this.listjs.get('id', selectedItemId)[0].elm;
             let values = this.listjs.get('id', listItem.dataset.id)[0].values();
             if (values['is-owner']) {
-              Requestscorpora.entity.delete(selectedItemId);
+              Requests.corpora.entity.delete(selectedItemId);
             } else {
-              Requestscorpora.entity.followers.entity.delete(selectedItemId, currentUserId);
+              Requests.corpora.entity.followers.entity.delete(selectedItemId, currentUserId);
               setTimeout(() => {
                 window.location.reload();
               }, 1000);
diff --git a/app/static/js/ResourceLists/JobList.js b/app/static/js/ResourceLists/JobList.js
index eb9d7b7aee969de77b9ccf80e06400c9e777b00a..1cb3ea600df675b2e785d1fd86be347c257c78c4 100644
--- a/app/static/js/ResourceLists/JobList.js
+++ b/app/static/js/ResourceLists/JobList.js
@@ -143,7 +143,7 @@ class JobList extends ResourceList {
         );
         let confirmElement = modalElement.querySelector('.action-button[data-action="confirm"]');
         confirmElement.addEventListener('click', (event) => {
-          Requestsjobs.entity.delete(itemId);
+          Requests.jobs.entity.delete(itemId);
         });
         modal.open();
         break;
@@ -228,7 +228,7 @@ class JobList extends ResourceList {
         let confirmElement = modalElement.querySelector('.action-button[data-action="confirm"]');
         confirmElement.addEventListener('click', (event) => {
           this.selectedItemIds.forEach(selectedItemId => {
-            Requestsjobs.entity.delete(selectedItemId);
+            Requests.jobs.entity.delete(selectedItemId);
           });
           this.selectedItemIds.clear();
           this.renderingItemSelection();
diff --git a/app/static/js/ResourceLists/SpacyNLPPipelineModelList.js b/app/static/js/ResourceLists/SpacyNLPPipelineModelList.js
index 4cb58e2f2c4a15bcda398a1119305a3b607257e1..46d3739d940614cec029383884bed9c79b2b05be 100644
--- a/app/static/js/ResourceLists/SpacyNLPPipelineModelList.js
+++ b/app/static/js/ResourceLists/SpacyNLPPipelineModelList.js
@@ -120,7 +120,7 @@ class SpaCyNLPPipelineModelList extends ResourceList {
     switch (listAction) {
       case 'toggle-is-public': {
         let newIsPublicValue = listActionElement.checked;
-        Requestscontributions.spacy_nlp_pipeline_models.entity.isPublic.update(itemId, newIsPublicValue)
+        Requests.contributions.spacy_nlp_pipeline_models.entity.isPublic.update(itemId, newIsPublicValue)
           .catch((response) => {
             listActionElement.checked = !newIsPublicValue;
           });
@@ -169,7 +169,7 @@ class SpaCyNLPPipelineModelList extends ResourceList {
         );
         let confirmElement = modalElement.querySelector('.action-button[data-action="confirm"]');
         confirmElement.addEventListener('click', (event) => {
-          Requestscontributions.spacy_nlp_pipeline_models.entity.delete(itemId);
+          Requests.contributions.spacy_nlp_pipeline_models.entity.delete(itemId);
         });
         modal.open();
         break;
diff --git a/app/static/js/ResourceLists/TesseractOCRPipelineModelList.js b/app/static/js/ResourceLists/TesseractOCRPipelineModelList.js
index 83156320b8e681bd11d15596b1f3a4342d7861c3..765f44a6046ef6bccbc55509bb41908a934bda48 100644
--- a/app/static/js/ResourceLists/TesseractOCRPipelineModelList.js
+++ b/app/static/js/ResourceLists/TesseractOCRPipelineModelList.js
@@ -129,7 +129,7 @@ class TesseractOCRPipelineModelList extends ResourceList {
     switch (listAction) {
       case 'toggle-is-public': {
         let newIsPublicValue = listActionElement.checked;
-        Requestscontributions.tesseract_ocr_pipeline_models.entity.isPublic.update(itemId, newIsPublicValue)
+        Requests.contributions.tesseract_ocr_pipeline_models.entity.isPublic.update(itemId, newIsPublicValue)
           .catch((response) => {
             listActionElement.checked = !newIsPublicValue;
           });
@@ -178,7 +178,7 @@ class TesseractOCRPipelineModelList extends ResourceList {
         );
         let confirmElement = modalElement.querySelector('.action-button[data-action="confirm"]');
         confirmElement.addEventListener('click', (event) => {
-          Requestscontributions.tesseract_ocr_pipeline_models.entity.delete(itemId);
+          Requests.contributions.tesseract_ocr_pipeline_models.entity.delete(itemId);
         });
         modal.open();
         break;
diff --git a/app/static/js/forms/create-contribution-form.js b/app/static/js/forms/create-contribution-form.js
index 6800379654bce73da003ce5c30d5068815607caa..4474ff893bd1d02a5c94343c53219f3389734c38 100644
--- a/app/static/js/forms/create-contribution-form.js
+++ b/app/static/js/forms/create-contribution-form.js
@@ -1,10 +1,5 @@
 Forms.CreateContributionForm = class CreateContributionForm extends Forms.BaseForm {
-  static autoInit() {
-    let createContributionFormElements = document.querySelectorAll('.create-contribution-form');
-    for (let createContributionFormElement of createContributionFormElements) {
-      new Forms.CreateContributionForm(createContributionFormElement);
-    }
-  }
+  static htmlClass = 'create-contribution-form';
 
   constructor(formElement) {
     super(formElement);
diff --git a/app/static/js/forms/create-corpus-file-form.js b/app/static/js/forms/create-corpus-file-form.js
index 6cbc8a3a08e8cc63ba742826231731a11724856d..beec4ee2276960da81b98628db1ecdb544c98ac5 100644
--- a/app/static/js/forms/create-corpus-file-form.js
+++ b/app/static/js/forms/create-corpus-file-form.js
@@ -1,10 +1,5 @@
 Forms.CreateCorpusFileForm = class CreateCorpusFileForm extends Forms.BaseForm {
-  static autoInit() {
-    let createCorpusFileFormElements = document.querySelectorAll('.create-corpus-file-form');
-    for (let createCorpusFileFormElement of createCorpusFileFormElements) {
-      new Forms.CreateCorpusFileForm(createCorpusFileFormElement);
-    }
-  }
+  static htmlClass = 'create-corpus-file-form';
 
   constructor(formElement) {
     super(formElement);
diff --git a/app/static/js/forms/create-job-form.js b/app/static/js/forms/create-job-form.js
index 0ee64e3aff866a46f8379a7bfca599bbe6d39967..6e6c7c0116f5844979b08668e4344dda6a5b5503 100644
--- a/app/static/js/forms/create-job-form.js
+++ b/app/static/js/forms/create-job-form.js
@@ -1,10 +1,5 @@
 Forms.CreateJobForm = class CreateJobForm extends Forms.BaseForm {
-  static autoInit() {
-    let createJobFormElements = document.querySelectorAll('.create-job-form');
-    for (let createJobFormElement of createJobFormElements) {
-      new Forms.CreateJobForm(createJobFormElement);
-    }
-  }
+  static htmlClass = 'create-job-form';
 
   constructor(formElement) {
     super(formElement);
diff --git a/app/static/js/forms/index.js b/app/static/js/forms/index.js
index b3bd9224304590b2f95460f85aa9e03827fbda59..0e7529f69636dce5a8b9a321725a95fde77d52c4 100644
--- a/app/static/js/forms/index.js
+++ b/app/static/js/forms/index.js
@@ -3,15 +3,22 @@ var Forms = {};
 Forms.autoInit = () => {
   for (let propertyName in Forms) {
     let property = Forms[propertyName];
-    // Call the autoInit method of all properties that are subclasses of Forms.BaseForm
+    // Call autoInit of all properties that are subclasses of Forms.BaseForm.
+    // This does not include Forms.BaseForm itself.
     if (property.prototype instanceof Forms.BaseForm) {
-      property.autoInit();
+      // Check if the static htmlClass property is defined.
+      if (property.htmlClass === undefined) {return;}
+      // Gather all HTML elements that have the `this.htmlClass` class
+      // and do not have the no-autoinit class.
+      let formElements = document.querySelectorAll(`.${property.htmlClass}:not(.no-autoinit)`);
+      // Create an instance of this class for each form element.
+      for (let formElement of formElements) {new property(formElement);}
     }
   }
 };
 
 Forms.BaseForm = class BaseForm {
-  static autoInit() {throw 'Not implemented';}
+  static htmlClass;
 
   constructor(formElement) {
     this.formElement = formElement;
diff --git a/app/static/js/resource-displays/corpus-display.js b/app/static/js/resource-displays/corpus-display.js
index 52b08fbf12093f9ba71379d7b51e297d14f2c65a..906b17ac78a8fded44755d8fa758efd4bdd64538 100644
--- a/app/static/js/resource-displays/corpus-display.js
+++ b/app/static/js/resource-displays/corpus-display.js
@@ -1,11 +1,13 @@
 ResourceDisplays.CorpusDisplay = class CorpusDisplay extends ResourceDisplays.BaseDisplay {
+  static htmlClass = 'corpus-display';
+
   constructor(displayElement) {
     super(displayElement);
     this.corpusId = displayElement.dataset.corpusId;
     this.displayElement
       .querySelector('.action-button[data-action="build-request"]')
       .addEventListener('click', (event) => {
-        Requestscorpora.entity.build(this.corpusId);
+        Requests.corpora.entity.build(this.corpusId);
       });
   }
 
diff --git a/app/static/js/resource-displays/index.js b/app/static/js/resource-displays/index.js
index 75c689871fc0ce6f2668392ca594c66ce01c07c2..1f795c4405f4c249cdbd0189137a4d6fd7c2d578 100644
--- a/app/static/js/resource-displays/index.js
+++ b/app/static/js/resource-displays/index.js
@@ -1,6 +1,25 @@
 var ResourceDisplays = {};
 
+ResourceDisplays.autoInit = () => {
+  for (let propertyName in ResourceDisplays) {
+    let property = ResourceDisplays[propertyName];
+    // Call autoInit of all properties that are subclasses of `ResourceDisplays.BaseDisplay`.
+    // This does not include `ResourceDisplays.BaseDisplay` itself.
+    if (property.prototype instanceof ResourceDisplays.BaseDisplay) {
+      // Check if the static `htmlClass` property is defined.
+      if (property.htmlClass === undefined) {return;}
+      // Gather all HTML elements that have the `this.htmlClass` class
+      // and do not have the `no-autoinit` class.
+      let displayElements = document.querySelectorAll(`.${property.htmlClass}:not(.no-autoinit)`);
+      // Create an instance of this class for each display element.
+      for (let displayElement of displayElements) {new property(displayElement);}
+    }
+  }
+}
+
 ResourceDisplays.BaseDisplay = class BaseDisplay {
+  static htmlClass;
+
   constructor(displayElement) {
     this.displayElement = displayElement;
     this.userId = this.displayElement.dataset.userId;
diff --git a/app/static/js/resource-displays/job-display.js b/app/static/js/resource-displays/job-display.js
index d52f0b0eba0bea2d38132e6b8a08954f4a1a6c9d..4ab370e234ee6bbcdac0fbe248b4c0876c436bf4 100644
--- a/app/static/js/resource-displays/job-display.js
+++ b/app/static/js/resource-displays/job-display.js
@@ -1,4 +1,6 @@
 ResourceDisplays.JobDisplay = class JobDisplay extends ResourceDisplays.BaseDisplay {
+  static htmlClass = 'job-display';
+
   constructor(displayElement) {
     super(displayElement);
     this.jobId = this.displayElement.dataset.jobId;
diff --git a/app/templates/_scripts.html.j2 b/app/templates/_scripts.html.j2
index de457973f64465215b8162294a041d5bfc3487ee..6213e3dfc36e63f6fd9f0847d2fb013f3ebb6b9b 100644
--- a/app/templates/_scripts.html.j2
+++ b/app/templates/_scripts.html.j2
@@ -140,6 +140,7 @@
     document.querySelectorAll('#nav-more-dropdown-trigger'),
     {alignment: 'right', constrainWidth: false, coverTrigger: false}
   );
+  ResourceDisplays.autoInit();
   ResourceList.autoInit();
   Forms.autoInit();
 
diff --git a/app/templates/corpora/corpus.html.j2 b/app/templates/corpora/corpus.html.j2
index 7539f420a418e0c51c0283c25e5d697a9002cea1..b6e600b9273e58cb48ed5c2c2cd9c0c10a62a664 100644
--- a/app/templates/corpora/corpus.html.j2
+++ b/app/templates/corpora/corpus.html.j2
@@ -5,7 +5,7 @@
 
 {% block page_content %}
 <div class="container">
-  <div class="row" data-corpus-id="{{ corpus.hashid }}" data-user-id="{{ corpus.user.hashid }}" id="corpus-display">
+  <div class="row corpus-display" data-corpus-id="{{ corpus.hashid }}" data-user-id="{{ corpus.user.hashid }}">
     <div class="col s12">
       <h1>{{ corpus.title }}</h1>
     </div>
@@ -237,8 +237,6 @@
 {% block scripts %}
 {{ super() }}
 <script>
-let corpusDisplay = new ResourceDisplays.CorpusDisplay(document.querySelector('#corpus-display'));
-
 {# {% if current_user.is_following_corpus(corpus) %}
   let unfollowRequestElement = document.querySelector('.action-button[data-action="unfollow-request"]');
   unfollowRequestElement.addEventListener('click', () => {
diff --git a/app/templates/jobs/job.html.j2 b/app/templates/jobs/job.html.j2
index b7b16bfbcdfee58ca0e010cc97e71a6bd1a0ad02..7fad7bcb6f5c86f1bde80b09d7c64cc69d5f175e 100644
--- a/app/templates/jobs/job.html.j2
+++ b/app/templates/jobs/job.html.j2
@@ -5,7 +5,7 @@
 {% block page_content %}
 <div class="container">
   <div class="row">
-    <div class="col s12" data-job-id="{{ job.hashid }}" data-user-id="{{ job.user.hashid }}" id="job-display">
+    <div class="col s12 job-display" data-job-id="{{ job.hashid }}" data-user-id="{{ job.user.hashid }}">
       <div class="row">
         <div class="col s8 m9 l10">
           <h1 id="title"><i style="font-size: inherit;" class="nopaque-icons service-icons" data-service="{{ job.service }}"></i> <span class="job-title"></span></h1>
@@ -150,7 +150,6 @@
 {% block scripts %}
 {{ super() }}
 <script>
-  let jobDisplay = new ResourceDisplays.JobDisplay(document.querySelector('#job-display'));
   let deleteJobRequestElement = document.querySelector('#delete-job-request');
   let restartJobRequestElement = document.querySelector('#restart-job-request');
   deleteJobRequestElement.addEventListener('click', (event) => {