Index: ow/templates/403.pt
===================================================================
--- ow/templates/403.pt	(revision 8c2b0949ae91540ee5c8101b9d5ff39003773da3)
+++ ow/templates/403.pt	(revision 5ec3a0b5cf5640304a0953320daef2a28bbca9a5)
@@ -21,7 +21,7 @@
     <div id="userinfo" i18n:translate="">
       We are sorry, but you do not have permissions to view these contents.
-      Please <a i18n:name="goback" i18n:translate="" href="" tal:attributes="href url">
-      go back to your dashboard</a> and access the contents you have
-      available from there.
+      Please <a href="" tal:attributes="href url">
+        go back to your dashboard</a> and access the contents you have
+        available from there.
     </div>
   </metal:content>
Index: ow/templates/404.pt
===================================================================
--- ow/templates/404.pt	(revision 8c2b0949ae91540ee5c8101b9d5ff39003773da3)
+++ ow/templates/404.pt	(revision 5ec3a0b5cf5640304a0953320daef2a28bbca9a5)
@@ -21,5 +21,5 @@
     <div id="userinfo" i18n:translate="">
       We are sorry, but the contents you were looking for can not be found.
-      Please <a i18n:name="goback" i18n:translate="" href="" tal:attributes="href url">
+      Please <a href="" tal:attributes="href url">
         go back to your dashboard</a> and, if the problem persist, let us know!
     </div>
Index: ow/templates/500.pt
===================================================================
--- ow/templates/500.pt	(revision 8c2b0949ae91540ee5c8101b9d5ff39003773da3)
+++ ow/templates/500.pt	(revision 5ec3a0b5cf5640304a0953320daef2a28bbca9a5)
@@ -21,6 +21,6 @@
     <div id="userinfo" i18n:translate="">
       Our support stuff has been notified already with all details about
-      the problem. Please
-      <a href="" i18n:name="goback" i18n:translate="" tal:attributes="href url">
+      the problem, please
+      <a href="" tal:attributes="href url">
         go back to your dashboard</a> and be patient while we fix it.
     </div>
Index: ow/templates/add_bulk_file.pt
===================================================================
--- ow/templates/add_bulk_file.pt	(revision 8c2b0949ae91540ee5c8101b9d5ff39003773da3)
+++ 	(revision )
@@ -1,85 +1,0 @@
-<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/add_manual_workout.pt
===================================================================
--- ow/templates/add_manual_workout.pt	(revision 8c2b0949ae91540ee5c8101b9d5ff39003773da3)
+++ ow/templates/add_manual_workout.pt	(revision 5ec3a0b5cf5640304a0953320daef2a28bbca9a5)
@@ -8,90 +8,68 @@
       tal:attributes="lang request.locale_name">
 
-  <metal:head-title metal:fill-slot="head-title" metal:define-slot="head-title">
+  <metal:head-title metal:fill-slot="head-title">
     <tal:t i18n:translate="">Add workout manually</tal:t>
   </metal:head-title>
 
-  <metal:title metal:fill-slot="title" metal:define-slot="head-title">
-    <tal:t i18n:translate="">Add workout manually</tal:t>
+  <metal:title metal:fill-slot="title">
+    <tal:t i18n:translate="">Add workout Manually</tal:t>
   </metal:title>
 
   <metal:css metal:fill-slot="css">
-      <link rel="stylesheet" href="${request.static_url('ow:static/components/EasyAutocomplete/easy-autocomplete.min.css')}" />
-      <link rel="stylesheet" href="${request.static_url('ow:static/components/pickadate/themes/default.css')}" />
-      <link rel="stylesheet" href="${request.static_url('ow:static/components/pickadate/themes/default.date.css')}" />
+    <link rel="stylesheet"
+          href="${request.static_url('ow:static/components/EasyAutocomplete/easy-autocomplete.min.css')}" />
   </metal:css>
 
   <metal:content metal:fill-slot="content">
+    <div id="add_workout">
+      ${form.begin()}
+      ${form.csrf_token()}
 
-    <div class="add_workout ow-forms">
-      <a href="" class="back"
-         tal:attributes="href request.resource_url(context)"
-         i18n:translate="">Back</a>
+      <fieldset>
+        ${form.errorlist('sport')}
+        <label for="sport" i18n:translate="">Sport/Activity:</label>
+        ${form.text('sport')}
+        ${form.errorlist('title')}
+        <label for="title" i18n:translate="">Title:</label>
+        ${form.text('title')}
+      </fieldset>
 
-      <h2>
-        <metal:form-title metal:define-slot="form-title">
-          <tal:t i18n:translate="">Add a new workout</tal:t>
-        </metal:form-title>
-      </h2>
+      <fieldset>
+        ${form.errorlist('start_date')}
+        <label for="start_date" i18n:translate="">Start date (dd/mm/yyyy):
+        </label>
+        ${form.text('start_date', size=10)}
+        ${form.errorlist('start_time')}
+        <label for="start_time" i18n:translate="">Start time (HH:MM):</label>
+        ${form.text('start_time', size=5)}
 
-        ${form.begin()}
-        ${form.csrf_token()}
+        <br /> <hr />  <!-- o_O! -->
 
-        <fieldset>
-          <p>
-              <label for="sport" i18n:translate="">Sport/Activity</label>
-              ${form.errorlist('sport')}
-              ${form.text('sport')}
-          </p>
-          <p>
-              <label for="title" i18n:translate="">Title</label>
-              ${form.errorlist('title')}
-              ${form.text('title')}
-          </p>
-          <div class="input-container ly-flex ly-3 has-gap">
-            <div>
-              <label for="distance" i18n:translate="">Distance (Km):</label>
-              ${form.errorlist('distance')}
-              ${form.text('distance', size=4, **{'class': "number"})}
-            </div>
-              <div>
-                  <label for="start_date" i18n:translate="">Start date (dd/mm/yyyy)</label>
-                  ${form.errorlist('start_date')}
-                  ${form.text('start_date', size=10, **{'class': "date"})}
-              </div>
-              <div>
-                  <label for="start_time" i18n:translate="">Start time (HH:MM)</label>
-                  ${form.errorlist('start_time')}
-                  ${form.text('start_time', size=5, **{'class': "time"})}
-              </div>
-          </div>
+        ${form.errorlist('duration_hours')}
+        <label for="duration_hours" i18n:translate="">Hours:</label>
+        ${form.text('duration_hours', size=3)}
 
-          <div class="input-container ly-flex ly-3 has-gap">
-            <div>
-              <label for="duration_hours" i18n:translate="">Hours</label>
-              ${form.errorlist('duration_hours')}
-              ${form.text('duration_hours', size=3, **{'class': "number"})}
-            </div>
-            <div>
-              <label for="duration_minutes" i18n:translate="">Minutes</label>
-              ${form.errorlist('duration_minutes')}
-              ${form.text('duration_minutes', size=3, **{'class': "number"})}
-            </div>
-            <div>
-              <label for="duration_seconds" i18n:translate="">Seconds</label>
-              ${form.errorlist('duration_seconds')}
-              ${form.text('duration_seconds', size=3, **{'class': "number"})}
-            </div>
-          </div>
-          <div>
-            <label for="notes" i18n:translate="">Notes:</label>
-            ${form.errorlist('notes')}
-            ${form.textarea('notes', rows=10, cols=50)}
-          </div>
-        </fieldset>
+        ${form.errorlist('duration_minutes')}
+        <label for="duration_minutes" i18n:translate="">Minutes:</label>
+        ${form.text('duration_minutes', size=3)}
 
-        <tal:with-localizer tal:define="localizer get_localizer(request)">
-          ${form.submit("submit", localizer.translate(_('Save')),  **{'class':"button button-normal"})}
-        </tal:with-localizer>
+        ${form.errorlist('duration_seconds')}
+        <label for="duration_seconds" i18n:translate="">Seconds:</label>
+        ${form.text('duration_seconds', size=3)}
+
+        ${form.errorlist('distance')}
+        <label for="distance" i18n:translate="">Distance (Km):</label>
+        ${form.text('distance', size=4)}
+      </fieldset>
+
+      <fieldset>
+        ${form.errorlist('notes')}
+        <label for="notes" i18n:translate="">Notes:</label>
+        ${form.textarea('notes', rows=10, cols=50)}
+      </fieldset>
+
+      ${form.submit("submit", "Save")}
+      <a href="" tal:attributes="href request.resource_url(request.root)"
+         i18n:translate="">Cancel</a>
 
       ${form.end()}
@@ -102,20 +80,13 @@
 
   <metal:body-js metal:fill-slot="body-js">
-      <script src="${request.static_url('ow:static/components/EasyAutocomplete/jquery.easy-autocomplete.min.js')}"></script>
-      <script src="${request.static_url('ow:static/components/pickadate/picker.js')}"></script>
-      <script src="${request.static_url('ow:static/components/pickadate/picker.date.js')}"></script>
-
-      <script type="text/javascript">
-       $(document).ready(function() {
-           var options = {
-               data: ${request.root.sports_json},
-           };
-           $("#sport").easyAutocomplete(options);
-           $('#start_date').pickadate({
-               format: 'dd/mm/yyyy',
-               formatSubmit: 'dd/mm/yyyy',
-           });
-       });
-      </script>
+    <script src="${request.static_url('ow:static/components/EasyAutocomplete/jquery.easy-autocomplete.min.js')}"></script>
+    <script type="text/javascript">
+      $(document).ready(function() {
+          var options = {
+              data: ${request.root.sports_json},
+          };
+          $("#sport").easyAutocomplete(options);
+      });
+    </script>
   </metal:body-js>
 
Index: ow/templates/add_user.pt
===================================================================
--- ow/templates/add_user.pt	(revision 8c2b0949ae91540ee5c8101b9d5ff39003773da3)
+++ ow/templates/add_user.pt	(revision 5ec3a0b5cf5640304a0953320daef2a28bbca9a5)
@@ -22,10 +22,10 @@
 
       <fieldset>
+        ${form.errorlist('user_id')}
+        <label for="email" i18n:translate="">User ID:</label>
+        ${form.text('user_id')}
         ${form.errorlist('email')}
         <label for="email" i18n:translate="">E-Mail:</label>
         ${form.text('email')}
-        ${form.errorlist('nickname')}
-        <label for="nickname" i18n:translate="">Nickname</label>
-        ${form.text('nickname')}
       </fieldset>
 
Index: ow/templates/add_workout.pt
===================================================================
--- ow/templates/add_workout.pt	(revision 8c2b0949ae91540ee5c8101b9d5ff39003773da3)
+++ ow/templates/add_workout.pt	(revision 5ec3a0b5cf5640304a0953320daef2a28bbca9a5)
@@ -9,128 +9,43 @@
 
   <metal:head-title metal:fill-slot="head-title">
-    <tal:t i18n:translate="">Upload workout file</tal:t>
+    <tal:t i18n:translate="">Add workout</tal:t>
   </metal:head-title>
 
   <metal:title metal:fill-slot="title">
-    <tal:t i18n:translate="">Upload workout file</tal:t>
+    <tal:t i18n:translate="">Add workout</tal:t>
   </metal:title>
 
   <metal:content metal:fill-slot="content">
-
-    <div class="uploading-workout hidden">
-      <h2 i18n:translate="">Uploading workout, please wait...</h2>
-      <p i18n:translate="">
-        This can take a moment, depending on the size of your tracking 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="Loading workout" 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 workout file</h2>
+    <div id="add_workout">
       ${form.begin(multipart=True)}
       ${form.csrf_token()}
 
-      <tal:is_duplicate tal:condition="duplicate is not None">
-        <article class="workout-resume">
-
-          <h2 class="workout-title">
-            <tal:warning i18n:translate="">THIS MAY BE A DUPLICATE OF:</tal:warning>
-            <a href="" tal:content="duplicate.title"
-               tal:attributes="href request.resource_url(duplicate)"></a>
-          </h2>
-
-          <ul class="workout-info">
-            <li>
-              <tal:c tal:content="duplicate.sport"></tal:c>
-            </li>
-            <li>
-              <tal:c tal:content="duplicate.start_in_timezone(context.timezone)"></tal:c>
-            </li>
-            <li>
-              <!--! use the properly formatted duration instead of the timedelta object -->
-              <tal:c tal:content="duplicate._duration"></tal:c>
-            </li>
-            <li tal:condition="duplicate.distance">
-              <tal:c tal:content="duplicate.rounded_distance"></tal:c> km
-            </li>
-            <li tal:condition="duplicate.uphill">
-              +<tal:c tal:content="duplicate.uphill"></tal:c> m
-            </li>
-          </ul>
-
-          <div class="workout-map" tal:condition="duplicate.has_gpx">
-            <a href="" tal:attributes="href request.resource_url(duplicate)">
-              <tal:has-screenshot tal:condition="duplicate.map_screenshot is not None">
-                <img src="" tal:attributes="src request.static_url(duplicate.map_screenshot);
-                          alt duplicate.title; title duplicate.title">
-              </tal:has-screenshot>
-              <tal:has-not-screenshot tal:condition="duplicate.map_screenshot is None">
-                <img src="" tal:attributes="src request.static_url('ow:static/media/img/no_map.gif');
-                          alt duplicate.title; title duplicate.title; class 'js-needs-map'">
-              </tal:has-not-screenshot>
-            </a>
-          </div>
-
-        </article>
-
-        <div>
-      </tal:is_duplicate>
+      <fieldset>
+        ${form.errorlist('title')}
+        <label for="title" i18n:translate="">Title:</label>
+        ${form.text('title')}
+      </fieldset>
 
       <fieldset>
