diff --git a/app/static/js/CorpusAnalysis/CorpusAnalysisConcordance.js b/app/static/js/CorpusAnalysis/CorpusAnalysisConcordance.js
index 2263fbde0f9cbe7cfea779a8c127821caeb29d18..fd32c49c9f1a43d554aca259a0cd01f3dc7af33c 100644
--- a/app/static/js/CorpusAnalysis/CorpusAnalysisConcordance.js
+++ b/app/static/js/CorpusAnalysis/CorpusAnalysisConcordance.js
@@ -33,7 +33,7 @@ class CorpusAnalysisConcordance {
 
   async submitForm(queryModeId) {
     this.app.disableActionElements();
-    let queryBuilderQuery = Utils.unescape(document.querySelector('#corpus-analysis-concordance-query-preview').innerHTML.trim());
+    let queryBuilderQuery = nopaque.Utils.unescape(document.querySelector('#corpus-analysis-concordance-query-preview').innerHTML.trim());
     let expertModeQuery = this.elements.expertModeForm.query.value.trim();
     let query = queryModeId === 'corpus-analysis-concordance-expert-mode-form' ? expertModeQuery : queryBuilderQuery;
     let form = queryModeId === 'corpus-analysis-concordance-expert-mode-form' ? this.elements.expertModeForm : this.elements.queryBuilderForm;
@@ -171,11 +171,11 @@ class CorpusAnalysisConcordance {
     this.elements.subcorpusActions.querySelector('.subcorpus-export-trigger').addEventListener('click', (event) => {
       event.preventDefault();
       let subcorpus = this.data.subcorpora[this.settings.selectedSubcorpus];
-      let modalElementId = Utils.generateElementId('export-subcorpus-modal-');
-      let exportFormatSelectElementId = Utils.generateElementId('export-format-select-');
-      let exportSelectedMatchesOnlyCheckboxElementId = Utils.generateElementId('export-selected-matches-only-checkbox-');
-      let exportFileNameInputElementId = Utils.generateElementId('export-file-name-input-');
-      let modalElement = Utils.HTMLToElement(
+      let modalElementId = nopaque.Utils.generateElementId('export-subcorpus-modal-');
+      let exportFormatSelectElementId = nopaque.Utils.generateElementId('export-format-select-');
+      let exportSelectedMatchesOnlyCheckboxElementId = nopaque.Utils.generateElementId('export-selected-matches-only-checkbox-');
+      let exportFileNameInputElementId = nopaque.Utils.generateElementId('export-file-name-input-');
+      let modalElement = nopaque.Utils.HTMLToElement(
         `
           <div class="modal" id="${modalElementId}">
             <div class="modal-content">
diff --git a/app/static/js/CorpusAnalysis/CorpusAnalysisReader.js b/app/static/js/CorpusAnalysis/CorpusAnalysisReader.js
index 2a231ce214c46fb6a9724e25efcd7d678af61ee6..bbafbc277eb9adc96a7bb491ceba714b7c3cd2a7 100644
--- a/app/static/js/CorpusAnalysis/CorpusAnalysisReader.js
+++ b/app/static/js/CorpusAnalysis/CorpusAnalysisReader.js
@@ -112,7 +112,7 @@ class CorpusAnalysisReader {
     if (this.data.corpus.p.pages === 0) {return;}
     let pageElement;
     // First page button. Disables first page button if on first page
-    pageElement = Utils.HTMLToElement(
+    pageElement = nopaque.Utils.HTMLToElement(
       `
         <li class="${this.data.corpus.p.page === 1 ? 'disabled' : 'waves-effect'}">
           <a class="corpus-analysis-action pagination-trigger" ${this.data.corpus.p.page === 1 ? '' : 'data-target="1"'}>
@@ -123,7 +123,7 @@ class CorpusAnalysisReader {
     );
     this.elements.corpusPagination.appendChild(pageElement);
     // Previous page button. Disables previous page button if on first page
-    pageElement = Utils.HTMLToElement(
+    pageElement = nopaque.Utils.HTMLToElement(
       `
         <li class="${this.data.corpus.p.has_prev ? 'waves-effect' : 'disabled'}">
           <a class="corpus-analysis-action pagination-trigger" ${this.data.corpus.p.has_prev ? 'data-target="' + this.data.corpus.p.prev_num + '"' : ''}>
@@ -135,7 +135,7 @@ class CorpusAnalysisReader {
     this.elements.corpusPagination.appendChild(pageElement);
     // First page as number. Hides first page button if on first page
     if (this.data.corpus.p.page > 6) {
-      pageElement = Utils.HTMLToElement(
+      pageElement = nopaque.Utils.HTMLToElement(
         `
           <li class="waves-effect">
             <a class="corpus-analysis-action pagination-trigger" data-target="1">1</a>
@@ -143,14 +143,14 @@ class CorpusAnalysisReader {
         `
       );
       this.elements.corpusPagination.appendChild(pageElement);
-      pageElement = Utils.HTMLToElement("<li style='margin-top: 5px;'>&hellip;</li>");
+      pageElement = nopaque.Utils.HTMLToElement("<li style='margin-top: 5px;'>&hellip;</li>");
       this.elements.corpusPagination.appendChild(pageElement);
     }
 
     // render page buttons (5 before and 5 after current page)
     for (let i = this.data.corpus.p.page - this.settings.pagination.innerWindow; i <= this.data.corpus.p.page; i++) {
       if (i <= 0) {continue;}
-      pageElement = Utils.HTMLToElement(
+      pageElement = nopaque.Utils.HTMLToElement(
         `
           <li class="${i === this.data.corpus.p.page ? 'active' : 'waves-effect'}">
           <a class="corpus-analysis-action pagination-trigger" ${i === this.data.corpus.p.page ? '' : 'data-target="' + i + '"'}>${i}</a>
@@ -161,7 +161,7 @@ class CorpusAnalysisReader {
     };
     for (let i = this.data.corpus.p.page +1; i <= this.data.corpus.p.page + this.settings.pagination.innerWindow; i++) {
       if (i > this.data.corpus.p.pages) {break;}
-      pageElement = Utils.HTMLToElement(
+      pageElement = nopaque.Utils.HTMLToElement(
         `
           <li class="${i === this.data.corpus.p.page ? 'active' : 'waves-effect'}">
           <a class="corpus-analysis-action pagination-trigger" ${i === this.data.corpus.p.page ? '' : 'data-target="' + i + '"'}>${i}</a>
@@ -172,9 +172,9 @@ class CorpusAnalysisReader {
     };
     // Last page as number. Hides last page button if on last page
     if (this.data.corpus.p.page < this.data.corpus.p.pages - 6) {
-      pageElement = Utils.HTMLToElement("<li style='margin-top: 5px;'>&hellip;</li>");
+      pageElement = nopaque.Utils.HTMLToElement("<li style='margin-top: 5px;'>&hellip;</li>");
       this.elements.corpusPagination.appendChild(pageElement);
-      pageElement = Utils.HTMLToElement(
+      pageElement = nopaque.Utils.HTMLToElement(
         `
           <li class="waves-effect">
             <a class="corpus-analysis-action pagination-trigger" data-target="${this.data.corpus.p.pages}">${this.data.corpus.p.pages}</a>
@@ -184,7 +184,7 @@ class CorpusAnalysisReader {
       this.elements.corpusPagination.appendChild(pageElement);
     }
     // Next page button. Disables next page button if on last page
-    pageElement = Utils.HTMLToElement(
+    pageElement = nopaque.Utils.HTMLToElement(
       `
         <li class="${this.data.corpus.p.has_next ? 'waves-effect' : 'disabled'}">
           <a class="corpus-analysis-action pagination-trigger" ${this.data.corpus.p.has_next ? 'data-target="' + this.data.corpus.p.next_num + '"' : ''}>
@@ -195,7 +195,7 @@ class CorpusAnalysisReader {
     );
     this.elements.corpusPagination.appendChild(pageElement);
     // Last page button. Disables last page button if on last page
-    pageElement = Utils.HTMLToElement(
+    pageElement = nopaque.Utils.HTMLToElement(
       `
         <li class="${this.data.corpus.p.page === this.data.corpus.p.pages ? 'disabled' : 'waves-effect'}">
           <a class="corpus-analysis-action pagination-trigger" ${this.data.corpus.p.page === this.data.corpus.p.pages ? '' : 'data-target="' + this.data.corpus.p.pages + '"'}>
diff --git a/app/static/js/CorpusAnalysis/CorpusAnalysisStaticVisualization.js b/app/static/js/CorpusAnalysis/CorpusAnalysisStaticVisualization.js
index 4d51b01431cfe5af046ef2b12cc1359cc164c902..3865512cd25d94fb460b57a7bb608fa088cb479f 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) => {
-      Requests.corpora.entity.getStopwords()
+      nopaque.requests.corpora.entity.getStopwords()
         .then((response) => {
           response.json()
             .then((json) => {
@@ -104,7 +104,7 @@ class CorpusAnalysisStaticVisualization {
   renderTextInfoList() {
     let corpusData = this.data.corpus.o.staticData;
     let corpusTextInfoListElement = document.querySelector('.corpus-text-info-list');
-    let corpusTextInfoList = new ResourceLists.CorpusTextInfoList(corpusTextInfoListElement);
+    let corpusTextInfoList = new nopaque.resource_lists.CorpusTextInfoList(corpusTextInfoListElement);
     let texts = corpusData.s_attrs.text.lexicon;
     let textData = [];
     for (let i = 0; i < Object.entries(texts).length; i++) {
@@ -213,7 +213,7 @@ class CorpusAnalysisStaticVisualization {
 
   async renderTokenList() {
     let corpusTokenListElement = document.querySelector('.corpus-token-list');
-    let corpusTokenList = new ResourceLists.CorpusTokenList(corpusTokenListElement);
+    let corpusTokenList = new nopaque.resource_lists.CorpusTokenList(corpusTokenListElement);
     let filteredData = this.filterData();
     let stopwords = this.data.stopwords;
     if (this.data.stopwords === undefined) {
@@ -358,7 +358,7 @@ class CorpusAnalysisStaticVisualization {
     if (stopwordLanguageSelection.children.length === 0) {
       Object.keys(stopwords).forEach(language => {
         if (language !== 'user_stopwords') {
-          let optionElement = Utils.HTMLToElement(`<option value="${language}" ${language === 'english' ? 'selected' : ''}>${language}</option>`);
+          let optionElement = nopaque.Utils.HTMLToElement(`<option value="${language}" ${language === 'english' ? 'selected' : ''}>${language}</option>`);
           stopwordLanguageSelection.appendChild(optionElement);
         }
       });
@@ -367,7 +367,7 @@ class CorpusAnalysisStaticVisualization {
     // Render user stopwords over input field.
     if (this.data.stopwords['user_stopwords'].length > 0) {
       for (let word of this.data.stopwords['user_stopwords']) {
-        let chipElement = Utils.HTMLToElement(`<div class="chip">${word}<i class="close material-icons">close</i></div>`);
+        let chipElement = nopaque.Utils.HTMLToElement(`<div class="chip">${word}<i class="close material-icons">close</i></div>`);
         chipElement.addEventListener('click', (event) => {
           let removedListItem = event.target.closest('.chip').firstChild.textContent;
           this.data.stopwords['user_stopwords'] = structuredClone(this.data.stopwords['user_stopwords'].filter(item => item !== removedListItem));
@@ -433,7 +433,7 @@ class CorpusAnalysisStaticVisualization {
     let stopwordLanguageChipList = document.querySelector('#stopword-language-chip-list');
     stopwordLanguageChipList.innerHTML = '';
     for (let word of stopwords) {
-      let chipElement = Utils.HTMLToElement(`<div class="chip">${word}<i class="close material-icons">close</i></div>`);
+      let chipElement = nopaque.Utils.HTMLToElement(`<div class="chip">${word}<i class="close material-icons">close</i></div>`);
       chipElement.addEventListener('click', (event) => {
         let removedListItem = event.target.closest('.chip').firstChild.textContent;
         this.data.stopwords[language] = structuredClone(this.data.stopwords[language].filter(item => item !== removedListItem));
diff --git a/app/static/js/CorpusAnalysis/QueryBuilder/GeneralFunctionsQueryBuilder.js b/app/static/js/CorpusAnalysis/QueryBuilder/GeneralFunctionsQueryBuilder.js
index 481e9b6d841ed789a5e5d2bb3812caa56f6fa6e2..7a25019943d5ac7b1b1da98b83fe21f7484cf51a 100644
--- a/app/static/js/CorpusAnalysis/QueryBuilder/GeneralFunctionsQueryBuilder.js
+++ b/app/static/js/CorpusAnalysis/QueryBuilder/GeneralFunctionsQueryBuilder.js
@@ -28,7 +28,7 @@ class GeneralFunctionsQueryBuilder {
   }
 
   addPlaceholder() {
-    let placeholder = Utils.HTMLToElement('<span id="corpus-analysis-concordance-query-builder-input-field-placeholder">Click on a button to add a query component</span>');
+    let placeholder = nopaque.Utils.HTMLToElement('<span id="corpus-analysis-concordance-query-builder-input-field-placeholder">Click on a button to add a query component</span>');
     this.elements.queryInputField.appendChild(placeholder);
   }
   
@@ -58,9 +58,9 @@ class GeneralFunctionsQueryBuilder {
 
   queryChipFactory(dataType, prettyQueryText, queryText, index = null, isClosingTag = false, isEditable = false) {
     // Creates a new query chip element, adds Eventlisteners for selection, deletion and drag and drop and appends it to the query input field.
-    queryText = Utils.escape(queryText);
-    prettyQueryText = Utils.escape(prettyQueryText);
-    let queryChipElement = Utils.HTMLToElement(
+    queryText = nopaque.Utils.escape(queryText);
+    prettyQueryText = nopaque.Utils.escape(prettyQueryText);
+    let queryChipElement = nopaque.Utils.HTMLToElement(
       `
         <span class="chip query-component" data-type="${dataType}" data-query="${queryText}" draggable="true" data-closing-tag="${isClosingTag}">
           ${prettyQueryText}${isEditable ? '<i class="material-icons chip-action-button" data-chip-action="edit" style="padding-left:5px; font-size:18px; cursor:pointer;">edit</i>': ''}
@@ -265,7 +265,7 @@ class GeneralFunctionsQueryBuilder {
     // is called when a query chip is dragged. It creates a dropzone (in form of a chip) for the dragged chip and adds it to the query input field.
     let queryChips = this.elements.queryInputField.querySelectorAll('.query-component');
     setTimeout(() => {
-      let targetChipElement = Utils.HTMLToElement('<span class="chip drop-target">Drop here</span>');
+      let targetChipElement = nopaque.Utils.HTMLToElement('<span class="chip drop-target">Drop here</span>');
       for (let element of queryChips) {
         if (element === queryChipElement.nextSibling) {continue;}
         let targetChipClone = targetChipElement.cloneNode(true);
@@ -310,7 +310,7 @@ class GeneralFunctionsQueryBuilder {
     this.elements.queryChipElements.forEach(element => {
       let queryElement = element.dataset.query;
       if (queryElement !== undefined) {
-        queryElement = Utils.escape(queryElement);
+        queryElement = nopaque.Utils.escape(queryElement);
       }
       queryInputFieldContent.push(queryElement);
     });
@@ -374,7 +374,7 @@ class GeneralFunctionsQueryBuilder {
   switchToExpertModeParser() {
     let expertModeInputField = document.querySelector('#corpus-analysis-concordance-form-query');
     expertModeInputField.value = '';
-    let queryBuilderInputFieldValue = Utils.unescape(document.querySelector('#corpus-analysis-concordance-query-preview').innerHTML.trim());
+    let queryBuilderInputFieldValue = nopaque.Utils.unescape(document.querySelector('#corpus-analysis-concordance-query-preview').innerHTML.trim());
     if (queryBuilderInputFieldValue !== "" && queryBuilderInputFieldValue !== ";") {
       expertModeInputField.value = queryBuilderInputFieldValue;
     }
diff --git a/app/static/js/nopaque/app.js b/app/static/js/app.js
similarity index 98%
rename from app/static/js/nopaque/app.js
rename to app/static/js/app.js
index c4e837c4a8b7680fef535b796d67dd7fe2761e90..05190ce2e7d09d26c1fec98e0dbcf06243ab3230 100644
--- a/app/static/js/nopaque/app.js
+++ b/app/static/js/app.js
@@ -188,9 +188,9 @@ nopaque.App = class App {
 
     /* Initialize nopaque Components */
     // #region 
-    ResourceDisplays.AutoInit();
-    ResourceLists.AutoInit();
-    Forms.AutoInit();
+    nopaque.resource_displays.AutoInit();
+    nopaque.resource_lists.AutoInit();
+    nopaque.forms.AutoInit();
     // #endregion
   }
 };
diff --git a/app/static/js/forms/base-form.js b/app/static/js/forms/base-form.js
index b856048500eebc803af849aebeed136099a43082..5b4b9e4186420fe81d8b4786307776403496d9a3 100644
--- a/app/static/js/forms/base-form.js
+++ b/app/static/js/forms/base-form.js
@@ -1,4 +1,4 @@
-Forms.BaseForm = class BaseForm {
+nopaque.forms.BaseForm = class BaseForm {
   static htmlClass;
 
   constructor(formElement) {
@@ -28,7 +28,7 @@ Forms.BaseForm = class BaseForm {
 
   submit(event) {
     let request = new XMLHttpRequest();
-    let modalElement = Utils.HTMLToElement(
+    let modalElement = nopaque.Utils.HTMLToElement(
       `
         <div class="modal">
           <div class="modal-content">
@@ -67,7 +67,7 @@ Forms.BaseForm = class BaseForm {
     for (let selectElement of this.formElement.querySelectorAll('select')) {
       if (selectElement.value === '') {
         let inputFieldElement = selectElement.closest('.input-field');
-        let errorHelperTextElement = Utils.HTMLToElement(
+        let errorHelperTextElement = nopaque.Utils.HTMLToElement(
           '<span class="helper-text error-color-text" data-helper-text-type="error">Please select an option.</span>'
         );
         inputFieldElement.appendChild(errorHelperTextElement);
@@ -93,7 +93,7 @@ Forms.BaseForm = class BaseForm {
             .querySelector(`input[name$="${inputName}"], select[name$="${inputName}"]`)
             .closest('.input-field');
           for (let inputError of inputErrors) {
-            let errorHelperTextElement = Utils.HTMLToElement(
+            let errorHelperTextElement = nopaque.Utils.HTMLToElement(
               `<span class="helper-text error-color-text" data-helper-type="error">${inputError}</span>`
             );
             inputFieldElement.appendChild(errorHelperTextElement);
diff --git a/app/static/js/forms/create-contribution-form.js b/app/static/js/forms/create-contribution-form.js
index 4474ff893bd1d02a5c94343c53219f3389734c38..7c9326e9e2d0fcf93821a87ff650605d73e96d60 100644
--- a/app/static/js/forms/create-contribution-form.js
+++ b/app/static/js/forms/create-contribution-form.js
@@ -1,4 +1,4 @@
-Forms.CreateContributionForm = class CreateContributionForm extends Forms.BaseForm {
+nopaque.forms.CreateContributionForm = class CreateContributionForm extends nopaque.forms.BaseForm {
   static htmlClass = 'create-contribution-form';
 
   constructor(formElement) {
diff --git a/app/static/js/forms/create-corpus-file-form.js b/app/static/js/forms/create-corpus-file-form.js
index beec4ee2276960da81b98628db1ecdb544c98ac5..439ad8c5efbda5fd8feb5b5a3c4d58e7641add8f 100644
--- a/app/static/js/forms/create-corpus-file-form.js
+++ b/app/static/js/forms/create-corpus-file-form.js
@@ -1,4 +1,4 @@
-Forms.CreateCorpusFileForm = class CreateCorpusFileForm extends Forms.BaseForm {
+nopaque.forms.CreateCorpusFileForm = class CreateCorpusFileForm extends nopaque.forms.BaseForm {
   static htmlClass = 'create-corpus-file-form';
 
   constructor(formElement) {
diff --git a/app/static/js/forms/create-job-form.js b/app/static/js/forms/create-job-form.js
index 6e6c7c0116f5844979b08668e4344dda6a5b5503..9322286e8ea39b186086a921f56f8cef6b1ce5d0 100644
--- a/app/static/js/forms/create-job-form.js
+++ b/app/static/js/forms/create-job-form.js
@@ -1,4 +1,4 @@
-Forms.CreateJobForm = class CreateJobForm extends Forms.BaseForm {
+nopaque.forms.CreateJobForm = class CreateJobForm extends nopaque.forms.BaseForm {
   static htmlClass = 'create-job-form';
 
   constructor(formElement) {
diff --git a/app/static/js/forms/index.js b/app/static/js/forms/index.js
index a6d098ddf28d01701cc2e9e0f643dfc2066f39a6..ffdad4bd72c19db0e7e12994400abf6ae085192d 100644
--- a/app/static/js/forms/index.js
+++ b/app/static/js/forms/index.js
@@ -1,11 +1,11 @@
-var Forms = {};
+nopaque.forms = {};
 
-Forms.AutoInit = () => {
-  for (let propertyName in Forms) {
-    let property = Forms[propertyName];
-    // Call autoInit of all properties that are subclasses of Forms.BaseForm.
-    // This does not include Forms.BaseForm itself.
-    if (property.prototype instanceof Forms.BaseForm) {
+nopaque.forms.AutoInit = () => {
+  for (let propertyName in nopaque.forms) {
+    let property = nopaque.forms[propertyName];
+    // Call autoInit of all properties that are subclasses of nopaque.forms.BaseForm.
+    // This does not include nopaque.forms.BaseForm itself.
+    if (property.prototype instanceof nopaque.forms.BaseForm) {
       // Check if the static htmlClass property is defined.
       if (property.htmlClass === undefined) {return;}
       // Gather all HTML elements that have the `this.htmlClass` class
diff --git a/app/static/js/index.js b/app/static/js/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..c2537ef6f4cbad157675d43411060d167ad595b3
--- /dev/null
+++ b/app/static/js/index.js
@@ -0,0 +1,5 @@
+/*
+ * This object functions as a global namespace for nopaque.
+ * All components of nopaque should be attached to this object.
+ */
+var nopaque = {};
diff --git a/app/static/js/nopaque/index.js b/app/static/js/nopaque/index.js
deleted file mode 100644
index 0d7bc55f16a87de3d7ef8d3a219e49fccba765d8..0000000000000000000000000000000000000000
--- a/app/static/js/nopaque/index.js
+++ /dev/null
@@ -1 +0,0 @@
-var nopaque = {};
diff --git a/app/static/js/requests/admin.js b/app/static/js/requests/admin.js
index fdfe5dcd02af29b1920fc4dd19e885d7715c6d24..bbaf64471b51e73bac118f7b0ad57999ff61a69b 100644
--- a/app/static/js/requests/admin.js
+++ b/app/static/js/requests/admin.js
@@ -1,19 +1,19 @@
 /*****************************************************************************
  * Requests for /admin routes                                                *
 *****************************************************************************/
-Requests.admin = {};
+nopaque.requests.admin = {};
 
-Requests.admin.users = {};
+nopaque.requests.admin.users = {};
 
-Requests.admin.users.entity = {};
+nopaque.requests.admin.users.entity = {};
 
-Requests.admin.users.entity.confirmed = {};
+nopaque.requests.admin.users.entity.confirmed = {};
 
-Requests.admin.users.entity.confirmed.update = (userId, value) => {
+nopaque.requests.admin.users.entity.confirmed.update = (userId, value) => {
   let input = `/admin/users/${userId}/confirmed`;
   let init = {
     method: 'PUT',
     body: JSON.stringify(value)
   };
-  return Requests.JSONfetch(input, init);
+  return nopaque.requests.JSONfetch(input, init);
 };
diff --git a/app/static/js/requests/contributions.js b/app/static/js/requests/contributions.js
index cd6329b6c5d07c3fe3c0f5375cde36b869e4f8f8..20d26212af44e6cb813a0c08868a20998b8c84bf 100644
--- a/app/static/js/requests/contributions.js
+++ b/app/static/js/requests/contributions.js
@@ -1,58 +1,58 @@
 /*****************************************************************************
 * Requests for /contributions routes                                         *
 *****************************************************************************/
-Requests.contributions = {};
+nopaque.requests.contributions = {};
 
 
 /*****************************************************************************
 * Requests for /contributions/spacy-nlp-pipeline-models routes               *
 *****************************************************************************/
-Requests.contributions.spacy_nlp_pipeline_models = {};
+nopaque.requests.contributions.spacy_nlp_pipeline_models = {};
 
-Requests.contributions.spacy_nlp_pipeline_models.entity = {};
+nopaque.requests.contributions.spacy_nlp_pipeline_models.entity = {};
 
-Requests.contributions.spacy_nlp_pipeline_models.entity.delete = (spacyNlpPipelineModelId) => {
+nopaque.requests.contributions.spacy_nlp_pipeline_models.entity.delete = (spacyNlpPipelineModelId) => {
   let input = `/contributions/spacy-nlp-pipeline-models/${spacyNlpPipelineModelId}`;
   let init = {
     method: 'DELETE'
   };
-  return Requests.JSONfetch(input, init);
+  return nopaque.requests.JSONfetch(input, init);
 };
 
-Requests.contributions.spacy_nlp_pipeline_models.entity.isPublic = {};
+nopaque.requests.contributions.spacy_nlp_pipeline_models.entity.isPublic = {};
 
-Requests.contributions.spacy_nlp_pipeline_models.entity.isPublic.update = (spacyNlpPipelineModelId, value) => {
+nopaque.requests.contributions.spacy_nlp_pipeline_models.entity.isPublic.update = (spacyNlpPipelineModelId, value) => {
   let input = `/contributions/spacy-nlp-pipeline-models/${spacyNlpPipelineModelId}/is_public`;
   let init = {
     method: 'PUT',
     body: JSON.stringify(value)
   };
-  return Requests.JSONfetch(input, init);
+  return nopaque.requests.JSONfetch(input, init);
 };
 
 
 /*****************************************************************************
 * Requests for /contributions/tesseract-ocr-pipeline-models routes           *
 *****************************************************************************/
-Requests.contributions.tesseract_ocr_pipeline_models = {};
+nopaque.requests.contributions.tesseract_ocr_pipeline_models = {};
 
-Requests.contributions.tesseract_ocr_pipeline_models.entity = {};
+nopaque.requests.contributions.tesseract_ocr_pipeline_models.entity = {};
 
-Requests.contributions.tesseract_ocr_pipeline_models.entity.delete = (tesseractOcrPipelineModelId) => {
+nopaque.requests.contributions.tesseract_ocr_pipeline_models.entity.delete = (tesseractOcrPipelineModelId) => {
   let input = `/contributions/tesseract-ocr-pipeline-models/${tesseractOcrPipelineModelId}`;
   let init = {
     method: 'DELETE'
   };
-  return Requests.JSONfetch(input, init);
+  return nopaque.requests.JSONfetch(input, init);
 };
 
-Requests.contributions.tesseract_ocr_pipeline_models.entity.isPublic = {};
+nopaque.requests.contributions.tesseract_ocr_pipeline_models.entity.isPublic = {};
 
-Requests.contributions.tesseract_ocr_pipeline_models.entity.isPublic.update = (tesseractOcrPipelineModelId, value) => {
+nopaque.requests.contributions.tesseract_ocr_pipeline_models.entity.isPublic.update = (tesseractOcrPipelineModelId, value) => {
   let input = `/contributions/tesseract-ocr-pipeline-models/${tesseractOcrPipelineModelId}/is_public`;
   let init = {
     method: 'PUT',
     body: JSON.stringify(value)
   };
-  return Requests.JSONfetch(input, init);
+  return nopaque.requests.JSONfetch(input, init);
 };
diff --git a/app/static/js/requests/corpora.js b/app/static/js/requests/corpora.js
index 4c65a7eeb2903cfab124df28bd95d9a1cff43cbe..beb87f84e487181726077882e31122cb83db9311 100644
--- a/app/static/js/requests/corpora.js
+++ b/app/static/js/requests/corpora.js
@@ -1,102 +1,102 @@
 /*****************************************************************************
 * Requests for /corpora routes                                               *
 *****************************************************************************/
-Requests.corpora = {};
+nopaque.requests.corpora = {};
 
-Requests.corpora.entity = {};
+nopaque.requests.corpora.entity = {};
 
-Requests.corpora.entity.delete = (corpusId) => {
+nopaque.requests.corpora.entity.delete = (corpusId) => {
   let input = `/corpora/${corpusId}`;
   let init = {
     method: 'DELETE'
   };
-  return Requests.JSONfetch(input, init);
+  return nopaque.requests.JSONfetch(input, init);
 };
 
-Requests.corpora.entity.build = (corpusId) => {
+nopaque.requests.corpora.entity.build = (corpusId) => {
   let input = `/corpora/${corpusId}/build`;
   let init = {
     method: 'POST',
   };
-  return Requests.JSONfetch(input, init);
+  return nopaque.requests.JSONfetch(input, init);
 };
 
-Requests.corpora.entity.generateShareLink = (corpusId, role, expiration) => {
+nopaque.requests.corpora.entity.generateShareLink = (corpusId, role, expiration) => {
   let input = `/corpora/${corpusId}/generate-share-link`;
   let init = {
     method: 'POST',
     body: JSON.stringify({role: role, expiration: expiration})
   };
-  return Requests.JSONfetch(input, init);
+  return nopaque.requests.JSONfetch(input, init);
 };
 
-Requests.corpora.entity.getStopwords = () => {
+nopaque.requests.corpora.entity.getStopwords = () => {
   let input = `/corpora/stopwords`;
   let init = {
     method: 'GET'
   };
-  return Requests.JSONfetch(input, init);
+  return nopaque.requests.JSONfetch(input, init);
 };
 
-Requests.corpora.entity.isPublic = {};
+nopaque.requests.corpora.entity.isPublic = {};
 
-Requests.corpora.entity.isPublic.update = (corpusId, isPublic) => {
+nopaque.requests.corpora.entity.isPublic.update = (corpusId, isPublic) => {
   let input = `/corpora/${corpusId}/is_public`;
   let init = {
     method: 'PUT',
     body: JSON.stringify(isPublic)
   };
-  return Requests.JSONfetch(input, init);
+  return nopaque.requests.JSONfetch(input, init);
 };
 
 
 /*****************************************************************************
 * Requests for /corpora/<entity>/files routes                                *
 *****************************************************************************/
-Requests.corpora.entity.files = {};
+nopaque.requests.corpora.entity.files = {};
 
-Requests.corpora.entity.files.ent = {};
+nopaque.requests.corpora.entity.files.ent = {};
 
-Requests.corpora.entity.files.ent.delete = (corpusId, corpusFileId) => {
+nopaque.requests.corpora.entity.files.ent.delete = (corpusId, corpusFileId) => {
   let input = `/corpora/${corpusId}/files/${corpusFileId}`;
   let init = {
     method: 'DELETE',
   };
-  return Requests.JSONfetch(input, init);
+  return nopaque.requests.JSONfetch(input, init);
 };
 
 
 /*****************************************************************************
 * Requests for /corpora/<entity>/followers routes                            *
 *****************************************************************************/
-Requests.corpora.entity.followers = {};
+nopaque.requests.corpora.entity.followers = {};
 
-Requests.corpora.entity.followers.add = (corpusId, usernames) => {
+nopaque.requests.corpora.entity.followers.add = (corpusId, usernames) => {
   let input = `/corpora/${corpusId}/followers`;
   let init = {
     method: 'POST',
     body: JSON.stringify(usernames)
   };
-  return Requests.JSONfetch(input, init);
+  return nopaque.requests.JSONfetch(input, init);
 };
 
-Requests.corpora.entity.followers.entity = {};
+nopaque.requests.corpora.entity.followers.entity = {};
 
-Requests.corpora.entity.followers.entity.delete = (corpusId, followerId) => {
+nopaque.requests.corpora.entity.followers.entity.delete = (corpusId, followerId) => {
   let input = `/corpora/${corpusId}/followers/${followerId}`;
   let init = {
     method: 'DELETE',
   };
-  return Requests.JSONfetch(input, init);
+  return nopaque.requests.JSONfetch(input, init);
 };
 
-Requests.corpora.entity.followers.entity.role = {};
+nopaque.requests.corpora.entity.followers.entity.role = {};
 
-Requests.corpora.entity.followers.entity.role.update = (corpusId, followerId, value) => {
+nopaque.requests.corpora.entity.followers.entity.role.update = (corpusId, followerId, value) => {
   let input = `/corpora/${corpusId}/followers/${followerId}/role`;
   let init = {
     method: 'PUT',
     body: JSON.stringify(value)
   };
-  return Requests.JSONfetch(input, init);
+  return nopaque.requests.JSONfetch(input, init);
 };
diff --git a/app/static/js/requests/index.js b/app/static/js/requests/index.js
index c5bb8a1f51c3b99f6fd506603a3ac95674da0ab0..177eca880386100c04422c7028cbc7ccd3ab2ded 100644
--- a/app/static/js/requests/index.js
+++ b/app/static/js/requests/index.js
@@ -1,6 +1,6 @@
-var Requests = {};
+nopaque.requests = {};
 
-Requests.JSONfetch = (input, init={}) => {
+nopaque.requests.JSONfetch = (input, init={}) => {
   return new Promise((resolve, reject) => {
     let fixedInit = {};
     fixedInit.headers = {};
@@ -8,7 +8,7 @@ Requests.JSONfetch = (input, init={}) => {
     if (init.hasOwnProperty('body')) {
       fixedInit.headers['Content-Type'] = 'application/json';
     }
-    fetch(input, Utils.mergeObjectsDeep(init, fixedInit))
+    fetch(input, nopaque.Utils.mergeObjectsDeep(init, fixedInit))
       .then(
         (response) => {
           if (response.ok) {
diff --git a/app/static/js/requests/jobs.js b/app/static/js/requests/jobs.js
index 6a50463d0d669228002061cae80ef7c14d4f5c60..35abce329f74e1ca19456957db448cfb2d38a835 100644
--- a/app/static/js/requests/jobs.js
+++ b/app/static/js/requests/jobs.js
@@ -1,30 +1,30 @@
 /*****************************************************************************
 * Requests for /jobs routes                                                  *
 *****************************************************************************/
-Requests.jobs = {};
+nopaque.requests.jobs = {};
 
-Requests.jobs.entity = {};
+nopaque.requests.jobs.entity = {};
 
-Requests.jobs.entity.delete = (jobId) => {
+nopaque.requests.jobs.entity.delete = (jobId) => {
   let input = `/jobs/${jobId}`;
   let init = {
     method: 'DELETE'
   };
-  return Requests.JSONfetch(input, init);
+  return nopaque.requests.JSONfetch(input, init);
 };
 
-Requests.jobs.entity.log = (jobId) => {
+nopaque.requests.jobs.entity.log = (jobId) => {
   let input = `/jobs/${jobId}/log`;
   let init = {
     method: 'GET'
   };
-  return Requests.JSONfetch(input, init);
+  return nopaque.requests.JSONfetch(input, init);
 };
 
-Requests.jobs.entity.restart = (jobId) => {
+nopaque.requests.jobs.entity.restart = (jobId) => {
   let input = `/jobs/${jobId}/restart`;
   let init = {
     method: 'POST'
   };
-  return Requests.JSONfetch(input, init);
+  return nopaque.requests.JSONfetch(input, init);
 };
diff --git a/app/static/js/requests/users.js b/app/static/js/requests/users.js
index fb76cb074ae74b7c1914b6b02747f6907e5308c4..25ec135311137689fc81a110c5056eee7c15c123 100644
--- a/app/static/js/requests/users.js
+++ b/app/static/js/requests/users.js
@@ -2,50 +2,50 @@
 * Users                                                                      *
 * Fetch requests for /users routes                                           *
 *****************************************************************************/
-Requests.users = {};
+nopaque.requests.users = {};
 
-Requests.users.entity = {};
+nopaque.requests.users.entity = {};
 
-Requests.users.entity.delete = (userId) => {
+nopaque.requests.users.entity.delete = (userId) => {
   let input = `/users/${userId}`;
   let init = {
     method: 'DELETE'
   };
-  return Requests.JSONfetch(input, init);
+  return nopaque.requests.JSONfetch(input, init);
 };
 
-Requests.users.entity.acceptTermsOfUse = () => {
+nopaque.requests.users.entity.acceptTermsOfUse = () => {
   let input = `/users/accept-terms-of-use`;
   let init = {
     method: 'POST'
   };
-  return Requests.JSONfetch(input, init);
+  return nopaque.requests.JSONfetch(input, init);
 };
 
-Requests.users.entity.avatar = {};
+nopaque.requests.users.entity.avatar = {};
 
-Requests.users.entity.avatar.delete = (userId) => {
+nopaque.requests.users.entity.avatar.delete = (userId) => {
   let input = `/users/${userId}/avatar`;
   let init = {
     method: 'DELETE'
   };
-  return Requests.JSONfetch(input, init);
+  return nopaque.requests.JSONfetch(input, init);
 }
 
 
 /*****************************************************************************
 * Requests for /users/<entity>/settings routes                               *
 *****************************************************************************/
-Requests.users.entity.settings = {};
+nopaque.requests.users.entity.settings = {};
 
-Requests.users.entity.settings.profilePrivacy = {};
+nopaque.requests.users.entity.settings.profilePrivacy = {};
 
-Requests.users.entity.settings.profilePrivacy.update = (userId, profilePrivacySetting, enabled) => {
+nopaque.requests.users.entity.settings.profilePrivacy.update = (userId, profilePrivacySetting, enabled) => {
   let input = `/users/${userId}/settings/profile-privacy/${profilePrivacySetting}`;
   let init = {
     method: 'PUT',
     body: JSON.stringify(enabled)
   };
-  return Requests.JSONfetch(input, init);
+  return nopaque.requests.JSONfetch(input, init);
 };
 
diff --git a/app/static/js/resource-displays/corpus-display.js b/app/static/js/resource-displays/corpus-display.js
index bf6d258948ae407cf6f32033dc510c8ea92f3898..992328383e587e3929bacc9382908d4a5ce85ce2 100644
--- a/app/static/js/resource-displays/corpus-display.js
+++ b/app/static/js/resource-displays/corpus-display.js
@@ -1,4 +1,4 @@
-ResourceDisplays.CorpusDisplay = class CorpusDisplay extends ResourceDisplays.ResourceDisplay {
+nopaque.resource_displays.CorpusDisplay = class CorpusDisplay extends nopaque.resource_displays.ResourceDisplay {
   static htmlClass = 'corpus-display';
 
   constructor(displayElement) {
@@ -7,7 +7,7 @@ ResourceDisplays.CorpusDisplay = class CorpusDisplay extends ResourceDisplays.Re
     this.displayElement
       .querySelector('.action-button[data-action="build-request"]')
       .addEventListener('click', (event) => {
-        Requests.corpora.entity.build(this.corpusId);
+        nopaque.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 a559189d21bc9950b546ca4f7556d37c9b882233..3765fcb2e8af55b5a58e412e2972383795d4bbe3 100644
--- a/app/static/js/resource-displays/index.js
+++ b/app/static/js/resource-displays/index.js
@@ -1,11 +1,11 @@
-var ResourceDisplays = {};
+nopaque.resource_displays = {};
 
-ResourceDisplays.AutoInit = () => {
-  for (let propertyName in ResourceDisplays) {
-    let property = ResourceDisplays[propertyName];
-    // Call autoInit of all properties that are subclasses of `ResourceDisplays.ResourceDisplay`.
-    // This does not include `ResourceDisplays.ResourceDisplay` itself.
-    if (property.prototype instanceof ResourceDisplays.ResourceDisplay) {
+nopaque.resource_displays.AutoInit = () => {
+  for (let propertyName in nopaque.resource_displays) {
+    let property = nopaque.resource_displays[propertyName];
+    // Call autoInit of all properties that are subclasses of `nopaque.resource_displays.ResourceDisplay`.
+    // This does not include `nopaque.resource_displays.ResourceDisplay` itself.
+    if (property.prototype instanceof nopaque.resource_displays.ResourceDisplay) {
       // Check if the static `htmlClass` property is defined.
       if (property.htmlClass === undefined) {return;}
       // Gather all HTML elements that have the `this.htmlClass` class
diff --git a/app/static/js/resource-displays/job-display.js b/app/static/js/resource-displays/job-display.js
index 78ebc22c0ccbb6a8ae0acac3a85d62ad86a5eefe..0be3e232126e3ffd4c388098584ee6334992c55d 100644
--- a/app/static/js/resource-displays/job-display.js
+++ b/app/static/js/resource-displays/job-display.js
@@ -1,4 +1,4 @@
-ResourceDisplays.JobDisplay = class JobDisplay extends ResourceDisplays.ResourceDisplay {
+nopaque.resource_displays.JobDisplay = class JobDisplay extends nopaque.resource_displays.ResourceDisplay {
   static htmlClass = 'job-display';
 
   constructor(displayElement) {
diff --git a/app/static/js/resource-displays/resource-display.js b/app/static/js/resource-displays/resource-display.js
index 39401d2bdd26961c16e188b9b7d0ed8039b3826a..23763ca9797b10b67a1d871bb6019f7b7c50d80d 100644
--- a/app/static/js/resource-displays/resource-display.js
+++ b/app/static/js/resource-displays/resource-display.js
@@ -1,4 +1,4 @@
-ResourceDisplays.ResourceDisplay = class ResourceDisplay {
+nopaque.resource_displays.ResourceDisplay = class ResourceDisplay {
   static htmlClass;
 
   constructor(displayElement) {
diff --git a/app/static/js/resource-lists/admin-user-list.js b/app/static/js/resource-lists/admin-user-list.js
index 40feab2790703b7564df19780c4aee716ce65777..3b7f0ac46e7a26a89ac1145a4a52645331573110 100644
--- a/app/static/js/resource-lists/admin-user-list.js
+++ b/app/static/js/resource-lists/admin-user-list.js
@@ -1,4 +1,4 @@
-ResourceLists.AdminUserList = class AdminUserList extends ResourceLists.ResourceList {
+nopaque.resource_lists.AdminUserList = class AdminUserList extends nopaque.resource_lists.ResourceList {
   static htmlClass = 'admin-user-list';
 
   constructor(listContainerElement, options = {}) {
@@ -37,9 +37,9 @@ ResourceLists.AdminUserList = class AdminUserList extends ResourceLists.Resource
 
   initListContainerElement() {
     if (!this.listContainerElement.hasAttribute('id')) {
-      this.listContainerElement.id = Utils.generateElementId('user-list-');
+      this.listContainerElement.id = nopaque.Utils.generateElementId('user-list-');
     }
-    let listSearchElementId = Utils.generateElementId(`${this.listContainerElement.id}-search-`);
+    let listSearchElementId = nopaque.Utils.generateElementId(`${this.listContainerElement.id}-search-`);
     this.listContainerElement.innerHTML = `
       <div class="input-field">
         <i class="material-icons prefix">search</i>
@@ -87,7 +87,7 @@ ResourceLists.AdminUserList = class AdminUserList extends ResourceLists.Resource
     let listAction = listActionElement === null ? 'view' : listActionElement.dataset.listAction;
     switch (listAction) {
       case 'delete': {
-        Requests.users.entity.delete(itemId);
+        nopaque.requests.users.entity.delete(itemId);
         if (itemId === currentUserId) {window.location.href = '/';}
         break;
       }
diff --git a/app/static/js/resource-lists/corpus-file-list.js b/app/static/js/resource-lists/corpus-file-list.js
index 7e6a5da9c570debee16b4dad1ab38567d98ff7a0..e1aed5181453f3d399a835b332fe21910fbdf4ed 100644
--- a/app/static/js/resource-lists/corpus-file-list.js
+++ b/app/static/js/resource-lists/corpus-file-list.js
@@ -1,4 +1,4 @@
-ResourceLists.CorpusFileList = class CorpusFileList extends ResourceLists.ResourceList {
+nopaque.resource_lists.CorpusFileList = class CorpusFileList extends nopaque.resource_lists.ResourceList {
   static htmlClass = 'corpus-file-list';
 
   constructor(listContainerElement, options = {}) {
@@ -62,9 +62,9 @@ ResourceLists.CorpusFileList = class CorpusFileList extends ResourceLists.Resour
 
   initListContainerElement() {
     if (!this.listContainerElement.hasAttribute('id')) {
-      this.listContainerElement.id = Utils.generateElementId('corpus-file-list-');
+      this.listContainerElement.id = nopaque.Utils.generateElementId('corpus-file-list-');
     }
-    let listSearchElementId = Utils.generateElementId(`${this.listContainerElement.id}-search-`);
+    let listSearchElementId = nopaque.Utils.generateElementId(`${this.listContainerElement.id}-search-`);
     this.listContainerElement.innerHTML = `
       <div class="input-field">
         <i class="material-icons prefix">search</i>
@@ -121,7 +121,7 @@ ResourceLists.CorpusFileList = class CorpusFileList extends ResourceLists.Resour
     switch (listAction) {
       case 'delete': {
         let values = this.listjs.get('id', itemId)[0].values();
-        let modalElement = Utils.HTMLToElement(
+        let modalElement = nopaque.Utils.HTMLToElement(
           `
             <div class="modal">
               <div class="modal-content">
@@ -149,12 +149,12 @@ ResourceLists.CorpusFileList = class CorpusFileList extends ResourceLists.Resour
         let confirmElement = modalElement.querySelector('.action-button[data-action="confirm"]');
         confirmElement.addEventListener('click', (event) => {
           if (currentUserId != this.userId) {
-            Requests.corpora.entity.files.ent.delete(this.corpusId, itemId)
+            nopaque.requests.corpora.entity.files.ent.delete(this.corpusId, itemId)
             .then(() => {
               window.location.reload();
             });
           } else {
-            Requests.corpora.entity.files.ent.delete(this.corpusId, itemId)
+            nopaque.requests.corpora.entity.files.ent.delete(this.corpusId, itemId)
           }
         });
         modal.open();
@@ -208,7 +208,7 @@ ResourceLists.CorpusFileList = class CorpusFileList extends ResourceLists.Resour
         break;
       }
       case 'delete': {
-        let modalElement = Utils.HTMLToElement(
+        let modalElement = nopaque.Utils.HTMLToElement(
           `
             <div class="modal">
               <div class="modal-content">
@@ -229,7 +229,7 @@ ResourceLists.CorpusFileList = class CorpusFileList extends ResourceLists.Resour
         this.selectedItemIds.forEach(selectedItemId => {
           let listItem = this.listjs.get('id', selectedItemId)[0].elm;
           let values = this.listjs.get('id', listItem.dataset.id)[0].values();
-          let itemElement = Utils.HTMLToElement(`<li> - ${values.title}</li>`);
+          let itemElement = nopaque.Utils.HTMLToElement(`<li> - ${values.title}</li>`);
           itemList.appendChild(itemElement);
         });
         let modal = M.Modal.init(
@@ -246,12 +246,12 @@ ResourceLists.CorpusFileList = class CorpusFileList extends ResourceLists.Resour
         confirmElement.addEventListener('click', (event) => {
           this.selectedItemIds.forEach(selectedItemId => {
             if (currentUserId != this.userId) {
-              Requests.corpora.entity.files.ent.delete(this.corpusId, selectedItemId)
+              nopaque.requests.corpora.entity.files.ent.delete(this.corpusId, selectedItemId)
               .then(() => {
                 window.location.reload();
               });
             } else {
-              Requests.corpora.entity.files.ent.delete(this.corpusId, selectedItemId);
+              nopaque.requests.corpora.entity.files.ent.delete(this.corpusId, selectedItemId);
             }
           });
           this.selectedItemIds.clear();
diff --git a/app/static/js/resource-lists/corpus-follower-list.js b/app/static/js/resource-lists/corpus-follower-list.js
index d56364675012236f30105aeb5c2a209b6b550981..ad7154dc3310087c30d732331835dd616131bf34 100644
--- a/app/static/js/resource-lists/corpus-follower-list.js
+++ b/app/static/js/resource-lists/corpus-follower-list.js
@@ -1,4 +1,4 @@
-ResourceLists.CorpusFollowerList = class CorpusFollowerList extends ResourceLists.ResourceList {
+nopaque.resource_lists.CorpusFollowerList = class CorpusFollowerList extends nopaque.resource_lists.ResourceList {
   static htmlClass = 'corpus-follower-list';
 
   constructor(listContainerElement, options = {}) {
@@ -68,9 +68,9 @@ ResourceLists.CorpusFollowerList = class CorpusFollowerList extends ResourceList
 
   initListContainerElement() {
     if (!this.listContainerElement.hasAttribute('id')) {
-      this.listContainerElement.id = Utils.generateElementId('corpus-follower-list-');
+      this.listContainerElement.id = nopaque.Utils.generateElementId('corpus-follower-list-');
     }
-    let listSearchElementId = Utils.generateElementId(`${this.listContainerElement.id}-search-`);
+    let listSearchElementId = nopaque.Utils.generateElementId(`${this.listContainerElement.id}-search-`);
     this.listContainerElement.innerHTML = `
       <div class="input-field">
         <i class="material-icons prefix">search</i>
@@ -120,7 +120,7 @@ ResourceLists.CorpusFollowerList = class CorpusFollowerList extends ResourceList
       case 'update-role': {
         let followerId = listItemElement.dataset.followerId;
         let roleName = event.target.value;
-        Requests.corpora.entity.followers.entity.role.update(this.corpusId, followerId, roleName);
+        nopaque.requests.corpora.entity.followers.entity.role.update(this.corpusId, followerId, roleName);
         break;
       }
       default: {
@@ -140,12 +140,12 @@ ResourceLists.CorpusFollowerList = class CorpusFollowerList extends ResourceList
       case 'unfollow-request': {
         let followerId = listItemElement.dataset.followerId;
         if (currentUserId != this.userId) {
-          Requests.corpora.entity.followers.entity.delete(this.corpusId, followerId)
+          nopaque.requests.corpora.entity.followers.entity.delete(this.corpusId, followerId)
             .then(() => {
               window.location.reload();
             });
         } else {
-          Requests.corpora.entity.followers.entity.delete(this.corpusId, followerId);
+          nopaque.requests.corpora.entity.followers.entity.delete(this.corpusId, followerId);
         }
         break;
       }
diff --git a/app/static/js/resource-lists/corpus-list.js b/app/static/js/resource-lists/corpus-list.js
index f4289d8b9e8d0fa619ff2bd0b22ec469207c17f7..989cd17f1a344ffe67fb6a6dc6ecbd3406ea8935 100644
--- a/app/static/js/resource-lists/corpus-list.js
+++ b/app/static/js/resource-lists/corpus-list.js
@@ -1,4 +1,4 @@
-ResourceLists.CorpusList = class CorpusList extends ResourceLists.ResourceList {
+nopaque.resource_lists.CorpusList = class CorpusList extends nopaque.resource_lists.ResourceList {
   static htmlClass = 'corpus-list';
 
   constructor(listContainerElement, options = {}) {
@@ -93,9 +93,9 @@ ResourceLists.CorpusList = class CorpusList extends ResourceLists.ResourceList {
 
   initListContainerElement() {
     if (!this.listContainerElement.hasAttribute('id')) {
-      this.listContainerElement.id = Utils.generateElementId('corpus-list-');
+      this.listContainerElement.id = nopaque.Utils.generateElementId('corpus-list-');
     }
-    let listSearchElementId = Utils.generateElementId(`${this.listContainerElement.id}-search-`);
+    let listSearchElementId = nopaque.Utils.generateElementId(`${this.listContainerElement.id}-search-`);
     this.listContainerElement.innerHTML = `
       <div class="input-field">
         <i class="material-icons prefix">search</i>
@@ -139,7 +139,7 @@ ResourceLists.CorpusList = class CorpusList extends ResourceLists.ResourceList {
     switch (listAction) {
       case 'delete-request': {
         let values = this.listjs.get('id', itemId)[0].values();
-        let modalElement = Utils.HTMLToElement(
+        let modalElement = nopaque.Utils.HTMLToElement(
           `
             <div class="modal">
               <div class="modal-content">
@@ -167,12 +167,12 @@ ResourceLists.CorpusList = class CorpusList extends ResourceLists.ResourceList {
         let confirmElement = modalElement.querySelector('.action-button[data-action="confirm"]');
         confirmElement.addEventListener('click', (event) => {
           if (!values['is-owner']) {
-            Requests.corpora.entity.followers.entity.delete(itemId, currentUserId)
+            nopaque.requests.corpora.entity.followers.entity.delete(itemId, currentUserId)
               .then((response) => {
                 window.location.reload();
               });
           } else {
-            Requests.corpora.entity.delete(itemId);
+            nopaque.requests.corpora.entity.delete(itemId);
           }
         });
         modal.open();
@@ -224,7 +224,7 @@ ResourceLists.CorpusList = class CorpusList extends ResourceLists.ResourceList {
         // Saved for future use:
         // <p class="hide">Do you really want to unfollow this Corpora?</p>
         // <ul id="selected-unfollow-items-list"></ul>
-        let modalElement = Utils.HTMLToElement(
+        let modalElement = nopaque.Utils.HTMLToElement(
           `
             <div class="modal">
               <div class="modal-content">
@@ -245,7 +245,7 @@ ResourceLists.CorpusList = class CorpusList extends ResourceLists.ResourceList {
         this.selectedItemIds.forEach(selectedItemId => {
           let listItem = this.listjs.get('id', selectedItemId)[0].elm;
           let values = this.listjs.get('id', listItem.dataset.id)[0].values();
-          let itemElement = Utils.HTMLToElement(`<li> - ${values.title}</li>`);
+          let itemElement = nopaque.Utils.HTMLToElement(`<li> - ${values.title}</li>`);
           // if (!values['is-owner']) { 
           //   itemUnfollowList.appendChild(itemElement);
           // } else {
@@ -268,9 +268,9 @@ ResourceLists.CorpusList = class CorpusList extends ResourceLists.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']) {
-              Requests.corpora.entity.delete(selectedItemId);
+              nopaque.requests.corpora.entity.delete(selectedItemId);
             } else {
-              Requests.corpora.entity.followers.entity.delete(selectedItemId, currentUserId);
+              nopaque.requests.corpora.entity.followers.entity.delete(selectedItemId, currentUserId);
               setTimeout(() => {
                 window.location.reload();
               }, 1000);
diff --git a/app/static/js/resource-lists/corpus-text-info-list.js b/app/static/js/resource-lists/corpus-text-info-list.js
index e24502a0f5188f1938cda7ca582a4f29e42c23c4..9b6c4805cf60f5c2b497b964be7a9d41acf706d1 100644
--- a/app/static/js/resource-lists/corpus-text-info-list.js
+++ b/app/static/js/resource-lists/corpus-text-info-list.js
@@ -1,4 +1,4 @@
-ResourceLists.CorpusTextInfoList = class CorpusTextInfoList extends ResourceLists.ResourceList {
+nopaque.resource_lists.CorpusTextInfoList = class CorpusTextInfoList extends nopaque.resource_lists.ResourceList {
   static htmlClass = 'corpus-text-info-list';
 
   static defaultOptions = {
@@ -6,8 +6,8 @@ ResourceLists.CorpusTextInfoList = class CorpusTextInfoList extends ResourceList
   };
 
   constructor(listContainerElement, options = {}) {
-    let _options = Utils.mergeObjectsDeep(
-      ResourceLists.CorpusTextInfoList.defaultOptions,
+    let _options = nopaque.Utils.mergeObjectsDeep(
+      nopaque.resource_lists.CorpusTextInfoList.defaultOptions,
       options
     );
     super(listContainerElement, _options);
@@ -49,9 +49,9 @@ ResourceLists.CorpusTextInfoList = class CorpusTextInfoList extends ResourceList
 
   initListContainerElement() {
     if (!this.listContainerElement.hasAttribute('id')) {
-      this.listContainerElement.id = Utils.generateElementId('corpus-file-list-');
+      this.listContainerElement.id = nopaque.Utils.generateElementId('corpus-file-list-');
     }
-    let listSearchElementId = Utils.generateElementId(`${this.listContainerElement.id}-search-`);
+    let listSearchElementId = nopaque.Utils.generateElementId(`${this.listContainerElement.id}-search-`);
     this.listContainerElement.innerHTML = `
       <div class="input-field">
         <i class="material-icons prefix">search</i>
diff --git a/app/static/js/resource-lists/corpus-token-list.js b/app/static/js/resource-lists/corpus-token-list.js
index eddd82ea35f0c1c44745fc84d4ddf3fe73202ac6..3819fd742556335e10f978854108b4b4811f5cd5 100644
--- a/app/static/js/resource-lists/corpus-token-list.js
+++ b/app/static/js/resource-lists/corpus-token-list.js
@@ -1,4 +1,4 @@
-ResourceLists.CorpusTokenList = class CorpusTokenList extends ResourceLists.ResourceList {
+nopaque.resource_lists.CorpusTokenList = class CorpusTokenList extends nopaque.resource_lists.ResourceList {
   static htmlClass = 'corpus-token-list';
 
   static defaultOptions = {
@@ -6,8 +6,8 @@ ResourceLists.CorpusTokenList = class CorpusTokenList extends ResourceLists.Reso
   };
 
   constructor(listContainerElement, options = {}) {
-    let _options = Utils.mergeObjectsDeep(
-      ResourceLists.CorpusTokenList.defaultOptions,
+    let _options = nopaque.Utils.mergeObjectsDeep(
+      nopaque.resource_lists.CorpusTokenList.defaultOptions,
       options
     );
     super(listContainerElement, _options);
@@ -72,9 +72,9 @@ ResourceLists.CorpusTokenList = class CorpusTokenList extends ResourceLists.Reso
 
   initListContainerElement() {
     if (!this.listContainerElement.hasAttribute('id')) {
-      this.listContainerElement.id = Utils.generateElementId('corpus-token-list-');
+      this.listContainerElement.id = nopaque.Utils.generateElementId('corpus-token-list-');
     }
-    let listSearchElementId = Utils.generateElementId(`${this.listContainerElement.id}-search-`);
+    let listSearchElementId = nopaque.Utils.generateElementId(`${this.listContainerElement.id}-search-`);
     this.listContainerElement.innerHTML = `
       <div class="input-field">
         <i class="material-icons prefix">search</i>
diff --git a/app/static/js/resource-lists/detailed-public-corpus-list.js b/app/static/js/resource-lists/detailed-public-corpus-list.js
index e855e07b6c926811aeb5122668ea8a4dc127f958..c4376ae68f9edc7076d86e72b0f55f9bd6a88243 100644
--- a/app/static/js/resource-lists/detailed-public-corpus-list.js
+++ b/app/static/js/resource-lists/detailed-public-corpus-list.js
@@ -1,4 +1,4 @@
-ResourceLists.DetailedPublicCorpusList = class DetailedPublicCorpusList extends ResourceLists.ResourceList {
+nopaque.resource_lists.DetailedPublicCorpusList = class DetailedPublicCorpusList extends nopaque.resource_lists.ResourceList {
   static htmlClass = 'detailed-public-corpus-list';
 
   get item() {
@@ -32,9 +32,9 @@ ResourceLists.DetailedPublicCorpusList = class DetailedPublicCorpusList extends
 
   initListContainerElement() {
     if (!this.listContainerElement.hasAttribute('id')) {
-      this.listContainerElement.id = Utils.generateElementId('corpus-list-');
+      this.listContainerElement.id = nopaque.Utils.generateElementId('corpus-list-');
     }
-    let listSearchElementId = Utils.generateElementId(`${this.listContainerElement.id}-search-`);
+    let listSearchElementId = nopaque.Utils.generateElementId(`${this.listContainerElement.id}-search-`);
     this.listContainerElement.innerHTML = `
       <div class="input-field">
         <i class="material-icons prefix">search</i>
diff --git a/app/static/js/resource-lists/index.js b/app/static/js/resource-lists/index.js
index 1683a6a5a92e811490b2cab2bb04744084f4e269..ebac02099481dd925ad04344c0f704d3f1926684 100644
--- a/app/static/js/resource-lists/index.js
+++ b/app/static/js/resource-lists/index.js
@@ -1,11 +1,11 @@
-var ResourceLists = {};
+nopaque.resource_lists = {};
 
-ResourceLists.AutoInit = () => {
-  for (let propertyName in ResourceLists) {
-    let property = ResourceLists[propertyName];
-    // Call autoInit of all properties that are subclasses of `ResourceLists.ResourceList`.
-    // This does not include `ResourceLists.ResourceList` itself.
-    if (property.prototype instanceof ResourceLists.ResourceList) {
+nopaque.resource_lists.AutoInit = () => {
+  for (let propertyName in nopaque.resource_lists) {
+    let property = nopaque.resource_lists[propertyName];
+    // Call autoInit of all properties that are subclasses of `nopaque.resource_lists.ResourceList`.
+    // This does not include `nopaque.resource_lists.ResourceList` itself.
+    if (property.prototype instanceof nopaque.resource_lists.ResourceList) {
       // Check if the static `htmlClass` property is defined.
       if (property.htmlClass === undefined) {return;}
       // Gather all HTML elements that have the `this.htmlClass` class
diff --git a/app/static/js/resource-lists/job-input-list.js b/app/static/js/resource-lists/job-input-list.js
index 609702b504799ba014ca39d5f3c988481d000af1..270c6d2d67e9c83628467ac263abbf7fc9ffcedc 100644
--- a/app/static/js/resource-lists/job-input-list.js
+++ b/app/static/js/resource-lists/job-input-list.js
@@ -1,4 +1,4 @@
-ResourceLists.JobInputList = class JobInputList extends ResourceLists.ResourceList {
+nopaque.resource_lists.JobInputList = class JobInputList extends nopaque.resource_lists.ResourceList {
   static htmlClass = 'job-input-list';
 
   constructor(listContainerElement, options = {}) {
@@ -36,9 +36,9 @@ ResourceLists.JobInputList = class JobInputList extends ResourceLists.ResourceLi
 
   initListContainerElement() {
     if (!this.listContainerElement.hasAttribute('id')) {
-      this.listContainerElement.id = Utils.generateElementId('job-input-list-');
+      this.listContainerElement.id = nopaque.Utils.generateElementId('job-input-list-');
     }
-    let listSearchElementId = Utils.generateElementId(`${this.listContainerElement.id}-search-`);
+    let listSearchElementId = nopaque.Utils.generateElementId(`${this.listContainerElement.id}-search-`);
     this.listContainerElement.innerHTML = `
       <div class="input-field">
         <i class="material-icons prefix">search</i>
diff --git a/app/static/js/resource-lists/job-list.js b/app/static/js/resource-lists/job-list.js
index c751e7052a7e23a0a925a36a75cf2981e4ce5aec..95140ef2adae0c442bbe663f827a72370c9b86ea 100644
--- a/app/static/js/resource-lists/job-list.js
+++ b/app/static/js/resource-lists/job-list.js
@@ -1,4 +1,4 @@
-ResourceLists.JobList = class JobList extends ResourceLists.ResourceList {
+nopaque.resource_lists.JobList = class JobList extends nopaque.resource_lists.ResourceList {
   static htmlClass = 'job-list';
 
   constructor(listContainerElement, options = {}) {
@@ -56,9 +56,9 @@ ResourceLists.JobList = class JobList extends ResourceLists.ResourceList {
 
   initListContainerElement() {
     if (!this.listContainerElement.hasAttribute('id')) {
-      this.listContainerElement.id = Utils.generateElementId('job-list-');
+      this.listContainerElement.id = nopaque.Utils.generateElementId('job-list-');
     }
-    let listSearchElementId = Utils.generateElementId(`${this.listContainerElement.id}-search-`);
+    let listSearchElementId = nopaque.Utils.generateElementId(`${this.listContainerElement.id}-search-`);
     this.listContainerElement.innerHTML = `
       <div class="input-field">
         <i class="material-icons prefix">search</i>
@@ -112,7 +112,7 @@ ResourceLists.JobList = class JobList extends ResourceLists.ResourceList {
     switch (listAction) {
       case 'delete-request': {
         let values = this.listjs.get('id', itemId)[0].values();
-        let modalElement = Utils.HTMLToElement(
+        let modalElement = nopaque.Utils.HTMLToElement(
           `
             <div class="modal">
               <div class="modal-content">
@@ -139,7 +139,7 @@ ResourceLists.JobList = class JobList extends ResourceLists.ResourceList {
         );
         let confirmElement = modalElement.querySelector('.action-button[data-action="confirm"]');
         confirmElement.addEventListener('click', (event) => {
-          Requests.jobs.entity.delete(itemId);
+          nopaque.requests.jobs.entity.delete(itemId);
         });
         modal.open();
         break;
@@ -187,7 +187,7 @@ ResourceLists.JobList = class JobList extends ResourceLists.ResourceList {
         break;
       }
       case 'delete': {
-        let modalElement = Utils.HTMLToElement(
+        let modalElement = nopaque.Utils.HTMLToElement(
           `
             <div class="modal">
               <div class="modal-content">
@@ -208,7 +208,7 @@ ResourceLists.JobList = class JobList extends ResourceLists.ResourceList {
         this.selectedItemIds.forEach(selectedItemId => {
           let listItem = this.listjs.get('id', selectedItemId)[0].elm;
           let values = this.listjs.get('id', listItem.dataset.id)[0].values();
-          let itemElement = Utils.HTMLToElement(`<li> - ${values.title}</li>`);
+          let itemElement = nopaque.Utils.HTMLToElement(`<li> - ${values.title}</li>`);
           itemList.appendChild(itemElement);
         });
         let modal = M.Modal.init(
@@ -224,7 +224,7 @@ ResourceLists.JobList = class JobList extends ResourceLists.ResourceList {
         let confirmElement = modalElement.querySelector('.action-button[data-action="confirm"]');
         confirmElement.addEventListener('click', (event) => {
           this.selectedItemIds.forEach(selectedItemId => {
-            Requests.jobs.entity.delete(selectedItemId);
+            nopaque.requests.jobs.entity.delete(selectedItemId);
           });
           this.selectedItemIds.clear();
           this.renderingItemSelection();
diff --git a/app/static/js/resource-lists/job-result-list.js b/app/static/js/resource-lists/job-result-list.js
index e71759a57a4ef35e099d4fc24d71b99de16c66bd..5736901575f54e6ace6befd3fd7f59ceddc40ebd 100644
--- a/app/static/js/resource-lists/job-result-list.js
+++ b/app/static/js/resource-lists/job-result-list.js
@@ -1,4 +1,4 @@
-ResourceLists.JobResultList = class JobResultList extends ResourceLists.ResourceList {
+nopaque.resource_lists.JobResultList = class JobResultList extends nopaque.resource_lists.ResourceList {
   static htmlClass = 'job-result-list';
 
   constructor(listContainerElement, options = {}) {
@@ -42,9 +42,9 @@ ResourceLists.JobResultList = class JobResultList extends ResourceLists.Resource
 
   initListContainerElement() {
     if (!this.listContainerElement.hasAttribute('id')) {
-      this.listContainerElement.id = Utils.generateElementId('job-result-list-');
+      this.listContainerElement.id = nopaque.Utils.generateElementId('job-result-list-');
     }
-    let listSearchElementId = Utils.generateElementId(`${this.listContainerElement.id}-search-`);
+    let listSearchElementId = nopaque.Utils.generateElementId(`${this.listContainerElement.id}-search-`);
     this.listContainerElement.innerHTML = `
       <div class="input-field">
         <i class="material-icons prefix">search</i>
diff --git a/app/static/js/resource-lists/public-corpus-list.js b/app/static/js/resource-lists/public-corpus-list.js
index 71eb4fbd8ddd986d1505da132ee6a2c6d661616f..a7ee6b3829927e4bd82f6fdd709ed84b12eb228f 100644
--- a/app/static/js/resource-lists/public-corpus-list.js
+++ b/app/static/js/resource-lists/public-corpus-list.js
@@ -1,4 +1,4 @@
-ResourceLists.PublicCorpusList = class PublicCorpusList extends ResourceLists.ResourceList {
+nopaque.resource_lists.PublicCorpusList = class PublicCorpusList extends nopaque.resource_lists.ResourceList {
   static htmlClass = 'public-corpus-list';
 
   constructor(listContainerElement, options = {}) {
@@ -49,9 +49,9 @@ ResourceLists.PublicCorpusList = class PublicCorpusList extends ResourceLists.Re
 
   initListContainerElement() {
     if (!this.listContainerElement.hasAttribute('id')) {
-      this.listContainerElement.id = Utils.generateElementId('corpus-list-');
+      this.listContainerElement.id = nopaque.Utils.generateElementId('corpus-list-');
     }
-    let listSearchElementId = Utils.generateElementId(`${this.listContainerElement.id}-search-`);
+    let listSearchElementId = nopaque.Utils.generateElementId(`${this.listContainerElement.id}-search-`);
     this.listContainerElement.innerHTML = `
       <div class="input-field">
         <i class="material-icons prefix">search</i>
diff --git a/app/static/js/resource-lists/public-user-list.js b/app/static/js/resource-lists/public-user-list.js
index cc56604a4486d05d6d4c0600877461ea5e28fe2b..707e07bd11469739d6125fd1dab867da64b7cfc6 100644
--- a/app/static/js/resource-lists/public-user-list.js
+++ b/app/static/js/resource-lists/public-user-list.js
@@ -1,4 +1,4 @@
-ResourceLists.PublicUserList = class PublicUserList extends ResourceLists.ResourceList {
+nopaque.resource_lists.PublicUserList = class PublicUserList extends nopaque.resource_lists.ResourceList {
   static htmlClass = 'public-user-list';
 
   constructor(listContainerElement, options = {}) {
@@ -37,9 +37,9 @@ ResourceLists.PublicUserList = class PublicUserList extends ResourceLists.Resour
 
   initListContainerElement() {
     if (!this.listContainerElement.hasAttribute('id')) {
-      this.listContainerElement.id = Utils.generateElementId('user-list-');
+      this.listContainerElement.id = nopaque.Utils.generateElementId('user-list-');
     }
-    let listSearchElementId = Utils.generateElementId(`${this.listContainerElement.id}-search-`);
+    let listSearchElementId = nopaque.Utils.generateElementId(`${this.listContainerElement.id}-search-`);
     this.listContainerElement.innerHTML = `
       <div class="input-field">
         <i class="material-icons prefix">search</i>
diff --git a/app/static/js/resource-lists/resource-list.js b/app/static/js/resource-lists/resource-list.js
index ba71f03f0685b0ed750a16c7d2ace85bbaf3e035..233628c3bb2ba7b9cf33720997093ccf195e8809 100644
--- a/app/static/js/resource-lists/resource-list.js
+++ b/app/static/js/resource-lists/resource-list.js
@@ -1,4 +1,4 @@
-ResourceLists.ResourceList = class ResourceList {
+nopaque.resource_lists.ResourceList = class ResourceList {
   /* A wrapper class for the list.js list.
    * This class is not meant to be used directly, instead it should be used as
    * a base class for concrete resource list implementations.
@@ -21,9 +21,9 @@ ResourceLists.ResourceList = class ResourceList {
     if ('valueNames' in options) {
       throw '"valueNames" is not supported as an option, define it as a getter in the list class';
     }
-    let _options = Utils.mergeObjectsDeep(
+    let _options = nopaque.Utils.mergeObjectsDeep(
       {item: this.item, valueNames: this.valueNames},
-      ResourceLists.ResourceList.defaultOptions,
+      nopaque.resource_lists.ResourceList.defaultOptions,
       options
     );
     this.listContainerElement = listContainerElement;
diff --git a/app/static/js/resource-lists/spacy-nlp-pipeline-model-list.js b/app/static/js/resource-lists/spacy-nlp-pipeline-model-list.js
index 195fa60c3a57e498418b4a541406b27359c35e85..b41795c1bd88c44824d32da7c05263715048144c 100644
--- a/app/static/js/resource-lists/spacy-nlp-pipeline-model-list.js
+++ b/app/static/js/resource-lists/spacy-nlp-pipeline-model-list.js
@@ -1,4 +1,4 @@
-ResourceLists.SpaCyNLPPipelineModelList = class SpaCyNLPPipelineModelList extends ResourceLists.ResourceList {
+nopaque.resource_lists.SpaCyNLPPipelineModelList = class SpaCyNLPPipelineModelList extends nopaque.resource_lists.ResourceList {
   static htmlClass = 'spacy-nlp-pipeline-model-list';
 
   constructor(listContainerElement, options = {}) {
@@ -60,9 +60,9 @@ ResourceLists.SpaCyNLPPipelineModelList = class SpaCyNLPPipelineModelList extend
 
   initListContainerElement() {
     if (!this.listContainerElement.hasAttribute('id')) {
-      this.listContainerElement.id = Utils.generateElementId('spacy-nlp-pipeline-model-list-');
+      this.listContainerElement.id = nopaque.Utils.generateElementId('spacy-nlp-pipeline-model-list-');
     }
-    let listSearchElementId = Utils.generateElementId(`${this.listContainerElement.id}-search-`);
+    let listSearchElementId = nopaque.Utils.generateElementId(`${this.listContainerElement.id}-search-`);
     this.listContainerElement.innerHTML = `
       <div class="input-field">
         <i class="material-icons prefix">search</i>
@@ -116,7 +116,7 @@ ResourceLists.SpaCyNLPPipelineModelList = class SpaCyNLPPipelineModelList extend
     switch (listAction) {
       case 'toggle-is-public': {
         let newIsPublicValue = listActionElement.checked;
-        Requests.contributions.spacy_nlp_pipeline_models.entity.isPublic.update(itemId, newIsPublicValue)
+        nopaque.requests.contributions.spacy_nlp_pipeline_models.entity.isPublic.update(itemId, newIsPublicValue)
           .catch((response) => {
             listActionElement.checked = !newIsPublicValue;
           });
@@ -138,7 +138,7 @@ ResourceLists.SpaCyNLPPipelineModelList = class SpaCyNLPPipelineModelList extend
     switch (listAction) {
       case 'delete-request': {
         let values = this.listjs.get('id', itemId)[0].values();
-        let modalElement = Utils.HTMLToElement(
+        let modalElement = nopaque.Utils.HTMLToElement(
           `
             <div class="modal">
               <div class="modal-content">
@@ -165,7 +165,7 @@ ResourceLists.SpaCyNLPPipelineModelList = class SpaCyNLPPipelineModelList extend
         );
         let confirmElement = modalElement.querySelector('.action-button[data-action="confirm"]');
         confirmElement.addEventListener('click', (event) => {
-          Requests.contributions.spacy_nlp_pipeline_models.entity.delete(itemId);
+          nopaque.requests.contributions.spacy_nlp_pipeline_models.entity.delete(itemId);
         });
         modal.open();
         break;
diff --git a/app/static/js/resource-lists/tesseract-ocr-pipeline-model-list.js b/app/static/js/resource-lists/tesseract-ocr-pipeline-model-list.js
index 975bfe5cc598a769d6fd2f0fba190e63f1fbd55d..5019d3da8828353bcf7538c961e0dabe48c92ae7 100644
--- a/app/static/js/resource-lists/tesseract-ocr-pipeline-model-list.js
+++ b/app/static/js/resource-lists/tesseract-ocr-pipeline-model-list.js
@@ -1,4 +1,4 @@
-ResourceLists.TesseractOCRPipelineModelList = class TesseractOCRPipelineModelList extends ResourceLists.ResourceList {
+nopaque.resource_lists.TesseractOCRPipelineModelList = class TesseractOCRPipelineModelList extends nopaque.resource_lists.ResourceList {
   static htmlClass = 'tesseract-ocr-pipeline-model-list';
 
   constructor(listContainerElement, options = {}) {
@@ -69,9 +69,9 @@ ResourceLists.TesseractOCRPipelineModelList = class TesseractOCRPipelineModelLis
 
   initListContainerElement() {
     if (!this.listContainerElement.hasAttribute('id')) {
-      this.listContainerElement.id = Utils.generateElementId('tesseract-ocr-pipeline-model-list-');
+      this.listContainerElement.id = nopaque.Utils.generateElementId('tesseract-ocr-pipeline-model-list-');
     }
-    let listSearchElementId = Utils.generateElementId(`${this.listContainerElement.id}-search-`);
+    let listSearchElementId = nopaque.Utils.generateElementId(`${this.listContainerElement.id}-search-`);
     this.listContainerElement.innerHTML = `
       <div class="input-field">
         <i class="material-icons prefix">search</i>
@@ -125,7 +125,7 @@ ResourceLists.TesseractOCRPipelineModelList = class TesseractOCRPipelineModelLis
     switch (listAction) {
       case 'toggle-is-public': {
         let newIsPublicValue = listActionElement.checked;
-        Requests.contributions.tesseract_ocr_pipeline_models.entity.isPublic.update(itemId, newIsPublicValue)
+        nopaque.requests.contributions.tesseract_ocr_pipeline_models.entity.isPublic.update(itemId, newIsPublicValue)
           .catch((response) => {
             listActionElement.checked = !newIsPublicValue;
           });
@@ -147,7 +147,7 @@ ResourceLists.TesseractOCRPipelineModelList = class TesseractOCRPipelineModelLis
     switch (listAction) {
       case 'delete-request': {
         let values = this.listjs.get('id', itemId)[0].values();
-        let modalElement = Utils.HTMLToElement(
+        let modalElement = nopaque.Utils.HTMLToElement(
           `
             <div class="modal">
               <div class="modal-content">
@@ -174,7 +174,7 @@ ResourceLists.TesseractOCRPipelineModelList = class TesseractOCRPipelineModelLis
         );
         let confirmElement = modalElement.querySelector('.action-button[data-action="confirm"]');
         confirmElement.addEventListener('click', (event) => {
-          Requests.contributions.tesseract_ocr_pipeline_models.entity.delete(itemId);
+          nopaque.requests.contributions.tesseract_ocr_pipeline_models.entity.delete(itemId);
         });
         modal.open();
         break;
diff --git a/app/static/js/utils.js b/app/static/js/utils.js
new file mode 100644
index 0000000000000000000000000000000000000000..b73345992d3756ccff1299fbebd24b21256d21d4
--- /dev/null
+++ b/app/static/js/utils.js
@@ -0,0 +1,91 @@
+nopaque.Utils = class Utils {
+  static escape(text) {
+    // https://codereview.stackexchange.com/a/126722
+    let lookup = {
+      '<': 'lt',
+      '>': 'gt',
+      '"': 'quot',
+      '\'': 'apos',
+      '&': 'amp',
+      '\r': '#10',
+      '\n': '#13'
+    };
+
+    return text.toString().replace(/[<>"'\r\n&]/g, (chr) => {
+      return '&' + lookup[chr] + ';';
+    });
+  }
+
+  static unescape(escapedText) {
+    let lookup = {
+      'lt': '<',
+      'gt': '>',
+      'quot': '"',
+      'apos': "'",
+      'amp': '&',
+      '#10': '\r',
+      '#13': '\n'
+    };
+    
+    return escapedText.replace(/&(#?\w+);/g, (match, entity) => {
+      if (lookup.hasOwnProperty(entity)) {
+        return lookup[entity];
+      }
+      
+      return match;
+    });
+  }
+
+  static HTMLToElement(HTMLString) {
+    let templateElement = document.createElement('template');
+    templateElement.innerHTML = HTMLString.trim();
+    return templateElement.content.firstChild;
+  }
+
+  static generateElementId(prefix='', suffix='') {
+    for (let i = 0; true; i++) {
+      if (document.querySelector(`#${prefix}${i}${suffix}`) !== null) {continue;}
+      return `${prefix}${i}${suffix}`;
+    }
+  }
+
+  static isObject(object) {
+    return object !== null && typeof object === 'object' && !Array.isArray(object);
+  }
+
+  static mergeObjectsDeep(...objects) {
+    let mergedObject = {};
+    if (objects.length === 0) {
+      return mergedObject;
+    }
+    if (!this.isObject(objects[0])) {throw 'Cannot merge non-object';}
+    if (objects.length === 1) {
+      return this.mergeObjectsDeep(mergedObject, objects[0]);
+    }
+    if (!this.isObject(objects[1])) {throw 'Cannot merge non-object';}
+    for (let key in objects[0]) {
+      if (objects[0].hasOwnProperty(key)) {
+        if (objects[1].hasOwnProperty(key)) {
+          if (this.isObject(objects[0][key]) && this.isObject(objects[1][key])) {
+            mergedObject[key] = this.mergeObjectsDeep(objects[0][key], objects[1][key]);
+          } else {
+            mergedObject[key] = objects[1][key];
+          }
+        } else {
+          mergedObject[key] = objects[0][key];
+        }
+      }
+    }
+    for (let key in objects[1]) {
+      if (objects[1].hasOwnProperty(key)) {
+        if (!objects[0].hasOwnProperty(key)) {
+          mergedObject[key] = objects[1][key];
+        }
+      }
+    }
+    if (objects.length === 2) {
+      return mergedObject;
+    }
+    return this.mergeObjectsDeep(mergedObject, ...objects.slice(2));
+  }
+}
diff --git a/app/static/js/utils/index.js b/app/static/js/utils/index.js
deleted file mode 100644
index 39d693f5495c21de9d1d2bae22d9a7669b9c39bd..0000000000000000000000000000000000000000
--- a/app/static/js/utils/index.js
+++ /dev/null
@@ -1 +0,0 @@
-Utils = {};
diff --git a/app/static/js/utils/utils.js b/app/static/js/utils/utils.js
deleted file mode 100644
index 17dcde056fd9204e4d66ac0460492bda560e2f4f..0000000000000000000000000000000000000000
--- a/app/static/js/utils/utils.js
+++ /dev/null
@@ -1,89 +0,0 @@
-Utils.escape = (text) => {
-  // https://codereview.stackexchange.com/a/126722
-  var table = {
-    '<': 'lt',
-    '>': 'gt',
-    '"': 'quot',
-    '\'': 'apos',
-    '&': 'amp',
-    '\r': '#10',
-    '\n': '#13'
-  };
-  
-  return text.toString().replace(/[<>"'\r\n&]/g, (chr) => {
-    return '&' + table[chr] + ';';
-  });
-};
-
-Utils.unescape = (escapedText) => {
-  var table = {
-    'lt': '<',
-    'gt': '>',
-    'quot': '"',
-    'apos': "'",
-    'amp': '&',
-    '#10': '\r',
-    '#13': '\n'
-  };
-  
-  return escapedText.replace(/&(#?\w+);/g, (match, entity) => {
-    if (table.hasOwnProperty(entity)) {
-      return table[entity];
-    }
-    
-    return match;
-  });
-};
-
-Utils.HTMLToElement = (HTMLString) => {
-  let templateElement = document.createElement('template');
-  templateElement.innerHTML = HTMLString.trim();
-  return templateElement.content.firstChild;
-};
-
-Utils.generateElementId = (prefix='', suffix='') => {
-  for (let i = 0; true; i++) {
-    if (document.querySelector(`#${prefix}${i}${suffix}`) !== null) {continue;}
-    return `${prefix}${i}${suffix}`;
-  }
-};
-
-Utils.isObject = (object) => {
-  return object !== null && typeof object === 'object' && !Array.isArray(object);
-};
-
-Utils.mergeObjectsDeep = (...objects) => {
-  let mergedObject = {};
-  if (objects.length === 0) {
-    return mergedObject;
-  }
-  if (!Utils.isObject(objects[0])) {throw 'Cannot merge non-object';}
-  if (objects.length === 1) {
-    return Utils.mergeObjectsDeep(mergedObject, objects[0]);
-  }
-  if (!Utils.isObject(objects[1])) {throw 'Cannot merge non-object';}
-  for (let key in objects[0]) {
-    if (objects[0].hasOwnProperty(key)) {
-      if (objects[1].hasOwnProperty(key)) {
-        if (Utils.isObject(objects[0][key]) && Utils.isObject(objects[1][key])) {
-          mergedObject[key] = Utils.mergeObjectsDeep(objects[0][key], objects[1][key]);
-        } else {
-          mergedObject[key] = objects[1][key];
-        }
-      } else {
-        mergedObject[key] = objects[0][key];
-      }
-    }
-  }
-  for (let key in objects[1]) {
-    if (objects[1].hasOwnProperty(key)) {
-      if (!objects[0].hasOwnProperty(key)) {
-        mergedObject[key] = objects[1][key];
-      }
-    }
-  }
-  if (objects.length === 2) {
-    return mergedObject;
-  }
-  return Utils.mergeObjectsDeep(mergedObject, ...objects.slice(2));
-};
diff --git a/app/templates/_scripts.html.j2 b/app/templates/_scripts.html.j2
index 9683485dca1eb054085edb242af4b475a0e534b1..b4f362a44af7654bea216cf4725f2cdb3f49d644 100644
--- a/app/templates/_scripts.html.j2
+++ b/app/templates/_scripts.html.j2
@@ -7,17 +7,9 @@
 {%- assets
   filters='rjsmin',
   output='gen/app.%(version)s.js',
-  'js/nopaque/index.js',
-  'js/nopaque/app.js'
-%}
-<script src="{{ ASSET_URL }}"></script>
-{%- endassets %}
-
-{%- assets
-  filters='rjsmin',
-  output='gen/utils.%(version)s.js',
-  'js/utils/index.js',
-  'js/utils/utils.js'
+  'js/index.js',
+  'js/app.js',
+  'js/utils.js'
 %}
 <script src="{{ ASSET_URL }}"></script>
 {%- endassets %}
diff --git a/app/templates/admin/user_settings.html.j2 b/app/templates/admin/user_settings.html.j2
index fb022564b9cfc357c1ffea3f8d050a7f03e98ef6..17fdc151f1fff920cb5d6bed7b37ba7acf510b0b 100644
--- a/app/templates/admin/user_settings.html.j2
+++ b/app/templates/admin/user_settings.html.j2
@@ -57,7 +57,7 @@
 let userConfirmedSwitchElement = document.querySelector('#user-confirmed-switch');
 userConfirmedSwitchElement.addEventListener('change', (event) => {
   let newConfirmed = userConfirmedSwitchElement.checked;
-  Requests.admin.users.entity.confirmed.update({{ user.hashid|tojson }}, newConfirmed)
+  nopaque.requests.admin.users.entity.confirmed.update({{ user.hashid|tojson }}, newConfirmed)
     .catch((response) => {
       userConfirmedSwitchElement.checked = !userConfirmedSwitchElement;
     });
diff --git a/app/templates/corpora/corpus.html.j2 b/app/templates/corpora/corpus.html.j2
index 978b87bb7678722ebe47177640895859de9fe5a7..b01331699636d27ef6ff1b89e5890b9f24e7fd93 100644
--- a/app/templates/corpora/corpus.html.j2
+++ b/app/templates/corpora/corpus.html.j2
@@ -240,7 +240,7 @@
 {% if current_user.is_following_corpus(corpus) %}
   let unfollowRequestElement = document.querySelector('.action-button[data-action="unfollow-request"]');
   unfollowRequestElement.addEventListener('click', () => {
-    Requests.corpora.entity.followers.entity.delete({{ corpus.hashid|tojson }}, {{ current_user.hashid|tojson }})
+    nopaque.requests.corpora.entity.followers.entity.delete({{ corpus.hashid|tojson }}, {{ current_user.hashid|tojson }})
       .then((response) => {
         window.location.reload();
       });
@@ -252,7 +252,7 @@
 let publishingModalIsPublicSwitchElement = document.querySelector('#publishing-modal-is-public-switch');
 publishingModalIsPublicSwitchElement.addEventListener('change', (event) => {
   let newIsPublic = publishingModalIsPublicSwitchElement.checked;
-  Requests.corpora.entity.isPublic.update({{ corpus.hashid|tojson }}, newIsPublic)
+  nopaque.requests.corpora.entity.isPublic.update({{ corpus.hashid|tojson }}, newIsPublic)
     .catch((response) => {
       publishingModalIsPublicSwitchElement.checked = !newIsPublic;
     });
@@ -262,7 +262,7 @@ publishingModalIsPublicSwitchElement.addEventListener('change', (event) => {
 // #region Delete
 let deleteModalDeleteButtonElement = document.querySelector('#delete-modal-delete-button');
 deleteModalDeleteButtonElement.addEventListener('click', (event) => {
-  Requests.corpora.entity.delete({{ corpus.hashid|tojson }})
+  nopaque.requests.corpora.entity.delete({{ corpus.hashid|tojson }})
     .then((response) => {
       window.location.href = {{ url_for('main.dashboard')|tojson }};
     });
@@ -312,7 +312,7 @@ M.Modal.init(
 
 inviteUserModalInviteButtonElement.addEventListener('click', (event) => {
   let usernames = inviteUserModalSearch.chipsData.map((chipData) => chipData.tag);
-  Requests.corpora.entity.followers.add({{ corpus.hashid|tojson }}, usernames);
+  nopaque.requests.corpora.entity.followers.add({{ corpus.hashid|tojson }}, usernames);
 });
 // #endregion Invite user
 
@@ -357,7 +357,7 @@ M.Modal.init(
 shareLinkModalCreateButtonElement.addEventListener('click', (event) => {
   let role = shareLinkModalCorpusFollowerRoleSelectElement.value;
   let expiration = shareLinkModalExpirationDateDatepickerElement.value
-  Requests.corpora.entity.generateShareLink({{ corpus.hashid|tojson }}, role, expiration)
+  nopaque.requests.corpora.entity.generateShareLink({{ corpus.hashid|tojson }}, role, expiration)
     .then((response) => {
       response.json()
         .then((json) => {
diff --git a/app/templates/users/settings/settings.html.j2 b/app/templates/users/settings/settings.html.j2
index 4e52344a396c6bb483f3870c3f254f390b149df8..34fa4f791f1eae8f4638da597868b14bf21e27f4 100644
--- a/app/templates/users/settings/settings.html.j2
+++ b/app/templates/users/settings/settings.html.j2
@@ -221,7 +221,7 @@ avatarUploadElement.addEventListener('change', () => {
 });
 
 document.querySelector('#delete-avatar').addEventListener('click', () => {
-  Requests.users.entity.avatar.delete({{ user.hashid|tojson }})
+  nopaque.requests.users.entity.avatar.delete({{ user.hashid|tojson }})
     .then(
       (response) => {
         avatarPreviewElement.src = {{ url_for('static', filename='images/user_avatar.png')|tojson }};
@@ -230,7 +230,7 @@ document.querySelector('#delete-avatar').addEventListener('click', () => {
 });
 
 document.querySelector('#delete-user').addEventListener('click', (event) => {
-  Requests.users.entity.delete({{ user.hashid|tojson }})
+  nopaque.requests.users.entity.delete({{ user.hashid|tojson }})
     .then((response) => {window.location.href = '/';});
 });
 
@@ -255,7 +255,7 @@ let profileIsPublicSwitchElement = document.querySelector('#profile-is-public-sw
 let profilePrivacySettingCheckboxElements = document.querySelectorAll('.profile-privacy-setting-checkbox');
 profileIsPublicSwitchElement.addEventListener('change', (event) => {
   let newEnabled = profileIsPublicSwitchElement.checked;
-  Requests.users.entity.settings.profilePrivacy.update({{ user.hashid|tojson }}, 'is-public', newEnabled)
+  nopaque.requests.users.entity.settings.profilePrivacy.update({{ user.hashid|tojson }}, 'is-public', newEnabled)
     .then(
       (response) => {
         for (let profilePrivacySettingCheckboxElement of document.querySelectorAll('.profile-privacy-setting-checkbox')) {
@@ -271,7 +271,7 @@ for (let profilePrivacySettingCheckboxElement of profilePrivacySettingCheckboxEl
   profilePrivacySettingCheckboxElement.addEventListener('change', (event) => {
     let newEnabled = profilePrivacySettingCheckboxElement.checked;
     let valueName = profilePrivacySettingCheckboxElement.dataset.profilePrivacySettingName;
-    Requests.users.entity.settings.profilePrivacy.update({{ user.hashid|tojson }}, valueName, newEnabled)
+    nopaque.requests.users.entity.settings.profilePrivacy.update({{ user.hashid|tojson }}, valueName, newEnabled)
       .catch((response) => {
         profilePrivacySettingCheckboxElement.checked = !newEnabled;
       });