diff --git a/src/main/resources/static/analytics-dashboard-service.html b/src/main/resources/static/analytics-dashboard-service.html
deleted file mode 100644
index f7497ea..0000000
--- a/src/main/resources/static/analytics-dashboard-service.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<!DOCTYPE html>
-<html dir="ltr" lang="en-US">
-<head>
-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-    <title>GitHub plugin for Gerrit Code Review - Analytics Service control panel</title>
-
-    <link rel="stylesheet" href="css/analyticswizard.css">
-    <link rel="stylesheet" href="css/bootstrap.min.css">
-    <script type='text/javascript' src='js/jquery-3.3.1.min.js'></script>
-    <script type='text/javascript' src="js/bootstrap.min.js"></script>
-    <script type='text/javascript' src='js/analyticswizard.js'></script>
-    <script type='text/javascript' src='js/bootstrap-waitingfor.min.js'></script>
-</head>
-<body>
-
-<!--div.container start -->
-<div class="container">
-    <div class="page-header">
-        <h1>Dashboard analytics wizard</h1>
-    </div>
-    <div class="center">
-        Project name: <input id="input-project-name" type="text">
-    </div>
-    <input type="button" class="btn btn-primary" value="Start dashboard" onClick="dashboardService('up')"/>
-    <br><br>
-    <div id="success-alert" class="alert alert-success alert-trim" role="alert" style="display: none;"></div>
-    <div id="error-alert" class="alert-danger alert-trim" role="alert" style="display: none;"></div>
-</div>
-
-<!--div.container end -->
-</body>
-</html>
\ No newline at end of file
diff --git a/src/main/resources/static/analytics-dashboard.html b/src/main/resources/static/analytics-dashboard.html
index 77984b3..af9e042 100644
--- a/src/main/resources/static/analytics-dashboard.html
+++ b/src/main/resources/static/analytics-dashboard.html
@@ -6,9 +6,11 @@
 
     <link rel="stylesheet" href="css/analyticswizard.css">
     <link rel="stylesheet" href="css/bootstrap.min.css">
+    <script type='text/javascript' src='js/popper.min.js'></script>
     <script type='text/javascript' src='js/jquery-3.3.1.min.js'></script>
     <script type='text/javascript' src="js/bootstrap.min.js"></script>
     <script type='text/javascript' src='js/analyticswizard.js'></script>
+    <script type='text/javascript' src='js/bootstrap-waitingfor.min.js'></script>
 </head>
 <body>
 <!--div.container start -->
@@ -16,14 +18,73 @@
     <div class="page-header">
         <h1>Dashboard analytics wizard</h1>
     </div>
-    <div class="center">
-        Project name: <input id="input-project-name" type="text">
+    <hr style="border-width:3px;">
+    <div class="row">
+        <div class="col-lg-2">
+            <label >Dashboard name</label>
+        </div>
+        <div class="col-lg-2    ">
+            <input data-toggle="tooltip" title="Dashboard name" id="input-dashboard-name" type="text" required="true">
+        </div>
     </div>
-    <div id="config-section" hidden>
-        <div id="config-file">Config file: </div>
+    <hr>
+    <div class="row">
+        <div class="col-lg-2">
+            <label >Project prefix</label>
+        </div>
+        <div class="col-lg-3">
+            <input data-toggle="tooltip" title="Prefix of the projects to import, not a regular expression. I.e.: the 'gerrit/' prefix will import all the projects starting with 'gerrit/'" id="input-project-prefix" type="text">
+        </div>
+        <div class="col-lg-4">
+            <div class="dropdown">
+                <button class="btn btn-primary dropdown-toggle" type="button" id="aggregate" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">
+                    Aggregation type
+                </button>
+                <ul class="dropdown-menu" aria-labelledby="aggregate">
+                    <li><a href="#" data-value="email">E-Mail Only</a></li><span class="caret"></span>
+                    <li><a href="#" data-value="email_hour">Email per hour</a></li>
+                    <li><a href="#" data-value="email_day">Email per day</a></li>
+                    <li><a href="#" data-value="email_month">Email per month</a></li>
+                    <li><a href="#" data-value="email_year">Email per year</a></li>
+                </ul>
+            </div>
+        </div>
+
     </div>
-    <br>
-    <input type="button" class="btn btn-primary" value="Create dashboard configuration" onClick="submitDetailsForm()"/>
+    <hr>
+    <div class="row">
+        <div class="col-lg-2">
+            <label>Data time-frame</label>
+        </div>
+        <div class="col-lg-3">
+            <label >Since</label>
+            <input data-toggle="tooltip" title="Data collected from date" id="since" type="date" name="since" min="1000-01-01" max="3000-12-31" class="form-control">
+        </div>
+        <div class="col-lg-3">
+            <label >Until</label>
+            <input data-toggle="tooltip" title="Data collected to date" id="until" type="date" name="until" min="1000-01-01" max="3000-12-31" class="form-control">
+        </div>
+    </div>
+
+
+    <hr>
+    <div class="row">
+        <div class="col-lg-1">
+            <label >Username</label>
+        </div>
+        <div class="col-lg-3">
+            <input data-toggle="tooltip" title="Gerrit API Username" id="username" type="text">
+        </div>
+        <div class="col-lg-1">
+            <label >Password</label>
+        </div>
+        <div class="col-lg-3">
+            <input data-toggle="tooltip" title="Gerrit API Password" id="password" type="password" placeholder="Password">
+        </div>
+    </div>
+
+    <hr>
+    <input type="button" class="btn btn-primary" value="Create dashboard" onClick="submitDetailsForm()"/>
     <br><br>
     <div id="success-alert" class="alert alert-success alert-trim" role="alert" style="display: none;"></div>
     <div id="error-alert" class="alert-danger alert-trim" role="alert" style="display: none;"></div>