-
-        <p>
-          <label for="title" i18n:translate="">Title</label>
-          ${form.errorlist('title')}
-          ${form.text('title')}
-        </p>
-
-        <p>
-          <label for="notes" i18n:translate="">Notes</label>
-          ${form.errorlist('notes')}
-          ${form.textarea('notes', rows=10, cols=50)}
-        </p>
-
-        <p>
-          <label for="tracking_file" i18n:translate="">
-            Workout file (gpx, fit)</label>
-          ${form.errorlist('tracking_file')}
-          ${form.file('tracking_file')}
-        </p>
-
-        <p tal:condition="duplicate is not None">
-          <label for="allow_duplicates" i18n:translate="">Allow duplicated workouts</label>
-          <small i18n:translate="">
-            Mark this checkbox if you want to add to override the mechanism not allowing duplicated workouts
-          </small>
-          <input type="checkbox" name="allow_duplicates">
-        </p>
-
+        ${form.errorlist('notes')}
+        <label for="notes" i18n:translate="">Notes:</label>
+        ${form.textarea('notes', rows=10, cols=50)}
       </fieldset>
 
-      <tal:with-localizer tal:define="localizer get_localizer(request)">
-        ${form.submit("submit", localizer.translate(_('Save')),  **{'class':"button button-normal"})}
-      </tal:with-localizer>
+      <fieldset>
+        ${form.errorlist('tracking_file')}
+        <label for="tracking_file" i18n:translate="">
+          Workout file (gpx, fit):</label>
+        ${form.file('tracking_file')}
+      </fieldset>
+
+      ${form.submit("submit", "Save")}
+      <a href="" tal:attributes="href request.resource_url(request.root)"
+         i18n:translate="">Cancel</a>
 
       ${form.end()}
-        </div>
+    </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 8c2b0949ae91540ee5c8101b9d5ff39003773da3)
+++ ow/templates/base.pt	(revision 5ec3a0b5cf5640304a0953320daef2a28bbca9a5)
@@ -20,11 +20,10 @@
     <metal:header-metas metal:define-slot="header-metas"></metal:header-metas>
 
-    <link rel="apple-touch-icon" sizes="180x180" href="${request.static_url('ow:static/apple-touch-icon.png')}">
-    <link rel="icon" type="image/png" sizes="32x32" href="${request.static_url('ow:static/favicon-32x32.png')}">
-    <link rel="icon" type="image/png" sizes="16x16" href="${request.static_url('ow:static/favicon-16x16.png')}">
-    <link rel="manifest" href="${request.static_url('ow:static/site.webmanifest')}">
-    <link rel="mask-icon" href="${request.static_url('ow:static/safari-pinned-tab.svg')}" color="#5bbad5">
-    <meta name="msapplication-TileColor" content="#da532c">
-    <meta name="theme-color" content="#ffffff">
+    <link rel="shortcut icon"
+          href="${request.static_url('ow:static/pyramid-16x16.png')}">
+
+    <!--! This should be 182x182px-->
+    <link rel="apple-touch-icon"
+          href="${request.static_url('ow:static/pyramid-16x16.png')}">
 
     <title>
@@ -33,8 +32,11 @@
     </title>
 
-    <metal:css metal:define-slot="css"></metal:css>
+    <link rel="stylesheet"
+          href="${request.static_url('ow:static/css/main.min.css')}" />
 
     <link rel="stylesheet"
-          href="${request.static_url('ow:static/css/main.css')}" />
+          href="${request.static_url('ow:static/css/openworkouts.css')}" />
+
+    <metal:css metal:define-slot="css"></metal:css>
 
     <metal:header-js metal:define-slot="header-js"></metal:header-js>
@@ -63,15 +65,15 @@
               current user now -->
             <ul>
-              <li
+              <li class=""
                   tal:attributes="class 'is-active' if 'dashboard' in renderer_name else ''">
-                <a class="icon-dashboard" href=""
+                <a href="" i18n:translate=""
                    tal:attributes="href request.resource_url(request.root)">
-                  <span i18n:translate="">Dashboard</span></a>
+                  Dashboard</a>
               </li>
-              <li
+              <li class=""
                   tal:attributes="class 'is-active' if 'profile' in renderer_name else ''">
-                <a class="icon-profile" href=""
+                <a href="" i18n:translate=""
                    tal:attributes="href request.resource_url(request.root, current_user, 'profile')">
-                  <span i18n:translate="">My profile</span></a>
+                  My profile</a>
               </li>
               <li class="add-workout">
@@ -85,9 +87,4 @@
                   <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>
@@ -96,7 +93,7 @@
               </li>
               <li>
-                <a class="icon-logout" href=""
+                <a href="" i18n:translate=""
                    tal:attributes="href request.resource_url(request.root, 'logout')">
-                  <span i18n:translate="">Log out</span>
+                  Log out
                 </a>
               </li>
Index: ow/templates/base_anonymous.pt
===================================================================
--- ow/templates/base_anonymous.pt	(revision 8c2b0949ae91540ee5c8101b9d5ff39003773da3)
+++ ow/templates/base_anonymous.pt	(revision 5ec3a0b5cf5640304a0953320daef2a28bbca9a5)
@@ -15,17 +15,15 @@
     <meta name="author" content="The OpenWorkouts Project">
 
+    <link rel="shortcut icon"
+          href="${request.static_url('ow:static/pyramid-16x16.png')}">
 
-    <link rel="apple-touch-icon" sizes="180x180" href="${request.static_url('ow:static/apple-touch-icon.png')}">
-    <link rel="icon" type="image/png" sizes="32x32" href="${request.static_url('ow:static/favicon-32x32.png')}">
-    <link rel="icon" type="image/png" sizes="16x16" href="${request.static_url('ow:static/favicon-16x16.png')}">
-    <link rel="manifest" href="${request.static_url('ow:static/site.webmanifest')}">
-    <link rel="mask-icon" href="${request.static_url('ow:static/safari-pinned-tab.svg')}" color="#5bbad5">
-    <meta name="msapplication-TileColor" content="#da532c">
-    <meta name="theme-color" content="#ffffff">
+    <!--! This should be 182x182px-->
+    <link rel="apple-touch-icon"
+          href="${request.static_url('ow:static/pyramid-16x16.png')}">
 
     <title>OpenWorkouts - tracking your workouts openly</title>
 
     <link rel="stylesheet"
-          href="${request.static_url('ow:static/css/main.css')}" />
+          href="${request.static_url('ow:static/css/main.min.css')}" />
 
   </head>
@@ -39,5 +37,5 @@
           <a href="#" tal:attributes="href request.resource_url(request.root)">
             <span class="logo-open">Open</span><span class="logo-work">work</span><span class="logo-outs">outs</span>
-          </a>
+        </a>
         </h1>
         <p class="description">tracking your workouts openly</p>
Index: ow/templates/bulk_files.pt
===================================================================
--- ow/templates/bulk_files.pt	(revision 8c2b0949ae91540ee5c8101b9d5ff39003773da3)
+++ 	(revision )
@@ -1,91 +1,0 @@
-<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, 'add-bulk-file')"
-         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>
-              <ul>
-                <tal:loaded_files tal:repeat="file_name bulk_file.loaded_info.keys()">
-                  <li tal:define="file_info bulk_file.loaded_info[file_name]">
-                    <span tal:content="file_name"></span>
-                    <tal:file_loaded tal:condition="file_info['loaded']">
-                      <span i18n:translate="">Loaded correctly</span>
-                      <a href="" tal:attributes="href request.resource_url(context, file_info['workout'])"
-                         i18n:translate="">See workout</a>
-                    </tal:file_loaded>
-                    <tal:file_not_loaded tal:condition="not file_info['loaded']">
-                      <span i18n:translate="">Couldn't be loaded:</span>
-                      <span tal:content="file_info['error']"></span>
-                    </tal:file_not_loaded>
-                  </li>
-                </tal:loaded_files>
-              </ul>
-            </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>
-
-          <p>
-            <a href="" tal:attributes="href request.resource_url(bulk_file, 'delete')"
-               i18n:translate="">delete</a>
-          </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>
Index: ow/templates/change_password.pt
===================================================================
--- ow/templates/change_password.pt	(revision 8c2b0949ae91540ee5c8101b9d5ff39003773da3)
+++ ow/templates/change_password.pt	(revision 5ec3a0b5cf5640304a0953320daef2a28bbca9a5)
@@ -17,45 +17,32 @@
 
   <metal:content metal:fill-slot="content">
+    <div id="add_workout">
+      ${form.begin()}
+      ${form.csrf_token()}
 
-      <div class="change-password ow-forms">
-        <a href="" tal:attributes="href request.resource_url(context, 'profile')"
-             class="back"
-             i18n:translate="">Cancel</a>
-        <h2 i18n:translate="">Change password</h2>
+      <fieldset>
+        ${form.errorlist('old_password')}
+        <label for="old_password" i18n:translate="">
+          Old/current password:</label>
+        ${form.password('old_password')}
+      </fieldset>
 
-          ${form.begin()}
-          ${form.csrf_token()}
+      <fieldset>
+        ${form.errorlist('password')}
+        <label for="password" i18n:translate="">
+          New password:</label>
+        ${form.password('password')}
+        ${form.errorlist('password_confirm')}
+        <label for="password_confirm" i18n:translate="">
+          New password (again):</label>
+        ${form.password('password_confirm')}
+      </fieldset>
 
-          <fieldset>
-              <div>
-                  <label for="old_password" i18n:translate="">
-                      Old/current password</label>
-                  ${form.errorlist('old_password')}
-                  ${form.password('old_password')}
-              </div>
+      ${form.submit("submit", "Save")}
+      <a href="" tal:attributes="href request.resource_url(context, 'profile')"
+         i18n:translate="">Cancel</a>
 
-            <div class="input-container ly-flex ly-2 has-gap">
-              <div>
-                  <label for="password" i18n:translate="">
-                      New password</label>
-                  ${form.errorlist('password')}
-                  ${form.password('password')}
-                </div>
-                <div>
-                  <label for="password_confirm" i18n:translate="">
-                      New password (again)</label>
-                  ${form.errorlist('password_confirm')}
-                  ${form.password('password_confirm')}
-              </div>
-            </div>
-          </fieldset>
-
-          <p>
-            <tal:with-localizer tal:define="localizer get_localizer(request)">
-              ${form.submit("submit", localizer.translate(_('Change password')),  **{'class':"button button-normal"})}
-            </tal:with-localizer>
-          </p>
-          ${form.end()}
-      </div>
+      ${form.end()}
+    </div>
 
   </metal:content>
Index: ow/templates/dashboard.pt
===================================================================
--- ow/templates/dashboard.pt	(revision 8c2b0949ae91540ee5c8101b9d5ff39003773da3)
+++ ow/templates/dashboard.pt	(revision 5ec3a0b5cf5640304a0953320daef2a28bbca9a5)
@@ -25,26 +25,7 @@
       <section class="workout-list">
 
-        <h3 tal:condition="viewing_month is not None"
-            tal:define="localizer get_localizer(request)">
-          <tal:d tal:content="localizer.translate(month_name[viewing_month]) + ' ' + str(viewing_year)"></tal:d> -
-          <tal:n tal:content="len(workouts)"></tal:n>
-          <tal:t i18n:translate="">Workouts</tal:t>
-        </h3>
+        <h2 tal:content="context.fullname"></h2>
 
-        <tal:no-workouts tal:condition="context.num_workouts == 0">
-            <div class="warning">
-                <p i18n:translate="">You haven't added any workouts yet</p>
-                <p>
-                    <a href="" i18n:translate=""
-                       tal:attributes="href request.resource_url(context, 'add-workout')">
-                        Upload one</a> |
-                    <a href="" i18n:translate=""
-                       tal:attributes="href request.resource_url(context, 'add-workout-manually')">
-                        Add one manually</a>
-                </p>
-            </div>
-        </tal:no-workouts>
-
-        <tal:r tal:repeat="workout workouts">
+        <tal:r tal:repeat="workout context.workouts()">
 
           <article class="workout-resume">
@@ -57,38 +38,42 @@
             <ul class="workout-info">
               <li>
