diff --git a/app/corpora/routes.py b/app/corpora/routes.py
index a2d14af70bd1e0144ed4a6c865a059c786e694e7..f3cdf8f1ebf4020c02eba3fa3b7320c88f4af072 100644
--- a/app/corpora/routes.py
+++ b/app/corpora/routes.py
@@ -31,14 +31,17 @@ def user_can_delete_corpus(user, corpus):
 @bp.route('')
 @login_required
 def corpora():
-    corpora = Corpus.query.filter(Corpus.user_id == current_user.id | Corpus.is_public == True).all()
-    return render_template('corpora/corpora.html', corpora=corpora)
+    query = Corpus.query.filter(
+        (Corpus.user_id == current_user.id) | (Corpus.is_public == True)
+    )
+    corpora = [c.to_json_serializeable() for c in query.all()]
+    return render_template('corpora/corpora.html.j2', corpora=corpora, title='Corpora')
 
 
 @bp.route('/create', methods=['GET', 'POST'])
 @login_required
 def create_corpus():
-    form = CreateCorpusForm(prefix='create-corpus-form')
+    form = CreateCorpusForm()
     if form.validate_on_submit():
         try:
             corpus = Corpus.create(
@@ -150,7 +153,7 @@ def create_corpus_file(corpus_id):
     corpus = Corpus.query.get_or_404(corpus_id)
     if not user_can_update_corpus(current_user, corpus):
         abort(403)
-    form = CreateCorpusFileForm(prefix='create-corpus-file-form')
+    form = CreateCorpusFileForm()
     if form.is_submitted():
         if not form.validate():
             response = {'errors': form.errors}
@@ -197,10 +200,7 @@ def corpus_file(corpus_id, corpus_file_id):
     corpus_file = CorpusFile.query.filter_by(corpus_id = corpus_id, id=corpus_file_id).first_or_404()
     if not (corpus_file.corpus.user == current_user or current_user.is_administrator()):
         abort(403)
-    form = UpdateCorpusFileForm(
-        data=corpus_file.to_json_serializeable(),
-        prefix='edit-corpus-file-form'
-    )
+    form = UpdateCorpusFileForm(data=corpus_file.to_json_serializeable())
     if form.validate_on_submit():
         form.populate_obj(corpus_file)
         if db.session.is_modified(corpus_file):
diff --git a/app/static/js/RessourceLists/CorpusList.js b/app/static/js/RessourceLists/CorpusList.js
index 0721a8074c361138da3035f89c14c77c9757368a..a16b1ce7a0eb4b08bd959df8ce277eb220ad7e8b 100644
--- a/app/static/js/RessourceLists/CorpusList.js
+++ b/app/static/js/RessourceLists/CorpusList.js
@@ -1,4 +1,12 @@
 class CorpusList extends RessourceList {
+  static instances = [];
+
+  static getInstance(elem) {
+    return CorpusList.instances.find((instance) => {
+      return instance.listjs.list === elem;
+    });
+  }
+
   static autoInit() {
     for (let corpusListElement of document.querySelectorAll('.corpus-list:not(.no-autoinit)')) {
       new CorpusList(corpusListElement);
@@ -59,6 +67,7 @@ class CorpusList extends RessourceList {
 
   constructor(listElement, options = {}) {
     super(listElement, {...CorpusList.options, ...options});
+    CorpusList.instances.push(this);
   }
 
   init(user) {
diff --git a/app/templates/corpora/corpora.html.j2 b/app/templates/corpora/corpora.html.j2
new file mode 100644
index 0000000000000000000000000000000000000000..ee184a482bb4d372ace36d18ce5931d3fe4a859f
--- /dev/null
+++ b/app/templates/corpora/corpora.html.j2
@@ -0,0 +1,28 @@
+{% extends "base.html.j2" %}
+
+{% block page_content %}
+<div class="container">
+  <div class="row">
+    <div class="col s12">
+      <h1 id="title">{{ title }}</h1>
+    </div>
+
+    <div class="col s12" id="corpora">
+      <div class="card">
+        <div class="card-content">
+          <div class="corpus-list"></div>
+        </div>
+      </div>
+    </div>
+  </div>
+</div>
+{% endblock page_content %}
+
+
+{% block scripts %}
+{{ super() }}
+<script>
+  let corpusList = CorpusList.getInstance(document.querySelector('#corpora .corpus-list .list'));
+  corpusList._init({{ corpora|tojson }});
+</script>
+{% endblock scripts %}