diff --git a/app/static/js/nopaque.js b/app/static/js/nopaque.js
index b7d4e63daaf95ac5309fac0bd9e84ee67e6b03ee..bde7cb625475c63c923d26cd7f53988013cb3fcf 100644
--- a/app/static/js/nopaque.js
+++ b/app/static/js/nopaque.js
@@ -1,17 +1,32 @@
-var socket = io();
+var nopaque = {};
 
-var corpora;
-var corporaSubscribers = [];
-var jobs;
-var jobsSubscribers = [];
 
-var foreignCorpora;
-var foreignCorporaSubscribers = [];
-var foreignJobs;
-var foreignJobsSubscribers = [];
+// nopaque ressources
+nopaque["socket"] = io();
 
+nopaque["corpora"] = undefined;
+nopaque["corporaSubscribers"] = [];
+nopaque["jobs"] = undefined;
+nopaque["jobsSubscribers"] = [];
 
-function toast(message, color="") {
+nopaque["foreignCorpora"] = undefined;
+nopaque["foreignCorporaSubscribers"] = [];
+nopaque["foreignJobs"] = undefined;
+nopaque["foreignJobsSubscribers"] = [];
+
+
+// nopaque functions
+nopaque["navigation"] = {};
+nopaque["navigation"]["init"] = function() {
+  for (let entry of document.querySelectorAll("#slide-out a:not(.subheader)")) {
+    if (entry.href === window.location.href) {
+      entry.parentNode.classList.add("active");
+    }
+  }
+}
+
+
+nopaque["toast"] = function(message, color="") {
   var toast;
   var toastActionElement;
 
@@ -29,63 +44,64 @@ function toast(message, color="") {
 }
 
 
-socket.on('init-corpora', function(msg) {
-  corpora = JSON.parse(msg);
-  for (let subscriber of corporaSubscribers) {subscriber._init(corpora);}
+// socket event handlers
+nopaque.socket.on('init-corpora', function(msg) {
+  nopaque.corpora = JSON.parse(msg);
+  for (let subscriber of nopaque.corporaSubscribers) {subscriber._init(nopaque.corpora);}
 });
 
 
-socket.on('init-jobs', function(msg) {
-  jobs = JSON.parse(msg);
-  for (let subscriber of jobsSubscribers) {subscriber._init(jobs);}
+nopaque.socket.on('init-jobs', function(msg) {
+  nopaque.jobs = JSON.parse(msg);
+  for (let subscriber of nopaque.jobsSubscribers) {subscriber._init(nopaque.jobs);}
 });
 
 
-socket.on('update-corpora', function(msg) {
+nopaque.socket.on('update-corpora', function(msg) {
   var patch;
 
   patch = JSON.parse(msg);
-  corpora = jsonpatch.apply_patch(corpora, patch);
-  for (let subscriber of corporaSubscribers) {subscriber._update(patch);}
+  nopaque.corpora = jsonpatch.apply_patch(nopaque.corpora, patch);
+  for (let subscriber of nopaque.corporaSubscribers) {subscriber._update(patch);}
 });
 
 
-socket.on('update-jobs', function(msg) {
+nopaque.socket.on('update-jobs', function(msg) {
   var patch;
 
   patch = JSON.parse(msg);
-  jobs = jsonpatch.apply_patch(jobs, patch);
-  for (let subscriber of jobsSubscribers) {subscriber._update(patch);}
+  nopaque.jobs = jsonpatch.apply_patch(nopaque.jobs, patch);
+  for (let subscriber of nopaque.jobsSubscribers) {subscriber._update(patch);}
 });
 
 
-socket.on('init-foreign-corpora', function(msg) {
-  foreignCorpora = JSON.parse(msg);
-  for (let subscriber of foreignCorporaSubscribers) {subscriber._init(foreignCorpora);}
+nopaque.socket.on('init-foreign-corpora', function(msg) {
+  nopaque.foreignCorpora = JSON.parse(msg);
+  for (let subscriber of nopaque.foreignCorporaSubscribers) {subscriber._init(nopaque.foreignCorpora);}
 });
 
 
-socket.on('init-foreign-jobs', function(msg) {
-  foreignJobs = JSON.parse(msg);
-  for (let subscriber of foreignJobsSubscribers) {subscriber._init(foreignJobs);}
+nopaque.socket.on('init-foreign-jobs', function(msg) {
+  nopaque.foreignJobs = JSON.parse(msg);
+  for (let subscriber of nopaque.foreignJobsSubscribers) {subscriber._init(nopaque.foreignJobs);}
 });
 
 
-socket.on('update-foreign-corpora', function(msg) {
+nopaque.socket.on('update-foreign-corpora', function(msg) {
   var patch;
 
   patch = JSON.parse(msg);
-  foreignCorpora = jsonpatch.apply_patch(foreignCorpora, patch);
-  for (let subscriber of foreignCorporaSubscribers) {subscriber._update(patch);}
+  nopaque.foreignCorpora = jsonpatch.apply_patch(nopaque.foreignCorpora, patch);
+  for (let subscriber of nopaque.foreignCorporaSubscribers) {subscriber._update(patch);}
 });
 
 
-socket.on('update-foreign-jobs', function(msg) {
+nopaque.socket.on('update-foreign-jobs', function(msg) {
   var patch;
 
   patch = JSON.parse(msg);
-  foreignJobs = jsonpatch.apply_patch(foreignJobs, patch);
-  for (let subscriber of foreignJobsSubscribers) {subscriber._update(patch);}
+  nopaque.foreignJobs = jsonpatch.apply_patch(nopaque.foreignJobs, patch);
+  for (let subscriber of nopaque.foreignJobsSubscribers) {subscriber._update(patch);}
 });
 
 
@@ -96,10 +112,6 @@ document.addEventListener("DOMContentLoaded", function() {
                   {"alignment": "right", "constrainWidth": false, "coverTrigger": false});
   M.Dropdown.init(document.getElementById("nav-account"),
                   {"alignment": "right", "constrainWidth": false, "coverTrigger": false});
-  for (let entry of document.querySelectorAll("#slide-out a:not(.subheader)")) {
-    if (entry.href === window.location.href) {
-      entry.parentNode.classList.add("active");
-    }
-  }
-  socket.emit("subscribe_user_ressources");
+  nopaque.navigation.init();
+  nopaque.socket.emit("subscribe_user_ressources");
 });
diff --git a/app/templates/admin/index.html.j2 b/app/templates/admin/index.html.j2
index 7c0a96cd6ebaebe430fea63af8059b5542f8a608..95b40db62dd5b1ebba01d2955a171b0d4544b3e1 100644
--- a/app/templates/admin/index.html.j2
+++ b/app/templates/admin/index.html.j2
@@ -2,32 +2,27 @@
 
 {% block page_content %}
 <div class="col s12">
-  <div id="user-list">
-    <div class="card">
-      <div class="card-content">
-        <span class="card-title">User list</span>
-        <div class="input-field">
-          <i class="material-icons prefix">search</i>
-          <input id="search-user" class="search" type="text"></input>
-          <label for="search-user">Search user</label>
-        </div>
-        <ul class="pagination paginationTop"></ul>
-        {{ table }}
-        <ul class="pagination paginationBottom"></ul>
+  <div class="card">
+    <div class="card-content" id="users">
+      <span class="card-title">User list</span>
+      <div class="input-field">
+        <i class="material-icons prefix">search</i>
+        <input id="search-user" class="search" type="search"></input>
+        <label for="search-user">Search user</label>
       </div>
+      <ul class="pagination paginationTop"></ul>
+      {{ table }}
+      <ul class="pagination paginationBottom"></ul>
     </div>
   </div>
 </div>
 
 <script>
   var options = {page: 10,
-                 pagination: [{
-                               name: "paginationTop",
-                               paginationClass: "paginationTop",
-                             }, {
-                               paginationClass: "paginationBottom",
-                             }],
+                 pagination: [{name: "paginationTop",
+                               paginationClass: "paginationTop",},
+                              {paginationClass: "paginationBottom"}],
                  valueNames: ['username', 'email', 'role', 'confirmed', 'id']};
-  var userList = new List('user-list', options);
+  var userList = new List('users', options);
 </script>
 {% endblock %}
diff --git a/app/templates/admin/user.html.j2 b/app/templates/admin/user.html.j2
index d54fdd9e0cfb2bc459496beaa0be4de04afa26b8..8a3fd10c205ab1afaf922456f07afe215034a3ea 100644
--- a/app/templates/admin/user.html.j2
+++ b/app/templates/admin/user.html.j2
@@ -100,8 +100,8 @@
 
 
 <script>
-  var corpusList = new CorpusList("corpora", foreignCorporaSubscribers);
-  var jobList = new JobList("jobs", foreignJobsSubscribers);
-  socket.emit("subscribe_foreign_user_ressources", {{ user.id }});
+  var corpusList = new CorpusList("corpora", nopaque.foreignCorporaSubscribers);
+  var jobList = new JobList("jobs", nopaque.foreignJobsSubscribers);
+  nopaque.socket.emit("subscribe_foreign_user_ressources", {{ user.id }});
 </script>
 {% endblock %}
diff --git a/app/templates/corpora/analyse_corpus.html.j2 b/app/templates/corpora/analyse_corpus.html.j2
index 53ca4206f13a34ad9d5e02b6ad82ffa2d77b7ff0..9b20440c2051bc466f6eb43d780cc81296626514 100644
--- a/app/templates/corpora/analyse_corpus.html.j2
+++ b/app/templates/corpora/analyse_corpus.html.j2
@@ -181,18 +181,16 @@
   var loadingModal;
   document.addEventListener("DOMContentLoaded", function() {
     contextModal = M.Modal.init(document.getElementById("context-modal"),
-                                {"dismissible": true,
-                                 "onCloseEnd": function() {
+                                {"onCloseEnd": function() {
                                    document.getElementById("context-modal-loading").classList.remove("hide");
-                                   document.getElementById("context-modal-ready").classList.add("hide");}
-                                });
+                                   document.getElementById("context-modal-ready").classList.add("hide");}});
     loadingModal = M.Modal.init(document.getElementById("loading-modal"),
                                 {"dismissible": false});
     loadingModal.open();
-    socket.emit("request_corpus_analysis", {{ corpus_id }});
+    nopaque.socket.emit("request_corpus_analysis", {{ corpus_id }});
   });
 
-  socket.on("request_corpus_analysis", function(msg) {
+  nopaque.socket.on("request_corpus_analysis", function(msg) {
     if (msg === "[201]: Created") {loadingModal.close();}
   });
 
@@ -230,13 +228,13 @@
                      "hits_per_page": formData.get("hits_per_page"),
                      "query": formData.get("query")};
     hitsPerPage = formData.get("hits_per_page");
-    socket.emit("corpus_analysis", queryData);
+    nopaque.socket.emit("corpus_analysis", queryData);
     queryLoadingElement.classList.remove("hide");
     queryResultsTableElement.classList.add("hide");
-    toast("Query has been sent!")
+    nopaque.toast("Query has been sent!")
   });
 
-  socket.on("corpus_analysis", function(message) {
+  nopaque.socket.on("corpus_analysis", function(message) {
     console.log("### corpus_analysis ###");
     console.log(message);
     queryLoadingElement.classList.add("hide");
@@ -250,11 +248,11 @@
 
     if (message === null) {
       queryResultsTableElement.classList.add("hide");
-      toast("No results for this query!")
+      nopaque.toast("No results for this query!")
       return;
     } else if (message === "CQI_CQP_ERROR_GENERAL") {
         queryResultsTableElement.classList.add("hide");
-        toast("Invalid query entered!", "red");
+        nopaque.toast("Invalid query entered!", "red");
         return;
       } else {
         total_nr_matches = message["total_nr_matches"];
@@ -365,7 +363,7 @@
         var dataIndex = inspectBtn.parentNode.parentNode.getAttribute("data-index");
         inspectBtn.onclick = function() {
           contextModal.open();
-          socket.emit("inspect_match", {"cpos": matches[dataIndex]["hit"]});
+          nopaque.socket.emit("inspect_match", {"cpos": matches[dataIndex]["hit"]});
         };
       }
   });
@@ -399,7 +397,7 @@
   }
 
 
-  socket.on("match_context", function(message) {
+  nopaque.socket.on("match_context", function(message) {
     console.log("### match_context ###");
     console.log(message);
     contextResultsElement.innerHTML = "<p>&nbsp;</p>";
diff --git a/app/templates/corpora/corpus.html.j2 b/app/templates/corpora/corpus.html.j2
index 4c24615984a2fe29995bfde59f90f6ae4fe0c1d8..d620439c80916883840e1e12c18f47c061c475f4 100644
--- a/app/templates/corpora/corpus.html.j2
+++ b/app/templates/corpora/corpus.html.j2
@@ -102,21 +102,27 @@
       this.corpusId = corpusId;
       this.foreignCorpusFlag = foreignCorpusFlag;
       if (this.foreignCorpusFlag) {
-        foreignCorporaSubscribers.push(this);
+        nopaque.foreignCorporaSubscribers.push(this);
       } else {
-        corporaSubscribers.push(this);
+        nopaque.corporaSubscribers.push(this);
       }
     }
 
     _init() {
-      var corpus = this.foreignCorpusFlag ? foreignCorpora[this.corpusId] : corpora[this.corpusId];
+      let corpus;
+
+      if (this.foreignCorpusFlag) {
+        corpus = nopaque.foreignCorpora[this.corpusId];
+      } else {
+        corpus = nopaque.corpora[this.corpusId];
+      }
 
       // Status
       this.setStatus(corpus.status);
     }
 
     _update(patch) {
-      var pathArray;
+      let pathArray;
 
       for (let operation of patch) {
         /* "/corpusId/valueName" -> ["corpusId", "valueName"] */
@@ -141,12 +147,13 @@
     }
 
     setStatus(status) {
-      var statusElement;
+      let analyseBtn, statusElement;
+
       statusElement = document.getElementById("status");
       statusElement.classList.remove(...Object.values(CorpusList.STATUS_COLORS));
       statusElement.classList.add(CorpusList.STATUS_COLORS[status] || CorpusList.STATUS_COLORS['default']);
       statusElement.innerText = status;
-      var analyseBtn = document.getElementById('analyse');
+      analyseBtn = document.getElementById('analyse');
       if (status === 'prepared' || status === 'analysing' || status === 'failed') {
         analyseBtn.classList.remove('hide', 'disabled');
       } else if (status === 'start analysis' || status === 'stop analysis') {
@@ -164,7 +171,7 @@
   var informationUpdater = new InformationUpdater({{ corpus.id }}, false);
   {% else %}
   var informationUpdater = new InformationUpdater({{ corpus.id }}, true);
-  socket.emit('subscribe_foreign_user_ressources', {{ corpus.user_id }});
+  nopaque.socket.emit('subscribe_foreign_user_ressources', {{ corpus.user_id }});
   {% endif %}
 </script>
 {% endblock %}
diff --git a/app/templates/jobs/job.html.j2 b/app/templates/jobs/job.html.j2
index bdc9599e4b79b26de2bfee2f9221170e550eee6e..dd6d75f0d1fe92a5ee131d2f0ca269c275bc99f4 100644
--- a/app/templates/jobs/job.html.j2
+++ b/app/templates/jobs/job.html.j2
@@ -122,14 +122,20 @@
       this.jobId = jobId;
       this.foreignJobFlag = foreignJobFlag;
       if (this.foreignJobFlag) {
-        foreignJobsSubscribers.push(this);
+        nopaque.foreignJobsSubscribers.push(this);
       } else {
-        jobsSubscribers.push(this);
+        nopaque.jobsSubscribers.push(this);
       }
     }
 
     _init() {
-      var job = this.foreignJobFlag ? foreignJobs[this.jobId] : jobs[this.jobId];
+      let job;
+
+      if (this.foreignJobFlag) {
+        job = nopaque.foreignJobs[this.jobId];
+      } else {
+        job = nopaque.jobs[this.jobId];
+      }
 
       // End date
       this.setEndDate(job.end_date);
@@ -146,7 +152,7 @@
     }
 
     _update(patch) {
-      var pathArray;
+      let pathArray;
 
       for (let operation of patch) {
         /* "/jobId/valueName" -> ["jobId", "valueName"] */
@@ -175,7 +181,8 @@
     }
 
     setEndDate(timestamp) {
-      var end_date;
+      let end_date;
+
       if (timestamp === null) {
         end_date = "N.a.";
       } else {
@@ -186,8 +193,9 @@
     }
 
     setResult(result) {
-      var resultsElement, resultDownloadButtonElement,
+      let resultsElement, resultDownloadButtonElement,
           resultDownloadButtonIconElement;
+
       resultsElement = document.getElementById(`input-${result.job_input_id}-results`);
       resultDownloadButtonElement = document.createElement("a");
       resultDownloadButtonElement.classList.add("waves-effect", "waves-light", "btn-small");
@@ -203,7 +211,8 @@
     }
 
     setStatus(status) {
-      var statusElement;
+      let statusElement;
+
       statusElement = document.getElementById("status");
       statusElement.classList.remove(...Object.values(JobList.STATUS_COLORS));
       statusElement.classList.add(JobList.STATUS_COLORS[status] || JobList.STATUS_COLORS['default']);
@@ -215,7 +224,7 @@
   var informationUpdater = new InformationUpdater({{ job.id }}, false);
   {% else %}
   var informationUpdater = new InformationUpdater({{ job.id }}, true);
-  socket.emit('subscribe_foreign_user_ressources', {{ job.user_id }});
+  nopaque.socket.emit('subscribe_foreign_user_ressources', {{ job.user_id }});
   {% endif %}
 </script>
 {% endblock %}
diff --git a/app/templates/main/dashboard.html.j2 b/app/templates/main/dashboard.html.j2
index d7d488db7267331485e893f6abd9a29a6460da45..1b17527013b1e4661aa6e96955f41395dd8f4dc7 100644
--- a/app/templates/main/dashboard.html.j2
+++ b/app/templates/main/dashboard.html.j2
@@ -86,10 +86,7 @@
 </div>
 
 <script>
-  // Init corpus list
-  var corpusList = new CorpusList("corpora", corporaSubscribers);
-
-  // Init job list
-  var jobList = new JobList("jobs", jobsSubscribers);
+  var corpusList = new CorpusList("corpora", nopaque.corporaSubscribers);
+  var jobList = new JobList("jobs", nopaque.jobsSubscribers);
 </script>
 {% endblock %}