-                <tal:c tal:content="workout.sport"></tal:c>
+                <tal:c tal:content="workout.start"></tal:c>
               </li>
               <li>
-                <tal:c tal:content="workout.start_in_timezone(context.timezone)"></tal:c>
-              </li>
-              <li>
-                <!--! use the properly formatted duration instead of the timedelta object -->
-                <tal:c tal:content="workout._duration"></tal:c>
+                <tal:c tal:content="workout.duration"></tal:c>
               </li>
               <li tal:condition="workout.distance">
                 <tal:c tal:content="workout.rounded_distance"></tal:c> km
               </li>
-              <li tal:condition="workout.uphill">
-                +<tal:c tal:content="workout.uphill"></tal:c> m
+            </ul>
+
+            <ul class="workout-info" tal:define="hr workout.hr; cad workout.cad">
+              <li tal:condition="hr">
+                <span i18n:translate="">HR (bpm)</span>:
+                <tal:c tal:content="hr['min']"></tal:c>
+                <tal:t i18n:translate="">Min.</tal:t>,
+                <tal:c tal:content="hr['avg']"></tal:c>
+                <tal:t i18n:translate="">Avg.</tal:t>,
+                <tal:c tal:content="hr['max']"></tal:c>
+                <tal:t i18n:translate="">Max.</tal:t>
+              </li>
+              <li tal:condition="cad">
+                <span i18n:translate="">Cad</span>:
+                <tal:c tal:content="cad['min']"></tal:c>
+                <tal:t i18n:translate="">Min.</tal:t>,
+                <tal:c tal:content="cad['avg']"></tal:c>
+                <tal:t i18n:translate="">Avg.</tal:t>,
+                <tal:c tal:content="cad['max']"></tal:c>
+                <tal:t i18n:translate="">Max.</tal:t>
               </li>
             </ul>
 
-            <div class="workout-intro">
-              <p tal:repeat="paragraph workout.trimmed_notes.split('\n')"
-                 tal:content="paragraph"></p>
-            </div>
+            <div class="workout-intro" tal:content="workout.notes"></div>
 
-            <div class="workout-map" tal:condition="workout.has_gpx">
-              <a href="" tal:attributes="href request.resource_url(workout)">
-                <tal:has-screenshot tal:condition="workout.map_screenshot is not None">
-                  <img src="" tal:attributes="src request.static_url(workout.map_screenshot);
-                            alt workout.title; title workout.title">
-                </tal:has-screenshot>
-                <tal:has-not-screenshot tal:condition="workout.map_screenshot is None">
-                  <img src="" tal:attributes="src request.static_url('ow:static/media/img/no_map.gif');
-                            alt workout.title; title workout.title; class 'js-needs-map'">
-                </tal:has-not-screenshot>
-              </a>
-            </div>
+            <ul class="workout-options">
+              <li class="owo-edit"><a href="" i18n:translate="" tal:attributes="href request.resource_url(workout, 'edit')"><span>edit</span></a></li>
+              <li class="owo-update"><a href="" i18n:translate="" tal:attributes="href request.resource_url(workout, 'update-from-file')"><span>update with tracking file</span></a></li>
+              <li class="owo-del"><a href="" i18n:translate="" tal:attributes="href request.resource_url(workout, 'delete')"><span>delete</span></a></li>
+            </ul>
 
           </article>
@@ -99,95 +84,5 @@
 
       <aside class="workout-aside">
-        <div class="aside-profile">
-          <tal:c tal:condition="getattr(context, 'picture', None)">
-            <a href="" tal:attributes="href request.resource_url(context, 'profile')">
-              <img tal:attributes="src request.resource_path(context, 'picture', query={'size': 200})"
-                   width="450" />
-            </a>
-          </tal:c>
-          <h2>
-            <a href="" tal:attributes="href request.resource_url(context, 'profile')"
-               tal:content="context.fullname">
-            </a>
-          </h2>
-          <ul>
-            <li>
-              <tal:n tal:content="context.num_workouts"></tal:n> <tal:t i18n:translate="">workouts</tal:t>
-            </li>
-          </ul>
-        </div>
-          <div class="week-stats js-week-stats">
-            <h3><tal:t i18n:translate="">This week</tal:t></h3>
-            <p tal:define="totals context.week_totals">
-              <span class="week-stats-distance">
-                <tal:d tal:content="round(totals['distance'])"></tal:d>
-                <tal:t i18n:translate="">km</tal:t> |
-              </span>
-              <span class="week-stats-time">
-                <tal:hms tal:define="hms timedelta_to_hms(totals['time'])">
-                  <tal:h tal:content="str(hms[0]).zfill(2)"></tal:h>
-                  <tal:t i18n:translate="">hours</tal:t>,
-                  <tal:h tal:content="str(hms[1]).zfill(2)"></tal:h>
-                  <tal:t i18n:translate="">min.</tal:t>
-                </tal:hms>
-              </span>
-            </p>
-            <div class="svg-content">
-              <svg width="300" height="200" viewBox="0 0 300 200"></svg>
-            </div>
-          </div>
-
-          <tal:activity_tree tal:condition="context.num_workouts > 0">
-              <ul class="workout-activity-tree" tal:define="tree context.activity_dates_tree">
-                  <tal:years tal:repeat="year sorted(tree.keys(), reverse=True )">
-                      <li tal:define="is_viewing_year year == viewing_year">
-                          <a href="" tal:content="year"
-                             tal:attributes="href request.resource_url(context, query={'year': year});
-                                             class 'js-year viewing-year' if is_viewing_year  else 'js-year'">
-                          </a>
-                          <ul tal:define="stats context.stats(year)" tal:attributes="class 'workout-activity-summary' if is_viewing_year  else 'workout-activity-summary hidden'">
-                            <li>
-                              <span i18n:translate="">Workouts:</span>
-                              <span tal:content="stats['workouts']"></span>
-                            </li>
-                            <li>
-                              <span i18n:translate="">Distance:</span>
-                              <span> <tal:km tal:content="round(stats['distance'])"></tal:km> km</span>
-                            </li>
-                            <li>
-                              <span i18n:translate="">Time:</span>
-                              <tal:hms tal:define="hms timedelta_to_hms(stats['time'])">
-                                <span>
-                                  <tal:h tal:content="str(hms[0]).zfill(2)"></tal:h>
-                                  <tal:t i18n:translate="">hours</tal:t>,
-                                  <tal:h tal:content="str(hms[1]).zfill(2)"></tal:h>
-                                  <tal:t i18n:translate="">min.</tal:t>
-                                </span>
-                              </tal:hms>
-                            </li>
-                            <li>
-                              <span i18n:translate="">Elevation:</span>
-                              <span> <tal:m tal:content="stats['elevation']"></tal:m> m</span>
-                            </li>
-                          </ul>
-                          <ul class="workout-activity-tree-year"
-                              tal:attributes="class 'workout-activity-tree-year' if is_viewing_year  else 'workout-activity-tree-year hidden'">
-                              <tal:months tal:repeat="month sorted(tree[year].keys())">
-                                  <li tal:define="is_viewing_month is_viewing_year and month == viewing_month">
-                                    <a href=""
-                                       tal:attributes="href request.resource_url(context, query={'year': year, 'month': month});
-                                             class 'viewing-month' if is_viewing_month else ''"
-                                       tal:define="localizer get_localizer(request)">
-                                      <span tal:content="localizer.translate(month_name[month])"></span>
-                                      <span tal:content="sum([tree[year][month][sport] for sport in tree[year][month]])"></span>
-                                    </a>
-                                  </li>
-                              </tal:months>
-                          </ul>
-                      </li>
-                  </tal:years>
-              </ul>
-          </tal:activity_tree>
-
+        <h2>...</h2>
       </aside>
 
@@ -196,24 +91,3 @@
   </metal:content>
 
-  <metal:body-js metal:fill-slot="body-js">
-    <script src="${request.static_url('ow:static/components/d3/d3.min.js')}"></script>
-    <script src="${request.static_url('ow:static/js/ow.js')}"></script>
-
-    <script type="text/javascript">
-
-     var map_shots = owjs.map_shots({
-         img_selector: 'img.js-needs-map',
-     })
-     map_shots.run();
-
-     var week_chart = owjs.week_chart({
-         chart_selector: 'div.js-week-stats svg',
-         url: "${request.resource_url(context, 'week')}",
-         current_day_name: "${current_day_name}"
-     });
-     week_chart.render();
-    </script>
-
-  </metal:body-js>
-
 </html>
Index: ow/templates/delete_bulk_file.pt
===================================================================
--- ow/templates/delete_bulk_file.pt	(revision 8c2b0949ae91540ee5c8101b9d5ff39003773da3)
+++ 	(revision )
@@ -1,66 +1,0 @@
-<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="">Delete bulk file</tal:t> -
-    <tal:w tal:content="context.file_name"></tal:w>
-  </metal:head-title>
-
-  <metal:title metal:fill-slot="title">
-    <tal:t i18n:translate="">Delete bulk file</tal:t> -
-    <tal:w tal:content="context.file_name"></tal:w>
-  </metal:title>
-
-  <metal:content metal:fill-slot="content">
-    <div id="delete_workout" class="ow-forms">
-      <a class="back" href="" tal:attributes="href request.resource_url(user, 'bulk-files')"
-         i18n:translate="">Cancel</a>
-      <form action="" method="POST">
-        <fieldset>
-          <input id="_csrf" name="_csrf" type="hidden" value=""
-                 tal:attributes="value request.session.get_csrf_token()" />
-          <input id="delete" name="delete" type="hidden" value="yes" />
-
-          <div id="workout"
-               tal:define="timezone request.root[request.authenticated_userid].timezone">
-            <h2 tal:content="context.file_name"></h2>
-
-            <ul class="workout-activity-summary">
-              <li>
-                <span i18n:translate="">Uploaded:</span>
-                <span tal:content="context.uploaded_in_timezone(timezone)"></span>
-              </li>
-              <tal:loaded tal:condition="context.loaded">
-                <li>
-                  <span i18n:translate="">File loaded on:</span>
-                  <span tal:content="context.loaded_in_timezone(timezone)"></span>
-                </li>
-              </tal:loaded>
-              <tal:not_loaded tal:condition="not context.loaded">
-                <li>
-                  <span i18n:translate="">This file has not been yet processed</span>
-                </li>
-              </tal:not_loaded>
-
-            </ul>
-          </div>
-        </fieldset>
-        <div>
-          <p i18n:translate="">Are you sure you want to delete this file?</p>
-        </div>
-        <div>
-          <input class="button button-normal" type="submit" name="submit" value="Yes, delete"
-                 i18n:attributes="value" />
-        </div>
-      </form>
-    </div>
-
-  </metal:content>
-
-</html>
Index: ow/templates/delete_workout.pt
===================================================================
--- ow/templates/delete_workout.pt	(revision 8c2b0949ae91540ee5c8101b9d5ff39003773da3)
+++ ow/templates/delete_workout.pt	(revision 5ec3a0b5cf5640304a0953320daef2a28bbca9a5)
@@ -19,44 +19,46 @@
 
   <metal:content metal:fill-slot="content">
-    <div id="delete_workout" class="ow-forms">
-      <a class="back" href="" tal:attributes="href request.resource_url(context)"
-         i18n:translate="">Cancel</a>
+    <div id="delete_workout">
       <form action="" method="POST">
-        <fieldset>
-          <input id="_csrf" name="_csrf" type="hidden" value=""
-                 tal:attributes="value request.session.get_csrf_token()" />
-          <input id="delete" name="delete" type="hidden" value="yes" />
+        <input id="_csrf" name="_csrf" type="hidden" value=""
+               tal:attributes="value request.session.get_csrf_token()" />
+        <input id="delete" name="delete" type="hidden" value="yes" />
 