diff --git a/src/main/resources/static/css/analyticswizard.css b/src/main/resources/static/css/analyticswizard.css
index fcf0fbe..e8a9fdc 100644
--- a/src/main/resources/static/css/analyticswizard.css
+++ b/src/main/resources/static/css/analyticswizard.css
@@ -1,3 +1,15 @@
 .alert-trim {
   display: inline-block;
+}
+
+input:required:invalid, input:focus:invalid {
+    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACs0lEQVQ4T3VTTUhUURT+7pt5M29CncogiX4IaqNUJlQSUSBJRVpCuOhn5UKDCLRAy43tgnBRWaZmJOHO9tUii4oMLA11oRWhUePPTDqO7znOvHvPjXvHn8nowX335zvn3Hu+8x2GVZ9TfayAOK8yIIoE0TYpBQxOo4DoZpAtGQ97P6e7sKWNvFG6Zj6WbAJRheQupOAaYoxBqoXgUOcg3pZpB6pZV09c4+qnnW16AZE8RM4cQAIwPHowT2rWgwQUToK/Cc4HjqsgOoBTV/IILq8Q0TAg5V9O6QHUWkoJUnYub83qHLzInPrSAsblJz49BbiJ1K0+P8wjZ+DJKwQzDIjhXrg9z6CTUS9JJsBnpkCC9rJ47alWcuOVPDIOpkDTD29NEwK5+0FuUpEAw2siOtQLb0cDDMa0HY+EIJPxB8ypPf2VYuEd5MQ0YB49C+tCnSYwNvYNpmUhsHGz3v980oj1g6+0nbCjcGemR5h9rSQpI5MmJeIaCFTfhZFXCDv0A3ZoDAHLgic7BxmbtiLc9x6ZXbe0HSUcuJFQ8t8AV+7ByD2ARGQC8fEx+PwWvNk58G/IwcTHtwg+bVwdoOwLouGdwpnVgK/4HPzna5dT8FkWrMUURtpvYsvIu+UUxOzvYRa/XtpCC4kqRcoSifzyHazbXQjirhYS83gx2d8DetyAoN9MkRj+pUi8z+z6snyD835VFlUeVSbp9WF230mYuw7quscGPiBzoBtrLXOxjAvgM2EILvdoIcVrS1uJu5VKIMphtXjSVSkpJSTJ3eZg59CllJRrygOOJ/acCTpMjq30/h8pcy1luMnXmZ65E6xjdGGlmWrKAzbmbhtSVErOAeHqJlppJhfqXEpqzqLpq8p5uZnS29OuLs5nJCqlEEUEuV2SgEH8O0l66SHRltHeN5Bu/wdAUoPnYuKqIAAAAABJRU5ErkJggg==);
+    background-position: right top;
+    background-repeat: no-repeat;
+    -moz-box-shadow: none;
+}
+input:required:valid {
+    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACC0lEQVQ4T2NkQANcmipG0mHO6fymek4cUmLyIOnvz149+HDq8r4Xa3fM+Hr1wQVkLYxIHC7VhuzJkgEuSeiGIvOfr94x63brzAKQuSBxmAFcBvNad/Ib6tjg0wyT+3juyqELydUeIEPABqjW582V9sNvM7rBz9fumHmzbVoGI7+mipHRov6zxNgsyMrO8OvfX4avf/+AlZ+KyjVkVKvKmSkT4JlGyABRNg6GUkU9ho57Fxne/f4JVv509ZbpjFZr5tzmlJFSwWcASHOJki5D770rDK9+gcMODL48eHyT0fngpl+MrGysuAwAa1bRYei9e4Xh1c8fKMr+/vrzi9H5wJZfjKysYANE2NgZuFlYGR5++wJWKMoO0qzN0HvnKoZmkPzf339+MVotX3CLW0ZaFSTAzcLCUKWuyzD3wR2GL39+MxSpajH03b6GVTNI/df7j24wapQUzJDz9UmHuY2HhYWhUkOHgZmJkaHv5nWcmkHqH6/dOJWRW1XVwGb2zPPIngO5hI2JieH9r194I+dIYrI+OCFpFxbOlPX1IxiVyKY93rhh2tWJE7NhSZnTvHfiDiF9fTtC6QEk/+bShQOniwo8GRgYfiBnJk7tgtIJ8t6+eF3ycPPaaVcnTSwGaQYZhmwA2HIBVVUDGQ//NGEDQydOCUlFkNi3F0/uvT93Ye+Tbetnvb9//xKyKwGV2Lg8u4jMLgAAAABJRU5ErkJggg==);
+    background-position: right top;
+    background-repeat: no-repeat;
 }
\ No newline at end of file
diff --git a/src/main/resources/static/js/analyticswizard.js b/src/main/resources/static/js/analyticswizard.js
index 565a7d7..73cf24a 100644
--- a/src/main/resources/static/js/analyticswizard.js
+++ b/src/main/resources/static/js/analyticswizard.js
@@ -47,43 +47,75 @@
     window.location.replace(redirectLocation);
 }
 
