diff --git a/app/main/views.py b/app/main/views.py
index ccd1b7558e3fc0dfd052182e8355e59a9733e323..b3543975baf4e556dc602051678f283113e7f141 100644
--- a/app/main/views.py
+++ b/app/main/views.py
@@ -1,10 +1,12 @@
-from flask import current_app, flash, redirect, render_template, request, url_for
+from datetime import datetime
+from flask import current_app, flash, redirect, render_template, url_for
 from flask_login import current_user, login_required
 from ..models import User
 from ..tables import AdminUserTable, AdminUserItem
 from . import main
 from .forms import CreateCorpusForm
 from ..decorators import admin_required
+import hashlib
 import os
 
 
@@ -15,25 +17,23 @@ def dashboard():
 
     if create_corpus_form.validate_on_submit():
         app = current_app._get_current_object()
-        files = request.FILES
-        print(files)
-        corpus = {
-            'description': create_corpus_form.description.data,
-            'files': [],
-            'owner': current_user.id,
-            'title': create_corpus_form.title.data
-        }
-        corpus_dir = os.path.join(
-            app.config['OPAQUE_FILES'],
-            'corpora',
-            corpus['title']
-        )
+        id = hashlib.md5(
+            (current_user.username + '_' + datetime.now().isoformat()).encode()
+        ).hexdigest()
+        corpus = {'description': create_corpus_form.description.data,
+                  'id': id,
+                  'creator': current_user.id,
+                  'title': create_corpus_form.title.data
+                  }
+        dir = os.path.join(app.config['OPAQUE_FILES'], 'corpora', id)
 
         try:
-            os.mkdir(corpus_dir)
-        except FileExistsError:
-            flash('FileExistsError')
+            os.makedirs(dir)
+        except OSError:
+            flash('OSError!')
         else:
+            for file in create_corpus_form.files.data:
+                file.save(os.path.join(dir, file.filename))
             flash('Corpus created!')
         return redirect(url_for('main.dashboard'))
 
diff --git a/app/services/views.py b/app/services/views.py
index 75d494dd503e8c935d821227613dc66f2520ab0d..0e08c3d6bc068ae7564b5f21e0a0a6da704e4ecc 100644
--- a/app/services/views.py
+++ b/app/services/views.py
@@ -18,32 +18,29 @@ def ocr():
         id = hashlib.md5(
             (current_user.username + '_' + datetime.now().isoformat()).encode()
         ).hexdigest()
+        '''
+        ' TODO: Implement a Job class. For now a dictionary representation
+        '       is enough.
+        '''
+        job = {'creator': current_user.id,
+               'id': id,
+               'requested_cpus': 2,
+               'requested_memory': 2048,
+               'service': 'ocr',
+               'service_args': {'lang': ocr_job_form.language.data,
+                                'version': 'latest'
+                                },
+               'status': 'queued'
+               }
         dir = os.path.join(app.config['OPAQUE_FILES'], 'jobs', id)
 
         try:
-            os.mkdir(dir)
-        except FileExistsError:
-            # Possible MD5 hash collision occurred.
-            flash('Internal error occurred, please try again!')
+            os.makedirs(dir)
+        except OSError:
+            flash('OSError!')
         else:
             file = ocr_job_form.file.data
             file.save(os.path.join(dir, file.filename))
-
-            '''
-            ' TODO: Implement a Job class. For now a dictionary representation
-            '       is enough.
-            '''
-            job = {'worker': None,
-                   'creator': current_user.id,
-                   'id': id,
-                   'requested_cpus': 2,
-                   'requested_memory': 2048,
-                   'service': 'ocr',
-                   'service_args': {'lang': ocr_job_form.language.data,
-                                    'version': 'latest'
-                                    },
-                   'status': 'queued'
-                   }
             '''
             ' TODO: Let the scheduler run this job in the background.
             '
@@ -52,6 +49,7 @@ def ocr():
             '''
             thread = Thread(target=swarm.run, args=(job,))
             thread.start()
+            flash('Job created!')
         return redirect(url_for('services.ocr'))
 
     return render_template(
diff --git a/app/templates/main/dashboard.html.j2 b/app/templates/main/dashboard.html.j2
index 621524415ecf1d609ae89d9ef0c69dfcafdbc403..86002922268664044406432f673dc221b5d6c08b 100644
--- a/app/templates/main/dashboard.html.j2
+++ b/app/templates/main/dashboard.html.j2
@@ -37,23 +37,43 @@
 <div class="col s12">
   <div class="card small">
     <div class="card-content">
-      <form method="POST">
+      <form method="POST" enctype="multipart/form-data">
         {{ create_corpus_form.hidden_tag() }}
-        <div class="input-field">
-          <i class="material-icons prefix">title</i>
-          {{ create_corpus_form.title() }}
-          {{ create_corpus_form.title.label }}
-          {% for error in create_corpus_form.title.errors %}
-            <span class="helper-text red-text">{{ error }}</span>
-          {% endfor %}
-        </div>
-        <div class="input-field">
-          <i class="material-icons prefix">description</i>
-          {{ create_corpus_form.description() }}
-          {{ create_corpus_form.description.label }}
-          {% for error in create_corpus_form.description.errors %}
-            <span class="helper-text red-text">{{ error }}</span>
-          {% endfor %}
+        <div class="row">
+          <div class="col s12 m4">
+            <div class="input-field">
+              <i class="material-icons prefix">title</i>
+              {{ create_corpus_form.title() }}
+              {{ create_corpus_form.title.label }}
+              {% for error in create_corpus_form.title.errors %}
+                <span class="helper-text red-text">{{ error }}</span>
+              {% endfor %}
+            </div>
+          </div>
+          <div class="col s12 m8">
+            <div class="input-field">
+              <i class="material-icons prefix">description</i>
+              {{ create_corpus_form.description() }}
+              {{ create_corpus_form.description.label }}
+              {% for error in create_corpus_form.description.errors %}
+                <span class="helper-text red-text">{{ error }}</span>
+              {% endfor %}
+            </div>
+          </div>
+          <div class="col s12">
+            <div class="file-field input-field">
+              <div class="btn">
+                <span>{{ create_corpus_form.files.label.text }}</span>
+                {{ create_corpus_form.files(accept='.vrt') }}
+              </div>
+              <div class="file-path-wrapper">
+                <input class="file-path validate" type="text">
+              </div>
+              {% for error in create_corpus_form.files.errors %}
+                <span class="helper-text red-text">{{ error }}</span>
+              {% endfor %}
+            </div>
+          </div>
         </div>
         <div class="card-action right-align">
           {{ create_corpus_form.submit(class='btn') }}