-          <div id="workout"
-               tal:define="timezone request.root[request.authenticated_userid].timezone">
-            <h2 tal:content="context.title"></h2>
-
-            <ul class="workout-activity-summary" id="" tal:attributes="id 'workout-' + context.workout_id + '-details'">
-              <li>
-                <tal:t i18n:translate="">Start:</tal:t>
-                <tal:c tal:content="context.start_in_timezone(timezone)"></tal:c>
-              </li>
-              <li>
-                <tal:t i18n:translate="">Duration:</tal:t>
-                <tal:c tal:content="context._duration"></tal:c>
-              </li>
-              <li>
-                <tal:t i18n:translate="">Distance:</tal:t>
-                <tal:c tal:content="context.rounded_distance"></tal:c>
-              </li>
-            </ul>
-            <div id="" tal:content="context.notes"
-                 tal:attributes="id 'workout-' + context.workout_id + '-notes'">
-            </div>
-          </div>
-        </fieldset>
+      <div id="workout">
+        <h3 tal:content="context.title"></h3>
+        <ul id="" tal:attributes="id 'workout-' + context.workout_id + '-details'">
+          <li>
+            <tal:t i18n:translate="">Start:</tal:t>
+            <tal:c tal:content="context.start"></tal:c>
+          </li>
+          <li>
+            <tal:t i18n:translate="">End:</tal:t>
+            <tal:c tal:content="context.end"></tal:c>
+          </li>
+          <li>
+            <tal:t i18n:translate="">Distance:</tal:t>
+            <tal:c tal:content="context.distance"></tal:c>
+          </li>
+          <li>
+            <tal:t i18n:translate="">Average Heart Rate:</tal:t>
+            <tal:c tal:content="context.hr_avg"></tal:c>
+          </li>
+          <li>
+            <tal:t i18n:translate="">Maximum Heart Rate:</tal:t>
+            <tal:c tal:content="context.hr_max"></tal:c>
+          </li>
+        </ul>
+        <div id="" tal:content="context.notes"
+             tal:attributes="id 'workout-' + context.workout_id + '-notes'">
+        </div>
+      </div>
 
       <div>
-        <p i18n:translate="">Are you sure you want to delete this workout?</p>
+        Are you sure you want to delete this workout?
       </div>
-      <div>
-        <input class="button button-normal" type="submit" name="submit" value="Yes, delete"
-               i18n:attributes="value" />
-      </div>
+
+      <input type="submit" name="submit" value="Yes, delete" />
+      <a href="" tal:attributes="href request.resource_url(context)"
+         i18n:translate="">Cancel</a>
       </form>
     </div>
Index: ow/templates/edit_manual_workout.pt
===================================================================
--- ow/templates/edit_manual_workout.pt	(revision 8c2b0949ae91540ee5c8101b9d5ff39003773da3)
+++ ow/templates/edit_manual_workout.pt	(revision 5ec3a0b5cf5640304a0953320daef2a28bbca9a5)
@@ -23,7 +23,3 @@
   </metal:title>
 
-  <metal:form-title metal:fill-slot="form-title">
-    <tal:t i18n:translate="">Edit workout</tal:t>
-  </metal:form-title>
-
 </html>
Index: ow/templates/edit_profile.pt
===================================================================
--- ow/templates/edit_profile.pt	(revision 8c2b0949ae91540ee5c8101b9d5ff39003773da3)
+++ ow/templates/edit_profile.pt	(revision 5ec3a0b5cf5640304a0953320daef2a28bbca9a5)
@@ -13,145 +13,71 @@
 
   <metal:title metal:fill-slot="title">
-      <tal:t i18n:translate="">Edit profile</tal:t>
+    <tal:t i18n:translate="">Edit profile</tal:t>
   </metal:title>
 
-  <metal:css metal:fill-slot="css">
-      <link rel="stylesheet" href="${request.static_url('ow:static/components/pickadate/themes/default.css')}" />
-      <link rel="stylesheet" href="${request.static_url('ow:static/components/pickadate/themes/default.date.css')}" />
-  </metal:css>
-
   <metal:content metal:fill-slot="content">
-    <div class="edit-profile ow-forms">
-            <a href="" class="back"
-               tal:attributes="href request.resource_url(context, 'profile')"
-               i18n:translate="">Cancel</a>
-      <h2 i18n:translate="">Edit profile</h2>
+    <div id="add_workout">
       ${form.begin(multipart=True)}
       ${form.csrf_token()}
 
-        <fieldset>
-            <div class="input-container ly-flex ly-2 has-gap">
-              <div>
-                  <label for="email" i18n:translate="">Email address:</label>
-                  ${form.errorlist('email')}
-                  ${form.text('email')}
-              </div>
-              <div>
-                  <label for="nickname" i18n:translate="">Nickname:</label>
-                  ${form.errorlist('nickname')}
-                  ${form.text('nickname')}
-              </div>
-            </div>
-            <div  class="input-container ly-flex ly-2 has-gap">
-                <div>
-                  <tal:c tal:condition="getattr(context, 'picture', None)">
-                      <label for="current_picture" i18n:translate="">
-                          Current picture:</label>
-                      <img id="current_picture"
-                           tal:attributes="src request.resource_path(context, 'picture', query={'size': 200})"
-                           width="150">
-                  </tal:c>
-                </div>
-                <div>
-                  <label for="picture" i18n:translate="">
-                      Picture (jpg, jpeg, png or gif):</label>
-                  ${form.errorlist('picture')}
-                  ${form.file('picture')}
-                </div>
-            </div>
-            <div class="input-container ly-flex ly-3 has-gap">
-              <div>
-                  <label for="firstname" i18n:translate="">First name:</label>
-                  ${form.errorlist('firstname')}
-                  ${form.text('firstname')}
-              </div>
-              <div>
-                  <label for="lastname" i18n:translate="">Last name:</label>
-                  ${form.errorlist('lastname')}
-                  ${form.text('lastname')}
-              </div>
-              <div>
-                <label for="gender" i18n:translate="">Gender:</label>
-                ${form.errorlist('gender')}
-                ${form.select('gender', gender_names)}
-              </div>
-            </div>
+      <fieldset>
+        ${form.errorlist('email')}
+        <label for="email" i18n:translate="">Email address:</label>
+        ${form.text('email')}
+      </fieldset>
 
-            <div class="input-container ly-flex ly-3 has-gap">
-              <div>
-                  <label for="birth_date" i18n:translate="">Birth date:</label>
-                  ${form.errorlist('birth_date')}
-                  ${form.date('birth_date', date_format='%d/%m/%Y')}
-              </div>
-              <div>
-                  <label for="height" i18n:translate="">Height (meters):</label>
-                  ${form.errorlist('height')}
-                  ${form.text('height')}
-              </div>
-              <div>
-                  <label for="weight" i18n:translate="">Weight (kg):</label>
-                  ${form.errorlist('weight')}
-                  ${form.text('weight')}
-              </div>
-            </div>
-            <p>
-                <label for="bio" i18n:translate="">Bio/About you:</label>
-                ${form.errorlist('bio')}
-                ${form.textarea('bio', rows=10, cols=50)}
-            </p>
-            <div class="input-container ly-flex ly-2 has-gap">
-              <div>
-                <label for="timezone" i18n:translate="">Timezone:</label>
-                <p>
-                  <small i18n:translate="">
-                    All dates and times will be formatted for this timezone
-                  </small>
-                </p>
-                ${form.errorlist('timezone')}
-                ${form.select('timezone', timezones)}
-              </div>
-              <div>
-                <label for="locale" i18n:translate="">Language:</label>
-                <p>
-                  <small i18n:translate="">
-                    All texts in the user interface will appear in this language
-                  </small>
-                </p>
-                ${form.errorlist('locale')}
-                ${form.select('locale', available_locale_names, selected_value=current_locale)}
-              </div>
-            </div>
-        </fieldset>
+      <fieldset>
+        <tal:c tal:condition="getattr(context, 'picture', None)">
+          <tal:t i18n:translate="">Current picture:</tal:t>
+          <img tal:attributes="src request.resource_path(context, 'picture')"
+               width="150" />
+        </tal:c>
+        ${form.errorlist('picture')}
+        <label for="picture" i18n:translate="">
+          Picture (jpg, jpeg, png or gif):</label>
+        ${form.file('picture')}
+      </fieldset>
 
-        <p>
-          <tal:with-localizer tal:define="localizer get_localizer(request)">
-            ${form.submit("submit", localizer.translate(_('Save')),  **{'class':"button button-normal"})}
-          </tal:with-localizer>
-        </p>
-        ${form.end()}
+      <fieldset>
+        ${form.errorlist('firstname')}
+        <label for="firstname" i18n:translate="">First name:</label>
+        ${form.text('firstname')}
+        ${form.errorlist('lastname')}
+        <label for="lastname" i18n:translate="">Last name:</label>
+        ${form.text('lastname')}
+      </fieldset>
+
+      <fieldset>
+        ${form.errorlist('gender')}
+        <label for="gender" i18n:translate="">Gender:</label>
+        ${form.select('gender', ['male', 'female'])}
+
+        ${form.errorlist('birth_date')}
+        <label for="birth_date" i18n:translate="">Birth date:</label>
+        ${form.date('birth_date', date_format='%d/%m/%Y')}
+
+        ${form.errorlist('height')}
+        <label for="height" i18n:translate="">Height (meters):</label>
+        ${form.text('height')}
+
+        ${form.errorlist('weight')}
+        <label for="weight" i18n:translate="">Weight (kg):</label>
+        ${form.text('weight')}
+      </fieldset>
+
+      <fieldset>
+        ${form.errorlist('bio')}
+        <label for="bio" i18n:translate="">Bio/About you:</label>
+        ${form.textarea('bio', rows=10, cols=50)}
+      </fieldset>
+
+      ${form.submit("submit", "Save")}
+      <a href="" tal:attributes="href request.resource_url(context, 'profile')"
+         i18n:translate="">Cancel</a>
+
+      ${form.end()}
     </div>
 
   </metal:content>
 
-  <metal:body-js metal:fill-slot="body-js">
-      <script src="${request.static_url('ow:static/components/pickadate/picker.js')}"></script>
-      <script src="${request.static_url('ow:static/components/pickadate/picker.date.js')}"></script>
-      <script type="text/javascript">
-       $(document).ready(function() {
-           var today = new Date();
-           var first_year = new Date();
-           // start 100 years ago, should be enough for birth date
-           first_year.setMonth(first_year.getMonth() - 1200);
-           $('#birth_date').pickadate({
-               format: 'dd/mm/yyyy',
-               formatSubmit: 'dd/mm/yyyy',
-               selectMonths: true,
-               selectYears: 100,
-               min: first_year,
-               max: today
-           });
-       });
-      </script>
-  </metal:body-js>
-
 </html>
Index: ow/templates/login.pt
===================================================================
--- ow/templates/login.pt	(revision 8c2b0949ae91540ee5c8101b9d5ff39003773da3)
+++ ow/templates/login.pt	(revision 5ec3a0b5cf5640304a0953320daef2a28bbca9a5)
@@ -20,19 +20,12 @@
 
           <div id="messages" class="message message-error"
-               tal:condition="message != ''">
-            <tal:message tal:content="message"></tal:message>
-            <tal:resend-verify tal:condition="resend_verify_link is not None">
-              <br>
-              <a href="" tal:attributes="href resend_verify_link"
-                 i18n:translate="">Please send me the verification link again</a>
-            </tal:resend-verify>
-          </div>
+               tal:content="message" tal:condition="message != ''"></div>
 
           <fieldset>
             <div>
-              <label for="email" i18n:translate="">Email</label>
-              <input placeholder="Your email..." type="text" name="email"
+              <label for="username" i18n:translate="">Username</label>
+              <input placeholder="Your username..." type="text" name="username"
                      value="" i18n:attributes="placeholder"
-                     tal:attributes="value email">
+                     tal:attributes="value username">
             </div>
             <div>
@@ -41,9 +34,7 @@
                      type="password" i18n:attributes="placeholder">
             </div>
-            <div>
-              <input class="button button-action" type="submit" name="submit" value="Login" i18n:attributes="value">
-            </div>
+            <input class="button" type="submit" name="submit" value="Login">
             <a class="login-remember" href="#" i18n:translate="">
-              Forgot your password?</a>
+              Forgot your password?</a> |
             <a class="join-now" href="" i18n:translate=""
                tal:attributes="href request.resource_url(context, 'signup')">