-function submitDetailsForm() {
-    var projectName = encodeURIComponent($("#input-project-name").val());
-    var requestBody = {
-      dashboard_name: projectName,
-      etl_config: {
-        aggregate: "email"
-      }
-    }
-    $.ajax({
-      type : "PUT",
-      url : `/a/projects/${projectName}/analytics-wizard~stack`,
-      dataType: 'application/json',
-      // Initially project-dashboard is a 1 to 1 relationship
-      data: JSON.stringify(requestBody),
-      contentType:"application/json; charset=utf-8",
-      // Need to catch the status code since Gerrit doesn't return
-      // a well formed JSON, hence Ajax treats it as an error
-      statusCode: {
-        201: showSuccessWithText("Configuration created successfully")
-      },
-      error: function(jqXHR, textStatus, errorThrown) {
-        if(jqXHR.status != 201) {
-          showFailureWithText("Error creating configuration: " + errorThrown)
-        }
+function getRequestBody() {
+  var etlConfigRaw = {
+    aggregate: $("#aggregate").val(),
+    since: $("#since").val(),
+    until: $("#until").val(),
+    project_prefix: $("#input-project-prefix").val(),
+    username: $("#username").val(),
+    password: $("#password").val()
+  }
+
+  var etlConfig = {};
+  Object.
+    keys(etlConfigRaw).
+    forEach((key) => {
+      if (etlConfigRaw[key]) {
+        etlConfig[key] = etlConfigRaw[key];
       }
     });
+
+  var requestBody = {
+    dashboard_name: $("#input-dashboard-name").val(),
+    etl_config: etlConfig
+  }
+  console.log(`Request body: ${JSON.stringify(requestBody)}`);
+  return requestBody;
+}
+
+function submitDetailsForm() {
+    // Hardcoding All-Projects just to get access to the Gerrit Rest API
+    // A dashboard can span across multiple projects.
+    var projectName = encodeURIComponent("All-Projects");
+    var requestBody = getRequestBody();
+    if (!requestBody.dashboard_name) {
+      showFailureWithText("Dashboard name must be defined!")
+    } else {
+      $.ajax({
+        type : "PUT",
+        url : `/a/projects/${projectName}/analytics-wizard~stack`,
+        dataType: 'application/json',
+        // Initially project-dashboard is a 1 to 1 relationship
+        data: JSON.stringify(requestBody),
+        contentType:"application/json; charset=utf-8",
+        // Need to catch the status code since Gerrit doesn't return
+        // a well formed JSON, hence Ajax treats it as an error
+        statusCode: {
+          201: dashboardService('up')
+        },
+        error: function(jqXHR, textStatus, errorThrown) {
+          if(jqXHR.status != 201) {
+            showFailureWithText("Error creating configuration: " + errorThrown)
+          }
+        }
+      });
+    }
 }
 
 function dashboardService(command) {
-    var projectName = encodeURIComponent($("#input-project-name").val());
+    var projectName = encodeURIComponent("All-Projects");
     hideAllAlerts();
+    var requestBody = {
+      action: command,
+      dashboard_name: $("#input-dashboard-name").val()
+    };
     $.ajax({
       type : "POST",
       url : `/a/projects/${projectName}/analytics-wizard~server`,
       dataType: 'application/json',
       // Initially project-dashboard is a 1 to 1 relationship
-      data: "{'action': '" + command + "'}",
+      data: JSON.stringify(requestBody),
       contentType:"application/json; charset=utf-8",
       // Need to catch the status code since Gerrit doesn't return
       // a well formed JSON, hence Ajax treats it as an error
@@ -99,7 +131,7 @@
 }
 
 function checkStatusRequest() {
-    var projectName = encodeURIComponent($("#input-project-name").val());
+    var projectName = encodeURIComponent("All-Projects");
     $.ajax({
       type : "GET",
       url : `/a/projects/${projectName}/analytics-wizard~status`,
@@ -119,6 +151,11 @@
 }
 
 $(document).ready(function () {
+  $(".dropdown-menu li a").click(function(){
+    $(this).parents(".dropdown").find('.btn').html($(this).text() + ' <span class="caret"></span>');
+    $(this).parents(".dropdown").find('.btn').val($(this).data('value'));
+  });
+  $('[data-toggle="tooltip"]').tooltip();
   $.ajaxSetup({
       dataFilter: function(data, type) {
         //Strip out Gerrit API prefix
@@ -138,4 +175,5 @@
         return data;
       }
   });
-});
\ No newline at end of file
+});
+
diff --git a/src/main/resources/static/js/popper.min.js b/src/main/resources/static/js/popper.min.js
new file mode 100644
index 0000000..0f20d2a
--- /dev/null
+++ b/src/main/resources/static/js/popper.min.js
@@ -0,0 +1,5 @@
+/*
+ Copyright (C) Federico Zivolo 2017
+ Distributed under the MIT License (license terms are at http://opensource.org/licenses/MIT).
+ */(function(e,t){'object'==typeof exports&&'undefined'!=typeof module?module.exports=t():'function'==typeof define&&define.amd?define(t):e.Popper=t()})(this,function(){'use strict';function e(e){return e&&'[object Function]'==={}.toString.call(e)}function t(e,t){if(1!==e.nodeType)return[];var o=getComputedStyle(e,null);return t?o[t]:o}function o(e){return'HTML'===e.nodeName?e:e.parentNode||e.host}function n(e){if(!e)return document.body;switch(e.nodeName){case'HTML':case'BODY':return e.ownerDocument.body;case'#document':return e.body;}var i=t(e),r=i.overflow,p=i.overflowX,s=i.overflowY;return /(auto|scroll)/.test(r+s+p)?e:n(o(e))}function r(e){var o=e&&e.offsetParent,i=o&&o.nodeName;return i&&'BODY'!==i&&'HTML'!==i?-1!==['TD','TABLE'].indexOf(o.nodeName)&&'static'===t(o,'position')?r(o):o:e?e.ownerDocument.documentElement:document.documentElement}function p(e){var t=e.nodeName;return'BODY'!==t&&('HTML'===t||r(e.firstElementChild)===e)}function s(e){return null===e.parentNode?e:s(e.parentNode)}function d(e,t){if(!e||!e.nodeType||!t||!t.nodeType)return document.documentElement;var o=e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING,i=o?e:t,n=o?t:e,a=document.createRange();a.setStart(i,0),a.setEnd(n,0);var l=a.commonAncestorContainer;if(e!==l&&t!==l||i.contains(n))return p(l)?l:r(l);var f=s(e);return f.host?d(f.host,t):d(e,s(t).host)}function a(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:'top',o='top'===t?'scrollTop':'scrollLeft',i=e.nodeName;if('BODY'===i||'HTML'===i){var n=e.ownerDocument.documentElement,r=e.ownerDocument.scrollingElement||n;return r[o]}return e[o]}function l(e,t){var o=2<arguments.length&&void 0!==arguments[2]&&arguments[2],i=a(t,'top'),n=a(t,'left'),r=o?-1:1;return e.top+=i*r,e.bottom+=i*r,e.left+=n*r,e.right+=n*r,e}function f(e,t){var o='x'===t?'Left':'Top',i='Left'==o?'Right':'Bottom';return parseFloat(e['border'+o+'Width'],10)+parseFloat(e['border'+i+'Width'],10)}function m(e,t,o,i){return J(t['offset'+e],t['scroll'+e],o['client'+e],o['offset'+e],o['scroll'+e],ie()?o['offset'+e]+i['margin'+('Height'===e?'Top':'Left')]+i['margin'+('Height'===e?'Bottom':'Right')]:0)}function h(){var e=document.body,t=document.documentElement,o=ie()&&getComputedStyle(t);return{height:m('Height',e,t,o),width:m('Width',e,t,o)}}function c(e){return se({},e,{right:e.left+e.width,bottom:e.top+e.height})}function g(e){var o={};if(ie())try{o=e.getBoundingClientRect();var i=a(e,'top'),n=a(e,'left');o.top+=i,o.left+=n,o.bottom+=i,o.right+=n}catch(e){}else o=e.getBoundingClientRect();var r={left:o.left,top:o.top,width:o.right-o.left,height:o.bottom-o.top},p='HTML'===e.nodeName?h():{},s=p.width||e.clientWidth||r.right-r.left,d=p.height||e.clientHeight||r.bottom-r.top,l=e.offsetWidth-s,m=e.offsetHeight-d;if(l||m){var g=t(e);l-=f(g,'x'),m-=f(g,'y'),r.width-=l,r.height-=m}return c(r)}function u(e,o){var i=ie(),r='HTML'===o.nodeName,p=g(e),s=g(o),d=n(e),a=t(o),f=parseFloat(a.borderTopWidth,10),m=parseFloat(a.borderLeftWidth,10),h=c({top:p.top-s.top-f,left:p.left-s.left-m,width:p.width,height:p.height});if(h.marginTop=0,h.marginLeft=0,!i&&r){var u=parseFloat(a.marginTop,10),b=parseFloat(a.marginLeft,10);h.top-=f-u,h.bottom-=f-u,h.left-=m-b,h.right-=m-b,h.marginTop=u,h.marginLeft=b}return(i?o.contains(d):o===d&&'BODY'!==d.nodeName)&&(h=l(h,o)),h}function b(e){var t=e.ownerDocument.documentElement,o=u(e,t),i=J(t.clientWidth,window.innerWidth||0),n=J(t.clientHeight,window.innerHeight||0),r=a(t),p=a(t,'left'),s={top:r-o.top+o.marginTop,left:p-o.left+o.marginLeft,width:i,height:n};return c(s)}function w(e){var i=e.nodeName;return'BODY'===i||'HTML'===i?!1:'fixed'===t(e,'position')||w(o(e))}function y(e,t,i,r){var p={top:0,left:0},s=d(e,t);if('viewport'===r)p=b(s);else{var a;'scrollParent'===r?(a=n(o(t)),'BODY'===a.nodeName&&(a=e.ownerDocument.documentElement)):'window'===r?a=e.ownerDocument.documentElement:a=r;var l=u(a,s);if('HTML'===a.nodeName&&!w(s)){var f=h(),m=f.height,c=f.width;p.top+=l.top-l.marginTop,p.bottom=m+l.top,p.left+=l.left-l.marginLeft,p.right=c+l.left}else p=l}return p.left+=i,p.top+=i,p.right-=i,p.bottom-=i,p}function E(e){var t=e.width,o=e.height;return t*o}function v(e,t,o,i,n){var r=5<arguments.length&&void 0!==arguments[5]?arguments[5]:0;if(-1===e.indexOf('auto'))return e;var p=y(o,i,r,n),s={top:{width:p.width,height:t.top-p.top},right:{width:p.right-t.right,height:p.height},bottom:{width:p.width,height:p.bottom-t.bottom},left:{width:t.left-p.left,height:p.height}},d=Object.keys(s).map(function(e){return se({key:e},s[e],{area:E(s[e])})}).sort(function(e,t){return t.area-e.area}),a=d.filter(function(e){var t=e.width,i=e.height;return t>=o.clientWidth&&i>=o.clientHeight}),l=0<a.length?a[0].key:d[0].key,f=e.split('-')[1];return l+(f?'-'+f:'')}function O(e,t,o){var i=d(t,o);return u(o,i)}function L(e){var t=getComputedStyle(e),o=parseFloat(t.marginTop)+parseFloat(t.marginBottom),i=parseFloat(t.marginLeft)+parseFloat(t.marginRight),n={width:e.offsetWidth+i,height:e.offsetHeight+o};return n}function x(e){var t={left:'right',right:'left',bottom:'top',top:'bottom'};return e.replace(/left|right|bottom|top/g,function(e){return t[e]})}function S(e,t,o){o=o.split('-')[0];var i=L(e),n={width:i.width,height:i.height},r=-1!==['right','left'].indexOf(o),p=r?'top':'left',s=r?'left':'top',d=r?'height':'width',a=r?'width':'height';return n[p]=t[p]+t[d]/2-i[d]/2,n[s]=o===s?t[s]-i[a]:t[x(s)],n}function T(e,t){return Array.prototype.find?e.find(t):e.filter(t)[0]}function D(e,t,o){if(Array.prototype.findIndex)return e.findIndex(function(e){return e[t]===o});var i=T(e,function(e){return e[t]===o});return e.indexOf(i)}function C(t,o,i){var n=void 0===i?t:t.slice(0,D(t,'name',i));return n.forEach(function(t){t['function']&&console.warn('`modifier.function` is deprecated, use `modifier.fn`!');var i=t['function']||t.fn;t.enabled&&e(i)&&(o.offsets.popper=c(o.offsets.popper),o.offsets.reference=c(o.offsets.reference),o=i(o,t))}),o}function N(){if(!this.state.isDestroyed){var e={instance:this,styles:{},arrowStyles:{},attributes:{},flipped:!1,offsets:{}};e.offsets.reference=O(this.state,this.popper,this.reference),e.placement=v(this.options.placement,e.offsets.reference,this.popper,this.reference,this.options.modifiers.flip.boundariesElement,this.options.modifiers.flip.padding),e.originalPlacement=e.placement,e.offsets.popper=S(this.popper,e.offsets.reference,e.placement),e.offsets.popper.position='absolute',e=C(this.modifiers,e),this.state.isCreated?this.options.onUpdate(e):(this.state.isCreated=!0,this.options.onCreate(e))}}function k(e,t){return e.some(function(e){var o=e.name,i=e.enabled;return i&&o===t})}function W(e){for(var t=[!1,'ms','Webkit','Moz','O'],o=e.charAt(0).toUpperCase()+e.slice(1),n=0;n<t.length-1;n++){var i=t[n],r=i?''+i+o:e;if('undefined'!=typeof document.body.style[r])return r}return null}function P(){return this.state.isDestroyed=!0,k(this.modifiers,'applyStyle')&&(this.popper.removeAttribute('x-placement'),this.popper.style.left='',this.popper.style.position='',this.popper.style.top='',this.popper.style[W('transform')]=''),this.disableEventListeners(),this.options.removeOnDestroy&&this.popper.parentNode.removeChild(this.popper),this}function B(e){var t=e.ownerDocument;return t?t.defaultView:window}function H(e,t,o,i){var r='BODY'===e.nodeName,p=r?e.ownerDocument.defaultView:e;p.addEventListener(t,o,{passive:!0}),r||H(n(p.parentNode),t,o,i),i.push(p)}function A(e,t,o,i){o.updateBound=i,B(e).addEventListener('resize',o.updateBound,{passive:!0});var r=n(e);return H(r,'scroll',o.updateBound,o.scrollParents),o.scrollElement=r,o.eventsEnabled=!0,o}function I(){this.state.eventsEnabled||(this.state=A(this.reference,this.options,this.state,this.scheduleUpdate))}function M(e,t){return B(e).removeEventListener('resize',t.updateBound),t.scrollParents.forEach(function(e){e.removeEventListener('scroll',t.updateBound)}),t.updateBound=null,t.scrollParents=[],t.scrollElement=null,t.eventsEnabled=!1,t}function R(){this.state.eventsEnabled&&(cancelAnimationFrame(this.scheduleUpdate),this.state=M(this.reference,this.state))}function U(e){return''!==e&&!isNaN(parseFloat(e))&&isFinite(e)}function Y(e,t){Object.keys(t).forEach(function(o){var i='';-1!==['width','height','top','right','bottom','left'].indexOf(o)&&U(t[o])&&(i='px'),e.style[o]=t[o]+i})}function j(e,t){Object.keys(t).forEach(function(o){var i=t[o];!1===i?e.removeAttribute(o):e.setAttribute(o,t[o])})}function F(e,t,o){var i=T(e,function(e){var o=e.name;return o===t}),n=!!i&&e.some(function(e){return e.name===o&&e.enabled&&e.order<i.order});if(!n){var r='`'+t+'`';console.warn('`'+o+'`'+' modifier is required by '+r+' modifier in order to work, be sure to include it before '+r+'!')}return n}function K(e){return'end'===e?'start':'start'===e?'end':e}function q(e){var t=1<arguments.length&&void 0!==arguments[1]&&arguments[1],o=ae.indexOf(e),i=ae.slice(o+1).concat(ae.slice(0,o));return t?i.reverse():i}function V(e,t,o,i){var n=e.match(/((?:\-|\+)?\d*\.?\d*)(.*)/),r=+n[1],p=n[2];if(!r)return e;if(0===p.indexOf('%')){var s;switch(p){case'%p':s=o;break;case'%':case'%r':default:s=i;}var d=c(s);return d[t]/100*r}if('vh'===p||'vw'===p){var a;return a='vh'===p?J(document.documentElement.clientHeight,window.innerHeight||0):J(document.documentElement.clientWidth,window.innerWidth||0),a/100*r}return r}function z(e,t,o,i){var n=[0,0],r=-1!==['right','left'].indexOf(i),p=e.split(/(\+|\-)/).map(function(e){return e.trim()}),s=p.indexOf(T(p,function(e){return-1!==e.search(/,|\s/)}));p[s]&&-1===p[s].indexOf(',')&&console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.');var d=/\s*,\s*|\s+/,a=-1===s?[p]:[p.slice(0,s).concat([p[s].split(d)[0]]),[p[s].split(d)[1]].concat(p.slice(s+1))];return a=a.map(function(e,i){var n=(1===i?!r:r)?'height':'width',p=!1;return e.reduce(function(e,t){return''===e[e.length-1]&&-1!==['+','-'].indexOf(t)?(e[e.length-1]=t,p=!0,e):p?(e[e.length-1]+=t,p=!1,e):e.concat(t)},[]).map(function(e){return V(e,n,t,o)})}),a.forEach(function(e,t){e.forEach(function(o,i){U(o)&&(n[t]+=o*('-'===e[i-1]?-1:1))})}),n}function G(e,t){var o,i=t.offset,n=e.placement,r=e.offsets,p=r.popper,s=r.reference,d=n.split('-')[0];return o=U(+i)?[+i,0]:z(i,p,s,d),'left'===d?(p.top+=o[0],p.left-=o[1]):'right'===d?(p.top+=o[0],p.left+=o[1]):'top'===d?(p.left+=o[0],p.top-=o[1]):'bottom'===d&&(p.left+=o[0],p.top+=o[1]),e.popper=p,e}for(var _=Math.min,X=Math.floor,J=Math.max,Q='undefined'!=typeof window&&'undefined'!=typeof document,Z=['Edge','Trident','Firefox'],$=0,ee=0;ee<Z.length;ee+=1)if(Q&&0<=navigator.userAgent.indexOf(Z[ee])){$=1;break}var i,te=Q&&window.Promise,oe=te?function(e){var t=!1;return function(){t||(t=!0,window.Promise.resolve().then(function(){t=!1,e()}))}}:function(e){var t=!1;return function(){t||(t=!0,setTimeout(function(){t=!1,e()},$))}},ie=function(){return void 0==i&&(i=-1!==navigator.appVersion.indexOf('MSIE 10')),i},ne=function(e,t){if(!(e instanceof t))throw new TypeError('Cannot call a class as a function')},re=function(){function e(e,t){for(var o,n=0;n<t.length;n++)o=t[n],o.enumerable=o.enumerable||!1,o.configurable=!0,'value'in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}return function(t,o,i){return o&&e(t.prototype,o),i&&e(t,i),t}}(),pe=function(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e},se=Object.assign||function(e){for(var t,o=1;o<arguments.length;o++)for(var i in t=arguments[o],t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e},de=['auto-start','auto','auto-end','top-start','top','top-end','right-start','right','right-end','bottom-end','bottom','bottom-start','left-end','left','left-start'],ae=de.slice(3),le={FLIP:'flip',CLOCKWISE:'clockwise',COUNTERCLOCKWISE:'counterclockwise'},fe=function(){function t(o,i){var n=this,r=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{};ne(this,t),this.scheduleUpdate=function(){return requestAnimationFrame(n.update)},this.update=oe(this.update.bind(this)),this.options=se({},t.Defaults,r),this.state={isDestroyed:!1,isCreated:!1,scrollParents:[]},this.reference=o&&o.jquery?o[0]:o,this.popper=i&&i.jquery?i[0]:i,this.options.modifiers={},Object.keys(se({},t.Defaults.modifiers,r.modifiers)).forEach(function(e){n.options.modifiers[e]=se({},t.Defaults.modifiers[e]||{},r.modifiers?r.modifiers[e]:{})}),this.modifiers=Object.keys(this.options.modifiers).map(function(e){return se({name:e},n.options.modifiers[e])}).sort(function(e,t){return e.order-t.order}),this.modifiers.forEach(function(t){t.enabled&&e(t.onLoad)&&t.onLoad(n.reference,n.popper,n.options,t,n.state)}),this.update();var p=this.options.eventsEnabled;p&&this.enableEventListeners(),this.state.eventsEnabled=p}return re(t,[{key:'update',value:function(){return N.call(this)}},{key:'destroy',value:function(){return P.call(this)}},{key:'enableEventListeners',value:function(){return I.call(this)}},{key:'disableEventListeners',value:function(){return R.call(this)}}]),t}();return fe.Utils=('undefined'==typeof window?global:window).PopperUtils,fe.placements=de,fe.Defaults={placement:'bottom',eventsEnabled:!0,removeOnDestroy:!1,onCreate:function(){},onUpdate:function(){},modifiers:{shift:{order:100,enabled:!0,fn:function(e){var t=e.placement,o=t.split('-')[0],i=t.split('-')[1];if(i){var n=e.offsets,r=n.reference,p=n.popper,s=-1!==['bottom','top'].indexOf(o),d=s?'left':'top',a=s?'width':'height',l={start:pe({},d,r[d]),end:pe({},d,r[d]+r[a]-p[a])};e.offsets.popper=se({},p,l[i])}return e}},offset:{order:200,enabled:!0,fn:G,offset:0},preventOverflow:{order:300,enabled:!0,fn:function(e,t){var o=t.boundariesElement||r(e.instance.popper);e.instance.reference===o&&(o=r(o));var i=y(e.instance.popper,e.instance.reference,t.padding,o);t.boundaries=i;var n=t.priority,p=e.offsets.popper,s={primary:function(e){var o=p[e];return p[e]<i[e]&&!t.escapeWithReference&&(o=J(p[e],i[e])),pe({},e,o)},secondary:function(e){var o='right'===e?'left':'top',n=p[o];return p[e]>i[e]&&!t.escapeWithReference&&(n=_(p[o],i[e]-('right'===e?p.width:p.height))),pe({},o,n)}};return n.forEach(function(e){var t=-1===['left','top'].indexOf(e)?'secondary':'primary';p=se({},p,s[t](e))}),e.offsets.popper=p,e},priority:['left','right','top','bottom'],padding:5,boundariesElement:'scrollParent'},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,o=t.popper,i=t.reference,n=e.placement.split('-')[0],r=X,p=-1!==['top','bottom'].indexOf(n),s=p?'right':'bottom',d=p?'left':'top',a=p?'width':'height';return o[s]<r(i[d])&&(e.offsets.popper[d]=r(i[d])-o[a]),o[d]>r(i[s])&&(e.offsets.popper[d]=r(i[s])),e}},arrow:{order:500,enabled:!0,fn:function(e,o){var i;if(!F(e.instance.modifiers,'arrow','keepTogether'))return e;var n=o.element;if('string'==typeof n){if(n=e.instance.popper.querySelector(n),!n)return e;}else if(!e.instance.popper.contains(n))return console.warn('WARNING: `arrow.element` must be child of its popper element!'),e;var r=e.placement.split('-')[0],p=e.offsets,s=p.popper,d=p.reference,a=-1!==['left','right'].indexOf(r),l=a?'height':'width',f=a?'Top':'Left',m=f.toLowerCase(),h=a?'left':'top',g=a?'bottom':'right',u=L(n)[l];d[g]-u<s[m]&&(e.offsets.popper[m]-=s[m]-(d[g]-u)),d[m]+u>s[g]&&(e.offsets.popper[m]+=d[m]+u-s[g]),e.offsets.popper=c(e.offsets.popper);var b=d[m]+d[l]/2-u/2,w=t(e.instance.popper),y=parseFloat(w['margin'+f],10),E=parseFloat(w['border'+f+'Width'],10),v=b-e.offsets.popper[m]-y-E;return v=J(_(s[l]-u,v),0),e.arrowElement=n,e.offsets.arrow=(i={},pe(i,m,Math.round(v)),pe(i,h,''),i),e},element:'[x-arrow]'},flip:{order:600,enabled:!0,fn:function(e,t){if(k(e.instance.modifiers,'inner'))return e;if(e.flipped&&e.placement===e.originalPlacement)return e;var o=y(e.instance.popper,e.instance.reference,t.padding,t.boundariesElement),i=e.placement.split('-')[0],n=x(i),r=e.placement.split('-')[1]||'',p=[];switch(t.behavior){case le.FLIP:p=[i,n];break;case le.CLOCKWISE:p=q(i);break;case le.COUNTERCLOCKWISE:p=q(i,!0);break;default:p=t.behavior;}return p.forEach(function(s,d){if(i!==s||p.length===d+1)return e;i=e.placement.split('-')[0],n=x(i);var a=e.offsets.popper,l=e.offsets.reference,f=X,m='left'===i&&f(a.right)>f(l.left)||'right'===i&&f(a.left)<f(l.right)||'top'===i&&f(a.bottom)>f(l.top)||'bottom'===i&&f(a.top)<f(l.bottom),h=f(a.left)<f(o.left),c=f(a.right)>f(o.right),g=f(a.top)<f(o.top),u=f(a.bottom)>f(o.bottom),b='left'===i&&h||'right'===i&&c||'top'===i&&g||'bottom'===i&&u,w=-1!==['top','bottom'].indexOf(i),y=!!t.flipVariations&&(w&&'start'===r&&h||w&&'end'===r&&c||!w&&'start'===r&&g||!w&&'end'===r&&u);(m||b||y)&&(e.flipped=!0,(m||b)&&(i=p[d+1]),y&&(r=K(r)),e.placement=i+(r?'-'+r:''),e.offsets.popper=se({},e.offsets.popper,S(e.instance.popper,e.offsets.reference,e.placement)),e=C(e.instance.modifiers,e,'flip'))}),e},behavior:'flip',padding:5,boundariesElement:'viewport'},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,o=t.split('-')[0],i=e.offsets,n=i.popper,r=i.reference,p=-1!==['left','right'].indexOf(o),s=-1===['top','left'].indexOf(o);return n[p?'left':'top']=r[o]-(s?n[p?'width':'height']:0),e.placement=x(t),e.offsets.popper=c(n),e}},hide:{order:800,enabled:!0,fn:function(e){if(!F(e.instance.modifiers,'hide','preventOverflow'))return e;var t=e.offsets.reference,o=T(e.instance.modifiers,function(e){return'preventOverflow'===e.name}).boundaries;if(t.bottom<o.top||t.left>o.right||t.top>o.bottom||t.right<o.left){if(!0===e.hide)return e;e.hide=!0,e.attributes['x-out-of-boundaries']=''}else{if(!1===e.hide)return e;e.hide=!1,e.attributes['x-out-of-boundaries']=!1}return e}},computeStyle:{order:850,enabled:!0,fn:function(e,t){var o=t.x,i=t.y,n=e.offsets.popper,p=T(e.instance.modifiers,function(e){return'applyStyle'===e.name}).gpuAcceleration;void 0!==p&&console.warn('WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!');var s,d,a=void 0===p?t.gpuAcceleration:p,l=r(e.instance.popper),f=g(l),m={position:n.position},h={left:X(n.left),top:X(n.top),bottom:X(n.bottom),right:X(n.right)},c='bottom'===o?'top':'bottom',u='right'===i?'left':'right',b=W('transform');if(d='bottom'==c?-f.height+h.bottom:h.top,s='right'==u?-f.width+h.right:h.left,a&&b)m[b]='translate3d('+s+'px, '+d+'px, 0)',m[c]=0,m[u]=0,m.willChange='transform';else{var w='bottom'==c?-1:1,y='right'==u?-1:1;m[c]=d*w,m[u]=s*y,m.willChange=c+', '+u}var E={"x-placement":e.placement};return e.attributes=se({},E,e.attributes),e.styles=se({},m,e.styles),e.arrowStyles=se({},e.offsets.arrow,e.arrowStyles),e},gpuAcceleration:!0,x:'bottom',y:'right'},applyStyle:{order:900,enabled:!0,fn:function(e){return Y(e.instance.popper,e.styles),j(e.instance.popper,e.attributes),e.arrowElement&&Object.keys(e.arrowStyles).length&&Y(e.arrowElement,e.arrowStyles),e},onLoad:function(e,t,o,i,n){var r=O(n,t,e),p=v(o.placement,r,t,e,o.modifiers.flip.boundariesElement,o.modifiers.flip.padding);return t.setAttribute('x-placement',p),Y(t,{position:'absolute'}),o},gpuAcceleration:void 0}}},fe});
+//# sourceMappingURL=popper.min.js.map
diff --git a/src/main/scala/com/googlesource/gerrit/plugins/analytics/wizard/AnalyticsWizardActions.scala b/src/main/scala/com/googlesource/gerrit/plugins/analytics/wizard/AnalyticsWizardActions.scala
index 3eba31c..835fd77 100644
--- a/src/main/scala/com/googlesource/gerrit/plugins/analytics/wizard/AnalyticsWizardActions.scala
+++ b/src/main/scala/com/googlesource/gerrit/plugins/analytics/wizard/AnalyticsWizardActions.scala
@@ -15,6 +15,7 @@
 import java.net.URLEncoder
 import java.nio.charset.StandardCharsets.UTF_8
 import java.nio.file.Path
+
 import com.google.common.io.ByteStreams
 import com.google.gerrit.extensions.annotations.PluginData
 import com.google.gerrit.extensions.restapi.{
@@ -36,6 +37,7 @@
 import com.spotify.docker.client.messages.ContainerInfo
 import com.spotify.docker.client.{DefaultDockerClient, DockerClient}
 import org.eclipse.jgit.lib.Config
+
 import scala.util.{Failure, Success}
 case class Input(dashboardName: String, etlConfig: ETLConfigRaw)
 class PutAnalyticsStack @Inject()(@PluginData val dataPath: Path,
@@ -54,8 +56,8 @@
         configHelper.getGerritLocalAddress match {
           case Success(gerritLocalUrl) =>
             AnalyticDashboardSetup(
-              projectName,
-              dataPath.resolve(s"docker-compose.$encodedName.yaml"),
+              input.dashboardName,
+              dataPath.resolve(s"docker-compose.${input.dashboardName}.yaml"),
               gerritLocalUrl
             ).createDashboardSetupFile()
             Response.created(s"Dashboard configuration created for $encodedName!")
@@ -68,13 +70,12 @@
     )
   }
 }
-class DockerComposeCommand(var action: String)
+class DockerComposeCommand(var action: String, var dashboardName: String)
 class PostAnalyticsStack @Inject()(@PluginData val dataPath: Path)
     extends RestModifyView[ProjectResource, DockerComposeCommand] {
   override def apply(resource: ProjectResource, input: DockerComposeCommand): Response[String] = {
-    val projectName = resource.getName
     val encodedName = AnalyticsWizardActions
-      .encodedName(projectName)
+      .encodedName(input.dashboardName)
     val pb = new ProcessBuilder(
       "docker-compose",
       "-f",
diff --git a/src/main/scala/com/googlesource/gerrit/plugins/analytics/wizard/model/ETLConfig.scala b/src/main/scala/com/googlesource/gerrit/plugins/analytics/wizard/model/ETLConfig.scala
index 11a1ab2..2766d45 100644
--- a/src/main/scala/com/googlesource/gerrit/plugins/analytics/wizard/model/ETLConfig.scala
+++ b/src/main/scala/com/googlesource/gerrit/plugins/analytics/wizard/model/ETLConfig.scala
@@ -17,7 +17,6 @@
 import java.time.LocalDate
 import java.time.format.DateTimeFormatter
 
-import com.googlesource.gerrit.plugins.analytics.wizard.model.AggregationType.Email
 import enumeratum._
 
 import scala.util.{Failure, Success, Try}
