Index: ow/templates/add_bulk_file.pt
===================================================================
--- ow/templates/add_bulk_file.pt	(revision fcf0ef3d4ad92cfddebb4201d049a17183adb13f)
+++ ow/templates/add_bulk_file.pt	(revision fcf0ef3d4ad92cfddebb4201d049a17183adb13f)
@@ -0,0 +1,85 @@
+<html xmlns="http://www.w3.org/1999/xhtml"
+      xml:lang="en"
+      xmlns:tal="http://xml.zope.org/namespaces/tal"
+      xmlns:metal="http://xml.zope.org/namespaces/metal"
+      xmlns:i18n="http://xml.zope.org/namespaces/i18n"
+      i18n:domain="OpenWorkouts"
+      metal:use-macro="load: base.pt"
+      tal:attributes="lang request.locale_name">
+
+  <metal:head-title metal:fill-slot="head-title">
+    <tal:t i18n:translate="">Upload file with multiple workouts</tal:t>
+  </metal:head-title>
+
+  <metal:title metal:fill-slot="title">
+    <tal:t i18n:translate="">Upload file with multiple workouts</tal:t>
+  </metal:title>
+
+  <metal:content metal:fill-slot="content">
+
+    <div class="uploading-workout hidden">
+      <h2 i18n:translate="">Uploading workouts file, please wait...</h2>
+      <p i18n:translate="">
+        This can take a moment, depending on the size of your workouts file and your connection speed. Be patient and please don't hit the stop or go back buttons on your browser.
+      </p>
+      <img src="" alt="Uploading workouts file" i18n:attributes="alt"
+           tal:attributes="src request.static_url('ow:static/media/img/loading.gif')">
+    </div>
+
+    <div class="upload-workout ow-forms">
+      <a href="" class="back"
+         tal:attributes="href request.resource_url(context)"
+         i18n:translate="">Back</a>
+      <h2 i18n:translate="">Upload file with multiple workouts</h2>
+
+      <p tal:condition="request.root['_bulk_files'].get_by_uid(context.uid)">
+        <a href="" tal:attributes="href request.resource_url(context, 'bulk-files')">Manage your uploaded bulk files</a>
+      </p>
+
+      <p i18n:translate="">
+        Add several workouts by providing several tracking files (fit, gpx) in a compressed file (zip, gz, etc)
+      </p>
+
+      <p i18n:translate="">
+        Once uploaded, the tracking files will be extracted, analyzed and imported into your workouts timeline.
+        This task can take some time, so be patient, workouts will start appearing on your timeline as they are
+        added.
+      </p>
+
+      ${form.begin(multipart=True)}
+      ${form.csrf_token()}
+
+
+      <fieldset>
+
+        <p>
+          <label for="compressed_file" i18n:translate="">
+            Workouts file (zip, gz, tgz)</label>
+          ${form.errorlist('compressed_file')}
+          ${form.file('compressed_file')}
+        </p>
+
+      </fieldset>
+
+      <tal:with-localizer tal:define="localizer get_localizer(request)">
+        ${form.submit("submit", localizer.translate(_('Save')),  **{'class':"button button-normal"})}
+      </tal:with-localizer>
+
+      ${form.end()}
+        </div>
+
+  </metal:content>
+
+  <metal:body-js metal:fill-slot="body-js">
+    <script>
+        $(document).ready(function(){
+            $("div.upload-workout form").on("submit", function(){
+                console.log('Showing spinner');
+                $("div.upload-workout").fadeOut();
+                $("div.uploading-workout").fadeIn();
+            });
+        });
+    </script>
+  </metal:body-js>
+
+</html>
Index: ow/templates/base.pt
===================================================================
--- ow/templates/base.pt	(revision c081c354c2d8f2f3164bc59e94315b4b4efa4975)
+++ ow/templates/base.pt	(revision fcf0ef3d4ad92cfddebb4201d049a17183adb13f)
@@ -85,4 +85,9 @@
                   <li>
                     <a href="" i18n:translate=""
+                       tal:attributes="href request.resource_url(request.root, current_user, 'add-bulk-file')">
+                      Bulk upload</a>
+                  </li>
+                  <li>
+                    <a href="" i18n:translate=""
                        tal:attributes="href request.resource_url(request.root, current_user, 'add-workout-manually')">
                       Add manually</a>
Index: ow/templates/bulk_files.pt
===================================================================
--- ow/templates/bulk_files.pt	(revision fcf0ef3d4ad92cfddebb4201d049a17183adb13f)
+++ ow/templates/bulk_files.pt	(revision fcf0ef3d4ad92cfddebb4201d049a17183adb13f)
@@ -0,0 +1,69 @@
+<html xmlns="http://www.w3.org/1999/xhtml"
+      xml:lang="en"
+      xmlns:tal="http://xml.zope.org/namespaces/tal"
+      xmlns:metal="http://xml.zope.org/namespaces/metal"
+      xmlns:i18n="http://xml.zope.org/namespaces/i18n"
+      i18n:domain="OpenWorkouts"
+      metal:use-macro="load: base.pt"
+      tal:attributes="lang request.locale_name">
+
+  <metal:head-title metal:fill-slot="head-title">
+    <tal:t i18n:translate="">Multiple file uploads</tal:t>
+  </metal:head-title>
+
+  <metal:title metal:fill-slot="title">
+    <tal:t i18n:translate="">Multiple file uploads</tal:t>
+  </metal:title>
+
+  <metal:content metal:fill-slot="content">
+
+    <div class="bulk-files ow-forms">
+      <a href="" class="back"
+         tal:attributes="href request.resource_url(context)"
+         i18n:translate="">Back</a>
+      <h2 i18n:translate="">Multiple file uploads</h2>
+
+      <tal:bulk_files tal:repeat="bulk_file bulk_files">
+        <div class="bulk-file">
+
+          <h3 tal:content="bulk_file.file_name"></h3>
+
+          <p>
+            <span i18n:translate="">Uploaded on</span>
+            <span tal:content="bulk_file.uploaded_in_timezone(context.timezone)"></span>
+          </p>
+
+          <p>
+            <tal:loaded tal:condition="bulk_file.loaded">
+              <span i18n:translate="">File loaded on></span>
+              <span tal:content="bulk_file.loaded_in_timezone(context.timezone)"></span>
+            </tal:loaded>
+            <tal:not_loaded tal:condition="not bulk_file.loaded">
+              <span i18n:translate="">This file has not been yet processed</span>
+            </tal:not_loaded>
+          </p>
+
+          <tal:workouts tal:condition="bulk_file.loaded and bulk_file.workout_ids">
+            <ul class="bulk-loaded-workouts">
+              <tal:workout tal:repeat="workout bulk_file.workouts">
+                <li>
+                  <span tal:content="workout.start_in_timezone(context.timezone)"></span>,
+                  <span tal:content="workout.sport"></span>,
+                  <span tal:content="workout.title"></span>
+                </li>
+              </tal:workout>
+            </ul>
+          </tal:workouts>
+
+          <tal:no_workouts tal:condition="bulk_file.loaded and not bulk_file.workout_ids">
+            <p><span i18n:translate>No workouts have been loaded from this file</span></p>
+          </tal:no_workouts>
+
+        </div>
+      </tal:bulk_files>
+
+    </div>
+
+  </metal:content>
+
+</html>