Index: ow/templates/mail_verify_account_html.pt
===================================================================
--- ow/templates/mail_verify_account_html.pt	(revision 8c2b0949ae91540ee5c8101b9d5ff39003773da3)
+++ 	(revision )
@@ -1,57 +1,0 @@
-<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_anonymous.pt"
-      tal:attributes="lang request.locale_name">
-
-  <metal:content metal:fill-slot="content">
-
-    <div class="verify-account-content">
-
-      <div class="info">
-
-        <h1>
-          <tal:t i18n:translate="">Welcome</tal:t> <tal:user tal:content="user.fullname"></tal:user>
-        </h1>
-
-        <p>
-          <tal:t i18n:translate="">
-            You have joined the OpenWorkouts community successfully,
-            now please verify your account.
-          </tal:t>
-        </p>
-
-        <p>
-          <a href="" class="button button-action"
-             tal:attributes="href verify_link"
-             i18n:translate="">Verify my account (*)</a>
-        </p>
-
-        <p>
-          <tal:t i18n:translate>
-            Thank you for joining us.
-          </tal:t>
-          <tal:t i18n:translate>
-            Best regards from the OpenWorkouts team.
-          </tal:t>
-        </p>
-
-        <p>
-          <small i18n:translate="">
-            (*) If clicking on the button does not work, you can copy this link and paste it on your browser navigation bar:
-          </small>
-        </p>
-        <p>
-          <small tal:content="verify_link"></small>
-        </p>
-
-      </div>
-
-    </div>
-
-  </metal:content>
-
-</html>
Index: ow/templates/mail_verify_account_txt.pt
===================================================================
--- ow/templates/mail_verify_account_txt.pt	(revision 8c2b0949ae91540ee5c8101b9d5ff39003773da3)
+++ 	(revision )
@@ -1,26 +1,0 @@
-<html tal:omit-tag=""
-      xmlns:i18n="http://xml.zope.org/namespaces/i18n"
-      i18n:domain="OpenWorkouts">
-
-  <tal:t i18n:translate="">Welcome to OpenWorkouts</tal:t>
-  <tal:user tal:content="user.fullname"></tal:user>
-
-  <tal:t i18n:translate="">
-    You have joined the OpenWorkouts community successfully,
-    now please verify your account.
-  </tal:t>
-
-  <tal:t i18n:translate="">
-    Click on the following link, or copy and paste it in your browser
-    navigation bar to verify your account:
-  </tal:t>
-
-  <tal:link tal:content="verify_link"></tal:link>
-
-  <tal:t i18n:translate>
-    Thank you for joining us.
-
-    Best regards from the OpenWorkouts team.
-  </tal:t>
-
-</html>
Index: ow/templates/openworkouts.pt
===================================================================
--- ow/templates/openworkouts.pt	(revision 8c2b0949ae91540ee5c8101b9d5ff39003773da3)
+++ 	(revision )
@@ -1,53 +1,0 @@
-<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_anonymous.pt"
-      tal:attributes="lang request.locale_name">
-
-  <metal:content metal:fill-slot="content">
-
-      <!-- Promo -->
-      <div class="promo-content">
-        <h1>Welcome to OpenWorkouts</h1>
-        <p>OpenWorkouts is a open source web app for tracking workouts.</p>
-
-        <p>Add workouts manually or upload them from gps/tracker files (gpx and fit supported currently)</p>
-        <p>Time-based archive to access your workouts</p>
-        <p>Detailed view of each workout, including overview data (speed, distance, time, hr, power, etc), charts and an interactive </p>map view for those workouts with gps tracking information
-        <p>Tools to edit or update workouts from new gps/tracker files</p>
-        <p>Global stats (totals for distance, time, etc) and per-month, per-week stats</p>
-        <p>Personal profile data containing basic info</p>
-
-        <h2>Get the latest release (0.2.0):</h2>
-        <ul>
-          <li>
-            <a href="https://openworkouts.org/sources/releases/OpenWorkouts-0.2.0.tar.gz">tar.gz</a>
-          </li>
-          <li>
-            <a href="https://openworkouts.org/sources/releases/OpenWorkouts-0.2.0.zip">zip</a>
-          </li>
-          <li>
-            <a href="https://openworkouts.readthedocs.io">Documentation</a>
-          </li>
-          <li>
-            <a href="https://openworkouts.readthedocs.io/en/latest/CHANGES.html">What´s new</a>
-          </li>
-        </ul>
-
-        <ul>
-          <li>
-            <a href="https://github.com/openworkouts">github</a>
-          </li>
-          <li>
-            <a href="https://twitter.com/openworkouts">twitter</a>
-          </li>
-        </ul>
-      </div>
-      <!-- /Promo -->
-
-  </metal:content>
-
-</html>
Index: ow/templates/profile.pt
===================================================================
--- ow/templates/profile.pt	(revision 8c2b0949ae91540ee5c8101b9d5ff39003773da3)
+++ ow/templates/profile.pt	(revision 5ec3a0b5cf5640304a0953320daef2a28bbca9a5)
@@ -12,533 +12,74 @@
   </metal:head-title>
 
-  <metal:css metal:fill-slot="css">
-    <link rel="stylesheet" href="${request.static_url('ow:static/components/jquery-dropdown/jquery.dropdown.css')}" />
-  </metal:css>
-
   <metal:content metal:fill-slot="content">
 
     <div class="user-profile">
-      <div class="user-profile-account">
-        <div>
-          <tal:c tal:condition="getattr(user, 'picture', None)">
-            <img tal:attributes="src request.resource_path(user, 'picture', query={'size': 200})"
-                 width="450" />
-          </tal:c>
-          <div>
-            <h2>
-              <tal:fullname tal:content="user.fullname"></tal:fullname>
-            </h2>
-            <p>
-              <tal:has-nickname tal:condition="user.nickname">
-                <a href=""
-                   tal:attributes="href request.resource_url(request.root, 'profile', user.nickname)"
-                   tal:content="request.resource_url(request.root, 'profile', user.nickname)">
-                </a> |
-              </tal:has-nickname>
-              <span><tal:email tal:content="user.email"></tal:email></span>
-            </p>
-            <div class="profile-bio">
-              <p tal:repeat="paragraph getattr(user, 'bio', '').split('\n')"
-                 tal:content="paragraph"></p>
-            </div>
-            <ul class="workout-options">
-              <li><a href=""
-                     tal:attributes="href request.resource_url(user, 'edit')"
-                     i18n:translate="">edit profile</a></li>
-              <li><a href=""
-                     tal:attributes="href request.resource_url(user, 'passwd')"
-                     i18n:translate="">change password</a></li>
-            </ul>
-          </div>
-          <div class="calendar-heatmap js-calendar-heatmap">
-          </div>
-          <div class="calendar-heatmap-tooltip js-ch-tooltip">
-            <ul class="profile-data">
-              <li>
-                <span class="js-ch-tooltip-date"></span>
-              </li>
-              <li>
-                <span><tal:t i18n:translate="">Workouts:</tal:t></span>
-                <span class="js-ch-tooltip-workouts"></span>
-              </li>
-              <li>
-                <span><tal:t i18n:translate="">Time:</tal:t></span>
-                <span class="js-ch-tooltip-time"></span>
-              </li>
-              <li>
-                <span><tal:t i18n:translate="">Distance:</tal:t></span>
-                <span class="js-ch-tooltip-distance"></span>
-              </li>
-              <li>
-                <span><tal:t i18n:translate="">Elevation:</tal:t></span>
-                <span class="js-ch-tooltip-elevation"></span>
-              </li>
-            </ul>
-          </div>
-        </div>
-
-      </div>
-
-      <div class="workout-content">
-        <div class="workout-list">
-          <div class="total-workouts">
-            <span>
-              <tal:w tal:replace="len(workouts)"></tal:w>
-              <tal:t i18n:translate="">workouts</tal:t>
-            </span>
-            <span>
-              <tal:hms tal:define="hms timedelta_to_hms(totals['time'])">
-                <tal:h tal:content="str(hms[0]).zfill(2)"></tal:h>
-                <tal:t i18n:translate="">hours</tal:t>,
-                <tal:h tal:content="str(hms[1]).zfill(2)"></tal:h>
-                <tal:t i18n:translate="">min.</tal:t>
-              </tal:hms>
-            </span>
-            <span>
-              <tal:w tal:replace="round(totals['distance'])"></tal:w>
-              <tal:t i18n:translate="">km</tal:t>
-            </span>
-            <span>
-              <tal:w tal:replace="round(totals['elevation'])"></tal:w>
-              <tal:t i18n:translate="">m</tal:t>
-            </span>
-          </div>
-
-          <div class="month-stats js-month-stats">
-            <div class="svg-content">
-              <svg width="900" height="180" viewBox="0 0 900 180"></svg>
-            </div>
-            <div class="center">
-              <ul class="workout-options filters js-filters">
-                <li>
-                  <a href="#" class="js-distance is-active"
-                     tal:attributes="class 'js-distance is-active' if filter_by == 'distance' else 'js-distance'"
-                     i18n:translate="">distance</a>
-                </li>
-                <li>
-                  <a href="#" class="js-time"
-                     tal:attributes="class 'js-time is-active' if filter_by == 'time' else 'js-time'"
-                     i18n:translate="">time</a>
-                </li>
-                <li>
-                  <a href="#" class="js-elevation"
-                     tal:attributes="class 'js-elevation is-active' if filter_by == 'elevation' else 'js-elevation'"
-                     i18n:translate="">elevation</a>
-                </li>
-              </ul>
-
-              <ul class="workout-options switcher js-switcher"
-                  tal:define="weekly 'week' in request.GET">
-                <li>
-                  <a href="#" class="" i18n:translate=""
-                     tal:attributes="class 'js-weekly is-active' if weekly else 'js-weekly'">
-                    weekly</a></li>
-                <li>
-                  <a href="#" class="" i18n:translate=""
-                     tal:attributes="class 'js-monthly is-active' if not weekly else 'js-monthly'">
-                    monthly</a></li>
-              </ul>
-            </div>
-          </div>
-
-
-          <tal:r tal:repeat="workout workouts">
-
-            <article class="workout-resume">
-
-              <h2 class="workout-title">
-                <a href="" tal:content="workout.title"
-                   tal:attributes="href request.resource_url(workout)"></a>
-              </h2>
-
-              <ul class="workout-info">
-                <li>
-                  <tal:c tal:content="workout.start_in_timezone(user.timezone)"></tal:c>
-                </li>
-                <li>
-                  <!--! use the properly formatted duration instead of the timedelta object -->
-                  <tal:c tal:content="workout._duration"></tal:c>
-                </li>
-                <li tal:condition="workout.distance">
-                  <tal:c tal:content="workout.rounded_distance"></tal:c> km
-                </li>
-                <li tal:condition="workout.uphill">
-                  +<tal:c tal:content="workout.uphill"></tal:c> m
-                </li>
-              </ul>
-
-              <ul class="workout-info" tal:define="hr workout.hr; cad workout.cad">
-                <li tal:condition="hr">
-                  <span i18n:translate="">HR (bpm)</span>:
-                  <tal:c tal:content="hr['avg']"></tal:c>
-                  <tal:t i18n:translate="">Avg.</tal:t>,
-                  <tal:c tal:content="hr['max']"></tal:c>
-                  <tal:t i18n:translate="">Max.</tal:t>
-                </li>
-                <li tal:condition="cad">
-                  <span i18n:translate="">Cad</span>:
-                  <tal:c tal:content="cad['avg']"></tal:c>
-                  <tal:t i18n:translate="">Avg.</tal:t>,
-                  <tal:c tal:content="cad['max']"></tal:c>
-                  <tal:t i18n:translate="">Max.</tal:t>
-                </li>
-              </ul>
-
-              <div class="workout-intro">
-                <p tal:repeat="paragraph workout.trimmed_notes.split('\n')"
-                   tal:content="paragraph"></p>
-              </div>
-
-              <div class="workout-map" tal:condition="workout.has_gpx">
-                <a href="" tal:attributes="href request.resource_url(workout)">
-                  <tal:has-screenshot tal:condition="workout.map_screenshot is not None">
-                    <img src="" tal:attributes="src request.static_url(workout.map_screenshot);
-                              alt workout.title; title workout.title">
-                  </tal:has-screenshot>
-                  <tal:has-not-screenshot tal:condition="workout.map_screenshot is None">
-                    <img src="" tal:attributes="src request.static_url('ow:static/media/img/no_map.gif');
-                              alt workout.title; title workout.title; class 'js-needs-map'">
-                  </tal:has-not-screenshot>
-                </a>
-              </div>
-
-            </article>
-
-          </tal:r>
-        </div>
-
-        <div class="workout-aside">
-
-          <h3 i18n:translate="">Profile info</h3>
-
-          <ul class="profile-data">
-            <li>
-              <span><tal:t i18n:translate="">Gender:</tal:t></span>
-              <tal:c tal:content="user_gender"></tal:c>
-            </li>
-            <li tal:define="birth_date getattr(user, 'birth_date', None)">
-              <span><tal:t i18n:translate="">Birth date:</tal:t></span>
-              <tal:c tal:condition="birth_date"
-                     tal:content="birth_date.strftime('%d/%m/%Y')"></tal:c>
-              <tal:c tal:condition="birth_date is None">-</tal:c>
-            </li>
-            <li>
-              <span><tal:t i18n:translate="">Height:</tal:t></span>
-              <tal:c tal:content="getattr(user, 'height', '-')"></tal:c> meters
-            </li>
-            <li>
-              <span><tal:t i18n:translate="">Weight:</tal:t></span>
-              <tal:c tal:content="getattr(user, 'weight', '-')"></tal:c> kg
-            </li>
-          </ul>
-
-          <tal:has-workouts tal:condition="profile_stats['sports']">
-
-            <h3 i18n:translate="">Workout stats</h3>
-
-            <p>
-              <a href="" data-jq-dropdown="#jq-dropdown-sports"
-                 class="profile-dropdown-sports js-jq-dropdown-sel-sports">
-                <strong tal:content="profile_stats['current_sport']"></strong>
-                <i class="arrow down"></i>
-              </a>
-            </p>
-
-            <tal:sports tal:repeat="sport profile_stats['sports']">
-              <div class="" tal:attributes="class 'js-sport-stats js-' + sport">
-
-                <a href="" data-jq-dropdown=""
-                   tal:attributes="data-jq-dropdown '#jq-dropdown-' + sport;
-                         class 'profile-dropdown-years js-jq-dropdown-sel-' + sport">
-                  <strong tal:content="profile_stats['current_year']"></strong>
-                  <i class="arrow down"></i>
-                </a>
-
-                <tal:years tal:repeat="year profile_stats['years']">
-                  <div class="" tal:attributes="class 'js-year-stats js-' + sport + '-' + str(year)">
-                    <ul class="profile-data"
-                        tal:define="sport_totals user.sport_totals(sport, year)">
-                      <li>
-                        <span>
-                          <tal:t i18n:translate="">Workouts</tal:t>
-                        </span>
-                        <tal:w tal:replace="sport_totals['workouts']"></tal:w>
-                      </li>
-                      <li>
-                        <span>
-                          <tal:t i18n:translate="">Time</tal:t>
-                        </span>
-                        <tal:hms tal:define="hms timedelta_to_hms(sport_totals['time'])">
-                          <tal:h tal:content="str(hms[0]).zfill(2)"></tal:h>
-                          <tal:t i18n:translate="">hours</tal:t>,
-                          <tal:h tal:content="str(hms[1]).zfill(2)"></tal:h>
-                          <tal:t i18n:translate="">min.</tal:t>
-                        </tal:hms>
-                      </li>
-                      <li>
-                        <span>
-                          <tal:t i18n:translate="">Distance</tal:t>
-                        </span>
-                        <tal:w tal:replace="round(sport_totals['distance'])"></tal:w>
-                        <tal:t i18n:translate="">km</tal:t>
-                      </li>
-                      <li>
-                        <span>
-                          <tal:t i18n:translate="">Elevation</tal:t>
-                        </span>
-                        <tal:w tal:replace="round(sport_totals['elevation'])"></tal:w>
-                        <tal:t i18n:translate="">m</tal:t>
-                      </li>
-                      <li><span i18n:translate="">Single workout records:</span></li>
-                      <li>
-                        <span>
-                          <tal:t i18n:translate="">Farthest distance</tal:t>
-                        </span>
-                        <tal:has-wid tal:condition="sport_totals['max_distance_wid'] is not None">
-                          <a href="" tal:attributes="href request.resource_url(user[sport_totals['max_distance_wid']])">
-                            <tal:w tal:replace="round(sport_totals['max_distance'])"></tal:w>
-                            <tal:t i18n:translate="">km</tal:t>
-                          </a>
-                        </tal:has-wid>
-                        <tal:has-not-wid tal:condition="sport_totals['max_distance_wid'] is None">
-                          <tal:w tal:replace="round(sport_totals['max_distance'])"></tal:w>
-                          <tal:t i18n:translate="">km</tal:t>
-                        </tal:has-not-wid>
-                      </li>
-                      <li>
-                        <span>
-                          <tal:t i18n:translate="">Longer workout</tal:t>
-                        </span>
-                        <tal:has-wid tal:condition="sport_totals['max_time_wid'] is not None">
-                          <a href="" tal:attributes="href request.resource_url(user[sport_totals['max_time_wid']])">
-                            <tal:hms tal:define="hms timedelta_to_hms(sport_totals['max_time'])">
-                              <tal:h tal:content="str(hms[0]).zfill(2)"></tal:h>
-                              <tal:t i18n:translate="">hours</tal:t>,
-                              <tal:h tal:content="str(hms[1]).zfill(2)"></tal:h>
-                              <tal:t i18n:translate="">min.</tal:t>
-                            </tal:hms>
-                          </a>
-                        </tal:has-wid>
-                        <tal:has-not-wid tal:condition="sport_totals['max_time_wid'] is None">
-                          <tal:hms tal:define="hms timedelta_to_hms(sport_totals['max_time'])">
-                            <tal:h tal:content="str(hms[0]).zfill(2)"></tal:h>
-                            <tal:t i18n:translate="">hours</tal:t>,
-                            <tal:h tal:content="str(hms[1]).zfill(2)"></tal:h>
-                            <tal:t i18n:translate="">min.</tal:t>
-                          </tal:hms>
-                        </tal:has-not-wid>
-                      </li>
-                      <li>
-                        <span>
-                          <tal:t i18n:translate="">Higher elevation gain</tal:t>
-                        </span>
-                        <tal:has-wid tal:condition="sport_totals['max_elevation_wid'] is not None">
-                          <a href="" tal:attributes="href request.resource_url(user[sport_totals['max_elevation_wid']])">
-                            <tal:w tal:replace="round(sport_totals['max_elevation'])"></tal:w>
-                            <tal:t i18n:translate="">m</tal:t>
-                          </a>
-                        </tal:has-wid>
-                        <tal:has-not-wid tal:condition="sport_totals['max_elevation_wid'] is None">
-                          <tal:w tal:replace="round(sport_totals['max_elevation'])"></tal:w>
-                          <tal:t i18n:translate="">m</tal:t>
-                        </tal:has-not-wid>
-                      </li>
-                    </ul>
-                  </div>
-                </tal:years>
-
-                <strong i18n:translate="">All time</strong>
-                <ul class="profile-data"
-                    tal:define="sport_totals user.sport_totals(sport)">
-                  <li>
-                    <span>
-                      <tal:t i18n:translate="">Workouts</tal:t>
-                    </span>
-                    <tal:w tal:replace="sport_totals['workouts']"></tal:w>
-                  </li>
-                  <li>
-                    <span>
-                      <tal:t i18n:translate="">Time</tal:t>
-                    </span>
-                    <tal:hms tal:define="hms timedelta_to_hms(sport_totals['time'])">
-                      <tal:h tal:content="str(hms[0]).zfill(2)"></tal:h>
-                      <tal:t i18n:translate="">hours</tal:t>,
-                      <tal:h tal:content="str(hms[1]).zfill(2)"></tal:h>
-                      <tal:t i18n:translate="">min.</tal:t>
-                    </tal:hms>
-                  </li>
-                  <li>
-                    <span>
-                      <tal:t i18n:translate="">Distance</tal:t>
-                    </span>
-                    <tal:w tal:replace="round(sport_totals['distance'])"></tal:w>
-                    <tal:t i18n:translate="">km</tal:t>
-                  </li>
-                  <li>
-                    <span>
-                      <tal:t i18n:translate="">Elevation</tal:t>
-                    </span>
-                    <tal:w tal:replace="round(sport_totals['elevation'])"></tal:w>
-                    <tal:t i18n:translate="">m</tal:t>
-                  </li>
-                  <li><span i18n:translate="">Single workout records:</span></li>
-                  <li>
-                    <span>
-                      <tal:t i18n:translate="">Farthest distance</tal:t>
-                    </span>
-                    <tal:has-wid tal:condition="sport_totals['max_distance_wid'] is not None">
-                      <a href="" tal:attributes="href request.resource_url(user[sport_totals['max_distance_wid']])">
-                        <tal:w tal:replace="round(sport_totals['max_distance'])"></tal:w>
-                        <tal:t i18n:translate="">km</tal:t>
-                      </a>
-                    </tal:has-wid>
-                    <tal:has-not-wid tal:condition="sport_totals['max_distance_wid'] is None">
-                      <tal:w tal:replace="round(sport_totals['max_distance'])"></tal:w>
-                      <tal:t i18n:translate="">km</tal:t>
-                    </tal:has-not-wid>
-                  </li>
-                  <li>
-                    <span>
-                      <tal:t i18n:translate="">Longer workout</tal:t>
-                    </span>
-                    <tal:has-wid tal:condition="sport_totals['max_time_wid'] is not None">
-                      <a href="" tal:attributes="href request.resource_url(user[sport_totals['max_time_wid']])">
-                        <tal:hms tal:define="hms timedelta_to_hms(sport_totals['max_time'])">
-                          <tal:h tal:content="str(hms[0]).zfill(2)"></tal:h>
-                          <tal:t i18n:translate="">hours</tal:t>,
-                          <tal:h tal:content="str(hms[1]).zfill(2)"></tal:h>
-                          <tal:t i18n:translate="">min.</tal:t>
-                        </tal:hms>
-                      </a>
-                    </tal:has-wid>
-                    <tal:has-not-wid tal:condition="sport_totals['max_time_wid'] is None">
-                      <tal:hms tal:define="hms timedelta_to_hms(sport_totals['max_time'])">
-                        <tal:h tal:content="str(hms[0]).zfill(2)"></tal:h>
-                        <tal:t i18n:translate="">hours</tal:t>,
-                        <tal:h tal:content="str(hms[1]).zfill(2)"></tal:h>
-                        <tal:t i18n:translate="">min.</tal:t>
-                      </tal:hms>
-                    </tal:has-not-wid>
-                  </li>
-                  <li>
-                    <span>
-                      <tal:t i18n:translate="">Higher elevation gain</tal:t>
-                    </span>
-                    <tal:has-wid tal:condition="sport_totals['max_elevation_wid'] is not None">
-                      <a href="" tal:attributes="href request.resource_url(user[sport_totals['max_elevation_wid']])">
-                        <tal:w tal:replace="round(sport_totals['max_elevation'])"></tal:w>
-                        <tal:t i18n:translate="">m</tal:t>
-                      </a>
-                    </tal:has-wid>
-                    <tal:has-not-wid tal:condition="sport_totals['max_elevation_wid'] is None">
-                      <tal:w tal:replace="round(sport_totals['max_elevation'])"></tal:w>
-                      <tal:t i18n:translate="">m</tal:t>
-                    </tal:has-not-wid>
-                  </li>
-                </ul>
-              </div>
-            </tal:sports>
-
-          </tal:has-workouts>
-
-        </div>
-      </div>
-    </div>
-
-      <div id="jq-dropdown-sports" class="jq-dropdown jq-dropdown-tip">
-        <ul class="jq-dropdown-menu">
-          <tal:sports tal:repeat="sport profile_stats['sports']">
-            <li>
-              <a href="#" class="" tal:content="sport"
-                 tal:attributes="class 'js-choose-sport-stats js-' + sport">
-              </a>
-            </li>
-          </tal:sports>
+      <tal:c tal:condition="getattr(context, 'picture', None)">
+        <img tal:attributes="src request.resource_path(context, 'picture')"
+             width="450" />
+      </tal:c>
+      <h2>
+        <tal:fullname tal:content="context.fullname"></tal:fullname>
+        (<tal:user_id tal:content="context.user_id"></tal:user_id>)
+      </h2>
+      <h3>
+        <tal:email tal:content="context.email"></tal:email>
+      </h3>
+      <h4>
+        <a href=""
+           tal:attributes="href request.resource_url(context, 'edit')"
+           i18n:translate="">edit profile</a> |
+        <a href=""
+           tal:attributes="href request.resource_url(context, 'passwd')"
+           i18n:translate="">change password</a>
+      </h4>
+      <div class="profile-info">
+        <ul>
+          <li>
+            <tal:t i18n:translate="">Gender:</tal:t>
+            <tal:c tal:content="getattr(context, 'gender', '-')"></tal:c>
+          </li>
+          <li tal:define="birth_date getattr(context, 'birth_date', None)">
+            <tal:t i18n:translate="">Birth date:</tal:t>
+            <tal:c tal:condition="birth_date"
+                   tal:content="birth_date.strftime('%d/%m/%Y')"></tal:c>
+            <tal:c tal:condition="birth_date is None">-</tal:c>
+          </li>
+          <li>
+            <tal:t i18n:translate="">Height:</tal:t>
+            <tal:c tal:content="getattr(context, 'height', '-')"></tal:c> meters
+          </li>
+          <li>
+            <tal:t i18n:translate="">Weight:</tal:t>
+            <tal:c tal:content="getattr(context, 'weight', '-')"></tal:c> kg
+          </li>
         </ul>
       </div>
 
+      <div class="profile-bio" tal:content="getattr(context, 'bio', '')">
+      </div>
 
-    <tal:sports tal:repeat="sport profile_stats['sports']">
-      <div id="" class="jq-dropdown jq-dropdown-tip"
-           tal:attributes="id 'jq-dropdown-' + sport">
-        <ul class="jq-dropdown-menu">
-          <tal:years tal:repeat="year profile_stats['years']">
-            <li>
-              <a href="#" class="" tal:content="year"
-                 tal:attributes="class 'js-choose-year-stats js-' + sport + '-' + str(year)">
-              </a>
-            </li>
-          </tal:years>
-        </ul>
+      <div class="workouts">
+        <tal:t i18n:translate="">Total number of workouts</tal:t>:
+        <tal:w tal:replace="context.num_workouts"></tal:w>
       </div>
-    </tal:sports>
 
+      <div class="latest-workouts">
+        <p i18n:translate="">Latest workouts</p>
+        <tal:r tal:repeat="workout context.workouts()[:5]">
+          <div class="workout">
+            <tal:c tal:content="workout.sport"></tal:c> -
+            <a href="" tal:content="workout.title"
+               tal:attributes="href request.resource_url(workout)"></a>
+            (<tal:c tal:content="workout.start"></tal:c>,
+            <tal:c tal:content="workout.duration"></tal:c>,
+            <tal:c tal:content="workout.rounded_distance"></tal:c> km)
+          </div>
+        </tal:r>
+      </div>
+
+    </div>
 
   </metal:content>
 
-  <metal:body-js metal:fill-slot="body-js">
-
-    <script src="${request.static_url('ow:static/components/jquery-dropdown/jquery.dropdown.js')}"></script>
-    <script src="${request.static_url('ow:static/components/d3/d3.min.js')}"></script>
-    <script src="${request.static_url('ow:static/js/ow.js')}"></script>
-
-    <script type="text/javascript">
-     var map_shots = owjs.map_shots({
-         img_selector: 'img.js-needs-map',
-     })
-     map_shots.run();
-
-     var sport_stats = owjs.sport_stats({
-         link_selector: 'a.js-choose-sport-stats',
-         stats_selector: 'div.js-sport-stats',
-         selected: 'div.js-sport-stats.js-${profile_stats['current_sport']}',
-         dropdown_selector: 'a.js-jq-dropdown-sel-sports',
-         current_year: '${profile_stats['current_year']}',
-         year_link_selector: 'a.js-choose-year-stats.js-'
-     })
-     sport_stats.setup();
-
-     var heatmap_chart = owjs.calendar_heatmap_chart({
-         chart_selector: 'div.js-calendar-heatmap',
-         tooltip_selector: '.js-ch-tooltip',
-         url: "${request.resource_url(user, 'month')}",
-         // Trick to have all those shortened day names translated
-         day_names_list: "${_('Mo Tu We Th Fr Sa Su')}".split(' ')
-     });
-     heatmap_chart.render();
-
-     var year_stats = owjs.year_stats({
-         link_selector: 'a.js-choose-year-stats',
-         stats_selector: 'div.js-year-stats',
-         selected: 'div.js-year-stats.js-${profile_stats['current_sport']}-${profile_stats['current_year']}',
-         dropdown_selector: 'a.js-jq-dropdown-sel-'
-     })
-     year_stats.setup();
-
-     var y_axis_labels = {
-         "distance": "Kilometers",
-         "time": "Hours",
-         "elevation": "Meters"
-     };
-
-     var year_chart = owjs.year_chart({
-         chart_selector: '.js-month-stats svg',
-         filters_selector: '.js-month-stats .js-filters a',
-         switcher_selector: '.js-month-stats .js-switcher a',
-         is_active_class: 'is-active',
-         urls: {"monthly": "${request.resource_url(user, 'monthly')}",
-                "weekly": "${request.resource_url(user, 'weekly')}"},
-         current_month: "${current_month}",
-         current_week: "${current_week}",
-         y_axis_labels: y_axis_labels,
-         filter_by: "${filter_by}",
-         url: "${'monthly' if current_week is None else 'weekly'}",
-     });
-     year_chart.render("${filter_by}", "${'monthly' if current_week is None else 'weekly'}");
-     year_chart.filters_setup();
-     year_chart.switcher_setup();
-    </script>
-
-  </metal:body-js>
-
 </html>
Index: ow/templates/signup.pt
===================================================================
--- ow/templates/signup.pt	(revision 8c2b0949ae91540ee5c8101b9d5ff39003773da3)
+++ ow/templates/signup.pt	(revision 5ec3a0b5cf5640304a0953320daef2a28bbca9a5)
@@ -12,5 +12,5 @@
       <!-- Login -->
 
-      <div class="login-content">
+      <div class="signup-content">
 
         <form method="post" name="signup" action="">
@@ -18,51 +18,46 @@
           <fieldset>
             <div>
+              ${form.errorlist('username')}
+              <label for="username" i18n:translate="">Username</label>
+              <input placeholder="Choose a cool username" type="text"
+                     name="username" value="" i18n:attributes="placeholder">
+            </div>
+
+            <div>
+              ${form.errorlist('email')}
               <label for="email" i18n:translate="">Email</label>
               <input placeholder="We need a valid email address"
                      type="text" name="email"
-                     value="" i18n:attributes="placeholder"
-                     tal:attributes="value form.data.get('email', '')">
-              ${form.errorlist('email')}
-
+                     value="" i18n:attributes="placeholder">
             </div>
             <div>
-              <label for="nickname" i18n:translate="">Nickname</label>
-              <input placeholder="Choose a cool nickname" type="text"
-                     name="nickname" value=""
-                     i18n:attributes="placeholder"
-                     tal:attributes="value form.data.get('nickname', '')">
-              ${form.errorlist('nickname')}
+              ${form.errorlist('firstname')}
+              <label for="firstname" i18n:translate="">First name</label>
+              <input placeholder="Your real first name here" type="text"
+                     name="firstname" value="" i18n:attributes="placeholder">
             </div>
             <div>
-              <label for="firstname" i18n:translate="">First name</label>
-              <input placeholder="Your real first name here" type="text"
-                     name="firstname" value="" i18n:attributes="placeholder"
-                     tal:attributes="value form.data.get('firstname', '')">
-              ${form.errorlist('firstname')}
+              ${form.errorlist('lastname')}
+              <label for="lastname" i18n:translate="">Last name</label>
+              <input placeholder="Your family name here" type="text"
+                     name="lastname" value="" i18n:attributes="placeholder">
             </div>
             <div>
-              <label for="lastname" i18n:translate="">Last name</label>
-              <input placeholder="Your family name here" type="text"
-                     name="lastname" value="" i18n:attributes="placeholder"
-                     tal:attributes="value form.data.get('lastname', '')">
-              ${form.errorlist('lastname')}
-            </div>
-            <div>
+              ${form.errorlist('password')}
               <label for="password" i18n:translate="">Password</label>
               <input placeholder="More than 9 characters, numbers and/or symbols"
                      name="password"
                      type="password" i18n:attributes="placeholder">
-              ${form.errorlist('password')}
             </div>
+
             <div>
+              ${form.errorlist('password_confirm')}
               <label for="password_confirm" i18n:translate="">Password (confirm)</label>
               <input placeholder="Confirm your password" name="password_confirm"
                      type="password" i18n:attributes="placeholder">
-              ${form.errorlist('password_confirm')}
             </div>
           </fieldset>
 
-          <input class="button button-action" type="submit" name="submit" value="Sign up!"
-                 i18n:attributes="value">
+          <input class="button" type="submit" name="submit" value="Sign up!">
 
         </form>
Index: ow/templates/update_workout_from_file.pt
===================================================================
--- ow/templates/update_workout_from_file.pt	(revision 8c2b0949ae91540ee5c8101b9d5ff39003773da3)
+++ ow/templates/update_workout_from_file.pt	(revision 5ec3a0b5cf5640304a0953320daef2a28bbca9a5)
@@ -19,65 +19,31 @@
 
   <metal:content metal:fill-slot="content">
-
-    <div class="uploading-workout hidden">
-      <h2 i18n:translate="">Uploading workout, please wait...</h2>
-      <p i18n:translate="">
-        This can take a moment, depending on the size of your tracking 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="Loading workout" i18n:attributes="alt"
-           tal:attributes="src request.static_url('ow:static/media/img/loading.gif')">
-    </div>
-
-    <div id="update_workout_file" class="ow-forms">
-
-      <a class="back" href="" tal:attributes="href request.resource_url(context)"
-         i18n:translate="">Back</a>
-
+    <div id="update_workout_file">
       ${form.begin(multipart=True)}
       ${form.csrf_token()}
 
-      <h2 tal:content="context.title"></h2>
-
-      <div tal:condition="context.has_tracking_file">
-
-        <h3 i18n:translate="">
-          Existing
-          <tal:filetype i18n:name="filetype"
-                        tal:content="context.tracking_filetype"></tal:filetype>
-          tracking file data
-        </h3>
-
-        <ul class="workout-activity-summary" id=""
-            tal:attributes="id 'workout-' + context.workout_id + '-details'"
-            tal:define="timezone request.root[request.authenticated_userid].timezone">
-          <li>
-            <tal:t i18n:translate="">Start:</tal:t>
-            <tal:c tal:content="context.start_in_timezone(timezone)"></tal:c>
-          </li>
-          <li>
-            <tal:t i18n:translate="">Duration:</tal:t>
-            <tal:c tal:content="context._duration"></tal:c>
-          </li>
-          <li>
-            <tal:t i18n:translate="">Distance:</tal:t>
-            <tal:c tal:content="context.rounded_distance"></tal:c>
-          </li>
-        </ul>
-        <div id="" tal:content="context.notes"
-             tal:attributes="id 'workout-' + context.workout_id + '-notes'">
-        </div>
+      <div tal:condition="context.has_tracking_file"
+           i18n:translate="">
+        Existing
+        <tal:filetype i18n:name="filetype"
+                      tal:content="context.tracking_filetype"></tal:filetype>
+        tracking file data:
+        <tal:data i18n:name="start"
+                  tal:content="context.start"></tal:data> -
+        <tal:data i18n:name="end"
+                  tal:content="context.end"></tal:data> -
+        <tal:data i18n:name="distance"
+                  tal:content="context.distance"></tal:data> kms
       </div>
 
       <fieldset>
         ${form.errorlist('tracking_file')}
-        <div>
-          <label for="notes" i18n:translate="">Workout file (gpx, fit):</label>
-          ${form.file('tracking_file')}
-        </div>
+        <label for="notes" i18n:translate="">Workout file (gpx, fit):</label>
+        ${form.file('tracking_file')}
       </fieldset>
 
-      <tal:with-localizer tal:define="localizer get_localizer(request)">
-        ${form.submit("submit", localizer.translate(_('Save')),  **{'class':"button button-normal"})}
-      </tal:with-localizer>
+      ${form.submit("submit", "Save")}
+      <a href="" tal:attributes="href request.resource_url(request.root)"
+         i18n:translate="">Cancel</a>
 
       ${form.end()}
@@ -86,16 +52,3 @@
   </metal:content>
 
-  <metal:body-js metal:fill-slot="body-js">
-    <script>
-        $(document).ready(function(){
-            $("#update_workout_file form").on("submit", function(){
-                console.log('Showing spinner');
-                $("#update_workout_file").fadeOut();
-                $("div.uploading-workout").fadeIn();
-            });
-        });
-    </script>
-  </metal:body-js>
-
-
 </html>
Index: ow/templates/user_list.pt
===================================================================
--- ow/templates/user_list.pt	(revision 8c2b0949ae91540ee5c8101b9d5ff39003773da3)
+++ ow/templates/user_list.pt	(revision 5ec3a0b5cf5640304a0953320daef2a28bbca9a5)
@@ -26,5 +26,5 @@
       </thead>
       <tal:r tal:repeat="user users">
-      <tr tal:attributes="id 'user-' + str(user.uid)">
+      <tr tal:attributes="id 'user-' + user.user_id">
         <td>${user.fullname}</td>
         <td>${user.email}</td>
Index: ow/templates/verify.pt
===================================================================
--- ow/templates/verify.pt	(revision 8c2b0949ae91540ee5c8101b9d5ff39003773da3)
+++ 	(revision )
@@ -1,40 +1,0 @@
-<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_anonymous.pt"
-      tal:attributes="lang request.locale_name">
-
-  <metal:content metal:fill-slot="content">
-
-    <div class="verify-account-content">
-
-      <div class="info">
-
-        <h1 i18n:translate="">Wrong verification code</h1>
-
-        <p i18n:translate="">
-          Your email hasn't been verified. Check the url and make sure you copied
-          it exactly as it was in the verification email.
-        </p>
-
-        <tal:not-logged-in tal:condition="not request.authenticated_userid">
-          <a href="" class="button button-action"
-             tal:attributes="href request.resource_url(request.root, 'login', query={'email': context.email} )"
-             i18n:translate="">Back to login</a>
-
-          <a href="" class="button button-action"
-             tal:attributes="href request.resource_url(context, 'resend-verification-link')"
-             i18n:translate="">Please send me the verification link again</a>
-
-        </tal:not-logged-in>
-
-      </div>
-
-    </div>
-
-  </metal:content>
-
-</html>
Index: ow/templates/workout-map.pt
===================================================================
--- ow/templates/workout-map.pt	(revision 8c2b0949ae91540ee5c8101b9d5ff39003773da3)
+++ 	(revision )
@@ -1,67 +1,0 @@
-<!DOCTYPE html>
-
-<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"
-      tal:attributes="lang request.locale_name">
-
-  <head>
-
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <meta name="description"
-          content="OpenWorkouts - tracking your workouts openly">
-    <meta name="author" content="The OpenWorkouts Project">
-    <title>OpenWorkouts - tracking your workouts openly</title>
-
-    <link rel="stylesheet"
-          href="${request.static_url('ow:static/css/main.css')}" />
-    <link rel="stylesheet"
-          href="${request.static_url('ow:static/css/openworkouts.css')}" />
-    <link rel="stylesheet" tal:condition="context.has_gpx"
-          href="${request.static_url('ow:static/components/Leaflet/leaflet.css')}" />
-
-    <style>
-     html, body, #full-map {
-	 height:100%;
-	 width:100%;
-	 padding:0px;
-	 margin:0px;
-     }
-    </style>
-
-  </head>
-
-  <body class="full-map">
-    <!--! Track map -->
-    <div id="full-map" tal:condition="context.has_gpx"></div>
-
-    <script src="${request.static_url('ow:static/components/Leaflet/leaflet.js')}"
-            tal:condition="context.has_gpx"></script>
-
-    <script src="${request.static_url('ow:static/components/leaflet-gpx/gpx.js')}"
-            tal:condition="context.has_gpx"></script>
-
-    <script src="${request.static_url('ow:static/js/ow.js')}"
-            tal:condition="context.has_gpx"></script>
-
-    <script type="text/javascript" tal:condition="context.has_gpx">
-     var workout_map = owjs.map({
-         map_id: 'full-map',
-         latitude: ${start_point['latitude']},
-         longitude: ${start_point['longitude']},
-         zoom: 11,
-         gpx_url: '${request.resource_url(context, 'gpx')}',
-         elevation: false,
-         zoom_control: false
-     });
-     workout_map.render();
-
-    </script>
-  </body>
-
-</html>
Index: ow/templates/workout.pt
===================================================================
--- ow/templates/workout.pt	(revision 8c2b0949ae91540ee5c8101b9d5ff39003773da3)
+++ ow/templates/workout.pt	(revision 5ec3a0b5cf5640304a0953320daef2a28bbca9a5)
@@ -16,6 +16,13 @@
     <link rel="stylesheet" tal:condition="context.has_gpx"
           href="${request.static_url('ow:static/components/Leaflet/leaflet.css')}" />
+
+    <!--!
     <link rel="stylesheet" tal:condition="context.has_gpx"
-          href="${request.static_url('ow:static/components/leaflet-elevation/leaflet-elevation.css')}" />
+          href="${request.static_url('ow:static/leaflet-elevation/leaflet.elevation.css')}" />
+
+    <link rel="stylesheet" tal:condition="context.has_gpx"
+          href="${request.static_url('ow:static/leaflet-openworkouts/leaflet.openworkouts.css')}" />
+    -->
+
   </metal:css>
 
@@ -26,123 +33,123 @@
   <metal:content metal:fill-slot="content">
 
+    <!--! Track map -->
+    <div id="map" tal:condition="context.has_gpx"></div>
 
-    <div class="workout-detail" id="workout">
-      <div class="workout-detail-resume">
-        <h3 tal:content="context.title"></h3>
-        <div id="" tal:attributes="id 'workout-' + context.workout_id + '-notes'">
-          <p tal:repeat="paragraph context.notes.split('\n')"
-             tal:content="paragraph"></p>
+    <!--! Additional map controls -->
+
+    <div id="ow-analysis">
+
+      <!--!
+          FIXME: the list of available charts should come from the workout
+          details, based on which data this workout has
+        -->
+      <!--! All those ids are needed for the leaflet openworkouts plugin -->
+      <tal:r tal:repeat="chart ['elevation', 'heartrate', 'cadence', 'temperature']">
+        <div id="ow-" tal:attributes="id 'ow-' + chart">
+          <div class="ow-average" id=""
+               tal:attributes="id 'ow-' + chart + '-average'"></div>
+          <div class="ow-chart" id=""
+               tal:attributes="id 'ow-' + chart + '-chart'"></div>
+          <div class="ow-current" id=""
+               tal:attributes="id 'ow-' + chart + '-current'"></div>
         </div>
-        <ul class="workout-options">
-          <li>
-            <a href="" i18n:translate=""
-               tal:attributes="href request.resource_url(context, 'edit')">
-              edit workout
-            </a>
-          </li>
-          <li>
-            <a href="" i18n:translate=""
-               tal:attributes="href request.resource_url(context, 'update-from-file')">
-              update with tracking file
-            </a>
-          </li>
-          <li class="owo-del"><a href="" i18n:translate=""
-                                 tal:attributes="href request.resource_url(context, 'delete')">
-            delete
-          </a>
-          </li>
-        </ul>
-      </div>
-      <div class="workout-detail-info">
-        <ul id="" tal:attributes="id 'workout-' + context.workout_id + '-details'"
-            tal:define="hr context.hr; cad context.cad; atemp context.atemp; timezone context.owner.timezone">
-          <li class="important" tal:condition="context.distance">
-            <span><tal:t i18n:translate="">Distance</tal:t></span>
-            <tal:c tal:content="context.rounded_distance"></tal:c> km
-          </li>
-          <li class="important">
-            <span><tal:t i18n:translate="">Duration</tal:t></span>
-            <!--! use the properly formatted duration instead of the timedelta object -->
-            <tal:c tal:content="context._duration"></tal:c>
-          </li>
-          <li class="important">
-            <span><tal:t i18n:translate="">Elevation</tal:t></span>
-            <tal:c tal:content="context.uphill"></tal:c> m
-          </li>
-
-          <li class="important">
-            <span><tal:t i18n:translate="">Start</tal:t></span>
-            <tal:c tal:content="context.start_in_timezone(timezone)"></tal:c>
-          </li>
-          <li tal:condition="context.speed">
-            <span><tal:t i18n:translate="">Speed</tal:t></span>
-            <span class="avg"><tal:t i18n:translate="">Avg.</tal:t>
-              <tal:c tal:content="round(context.speed['avg'], 1)"></tal:c> km/h</span>
-            <span class="max"><tal:t i18n:translate="">Max.</tal:t>
-              <tal:c tal:content="round(context.speed['max'], 1)"></tal:c> km/h</span>
-          </li>
-          <li tal:condition="hr">
-            <span><tal:t i18n:translate="">Heart Rate</tal:t></span>
-            <span class="avg"><tal:t i18n:translate="">Avg.</tal:t>
-              <tal:c tal:content="hr['avg']"></tal:c> bpm</span>
-            <span class="max"><tal:t i18n:translate="">Max.</tal:t>
-              <tal:c tal:content="hr['max']"></tal:c> bpm</span>
-          </li>
-          <li tal:condition="cad">
-            <span><tal:t i18n:translate="">Cadence</tal:t></span>
-            <span class="avg"><tal:t i18n:translate="">Avg.</tal:t>
-              <tal:c tal:content="cad['avg']"></tal:c></span>
-            <span class="max"><tal:t i18n:translate="">Max.</tal:t>
-              <tal:c tal:content="cad['max']"></tal:c></span>
-          </li>
-          <li tal:condition="atemp">
-            <span><tal:t i18n:translate="">Temperature</tal:t></span>
-            <span class="min"><tal:t i18n:translate="">Min.</tal:t>
-              <tal:c tal:content="atemp['min']"></tal:c> ℃</span>
-            <span class="avg"><tal:t i18n:translate="">Avg.</tal:t>
-              <tal:c tal:content="atemp['avg']"></tal:c> ℃</span>
-            <span class="max"><tal:t i18n:translate="">Max.</tal:t>
-              <tal:c tal:content="atemp['max']"></tal:c> ℃</span>
-          </li>
-        </ul>
-        <div id="elevation"></div>
-      </div>
+      </tal:r>
 
     </div>
-        <div id="map" tal:condition="context.has_gpx"></div>
 
+    <div id="workout">
+      <h3 tal:content="context.title"></h3>
+      <h4>
+        <a href="" i18n:translate=""
+           tal:attributes="href request.resource_url(context, 'edit')">
+          (edit workout)
+        </a> |
+        <a href="" i18n:translate=""
+           tal:attributes="href request.resource_url(context, 'update-from-file')">
+          (update with tracking file)
+        </a> |
+        <a href="" i18n:translate=""
+           tal:attributes="href request.resource_url(context, 'delete')">
+          (delete)
+        </a>
+      </h4>
+
+      <ul id="" tal:attributes="id 'workout-' + context.workout_id + '-details'"
+          tal:define="hr context.hr; cad context.cad">
+        <li>
+          <tal:t i18n:translate="">Start:</tal:t>
+          <tal:c tal:content="context.start"></tal:c>
+        </li>
+        <li>
+          <tal:t i18n:translate="">End:</tal:t>
+          <tal:c tal:content="context.end"></tal:c>
+        </li>
+        <li>
+          <tal:t i18n:translate="">Duration:</tal:t>
+          <tal:c tal:content="context.duration"></tal:c>
+        </li>
+        <li tal:condition="context.distance">
+          <tal:t i18n:translate="">Distance:</tal:t>
+          <tal:c tal:content="context.rounded_distance"></tal:c> km
+        </li>
+        <li tal:condition="hr">
+          <tal:t i18n:translate="">Heart Rate:</tal:t>
+          <tal:t i18n:translate="">Min.</tal:t>
+          <tal:c tal:content="hr['min']"></tal:c> bpm |
+          <tal:t i18n:translate="">Avg.</tal:t>
+          <tal:c tal:content="hr['avg']"></tal:c> bpm |
+          <tal:t i18n:translate="">Max.</tal:t>
+          <tal:c tal:content="hr['max']"></tal:c> bpm
+        </li>
+        <li tal:condition="cad">
+          <tal:t i18n:translate="">Cadence:</tal:t>
+          <tal:t i18n:translate="">Min.</tal:t>
+          <tal:c tal:content="cad['min']"></tal:c> |
+          <tal:t i18n:translate="">Avg.</tal:t>
+          <tal:c tal:content="cad['avg']"></tal:c> |
+          <tal:t i18n:translate="">Max.</tal:t>
+          <tal:c tal:content="cad['max']"></tal:c>
+        </li>
+      </ul>
+      <div id="" tal:content="context.notes"
+           tal:attributes="id 'workout-' + context.workout_id + '-notes'">
+      </div>
+    </div>
   </metal:content>
 
   <metal:body-js metal:fill-slot="body-js">
 
-    <script src="${request.static_url('ow:static/components/d3/d3.min.js')}"
+    <!--
+    <script src="//d3js.org/d3.v3.min.js" charset="utf-8"></script>
+    <script src="${request.static_url('ow:static/d3/d3.min.js')}"
             tal:condition="context.has_gpx"></script>
+    -->
 
     <script src="${request.static_url('ow:static/components/Leaflet/leaflet.js')}"
             tal:condition="context.has_gpx"></script>
 
-    <script src="${request.static_url('ow:static/components/leaflet-gpx/gpx.js')}"
+    <script src="${request.static_url('ow:static/leaflet-gpx/gpx.js')}"
             tal:condition="context.has_gpx"></script>
 
-    <script src="${request.static_url('ow:static/components/leaflet-elevation/leaflet-elevation.js')}"
+    <!--!
+    <script src="${request.static_url('ow:static/leaflet-elevation/leaflet.elevation.min.js')}"
             tal:condition="context.has_gpx"></script>
-
+    <script src="${request.static_url('ow:static/leaflet-openworkouts/leaflet.openworkouts.src.js')}"
+            tal:condition="context.has_gpx"></script>
     <script src="${request.static_url('ow:static/js/ow.js')}"
             tal:condition="context.has_gpx"></script>
+    -->
 
     <script type="text/javascript" tal:condition="context.has_gpx">
-     var workout_map = owjs.map({
-         map_id: 'map',
-         latitude: ${start_point['latitude']},
-         longitude: ${start_point['longitude']},
-         zoom: 11,
-         gpx_url: '${request.resource_url(context, 'gpx')}',
-         start_icon: '${request.static_url('ow:static/components/leaflet-gpx/pin-icon-start.png')}',
-         end_icon: '${request.static_url('ow:static/components/leaflet-gpx/pin-icon-end.png')}',
-         shadow: '${request.static_url('ow:static/components/leaflet-gpx/pin-shadow.png')}',
-         elevation: true,
-         zoom_control: true
-     });
-     workout_map.render();
+      var workout_map = owjs.map({
+          latitude: ${start_point['latitude']},
+          longitude: ${start_point['longitude']},
+          zoom: 11,
+          gpx_url: '${request.resource_url(context, 'gpx')}',
+          start_icon: '${request.static_url('ow:static/leaflet-gpx/pin-icon-start.png')}',
+          end_icon: '${request.static_url('ow:static/leaflet-gpx/pin-icon-end.png')}',
+          shadow: '${request.static_url('ow:static/leaflet-gpx/pin-shadow.png')}',
+      });
+      workout_map.render()
     </script>
   </metal:body-js>
