diff --git a/homeassistant/components/frontend/version.py b/homeassistant/components/frontend/version.py
index 943074beb40..0d649344862 100644
--- a/homeassistant/components/frontend/version.py
+++ b/homeassistant/components/frontend/version.py
@@ -12,7 +12,7 @@ FINGERPRINTS = {
     "panels/ha-panel-dev-service.html": "415552027cb083badeff5f16080410ed",
     "panels/ha-panel-dev-state.html": "d70314913b8923d750932367b1099750",
     "panels/ha-panel-dev-template.html": "567fbf86735e1b891e40c2f4060fec9b",
-    "panels/ha-panel-hassio.html": "333f86e5f516b31e52365e412deb7fdc",
+    "panels/ha-panel-hassio.html": "23d175b6744c20e2fdf475b6efdaa1d3",
     "panels/ha-panel-history.html": "89062c48c76206cad1cec14ddbb1cbb1",
     "panels/ha-panel-iframe.html": "d920f0aa3c903680f2f8795e2255daab",
     "panels/ha-panel-logbook.html": "6dd6a16f52117318b202e60f98400163",
diff --git a/homeassistant/components/frontend/www_static/home-assistant-polymer b/homeassistant/components/frontend/www_static/home-assistant-polymer
index f020e60b67e..9e7dc4a921f 160000
--- a/homeassistant/components/frontend/www_static/home-assistant-polymer
+++ b/homeassistant/components/frontend/www_static/home-assistant-polymer
@@ -1 +1 @@
-Subproject commit f020e60b67ec38e3ede72b1ebc86d4e055565cd7
+Subproject commit 9e7dc4a921f86e60cc1f14afe254e5310b63e854
diff --git a/homeassistant/components/frontend/www_static/panels/ha-panel-hassio.html b/homeassistant/components/frontend/www_static/panels/ha-panel-hassio.html
index c82bfcb54e8..80d1686acf0 100644
--- a/homeassistant/components/frontend/www_static/panels/ha-panel-hassio.html
+++ b/homeassistant/components/frontend/www_static/panels/ha-panel-hassio.html
@@ -12,6 +12,6 @@
   },
 
   computeInstallStatus(addon) {
-    return addon.installed || 'Not installed';
+    return (addon && addon.installed) || 'Not installed';
   },
-});</script><dom-module id="hassio-addon-state" assetpath="addon-view/"><template><style include="ha-style">:host{display:block}paper-card{display:block}</style><paper-card heading="Installed"><template is="dom-if" if="[[!addonState]]"><div class="card-content"><div>Add-on is not installed.</div></div><div class="card-actions"><ha-call-api-button hass="[[hass]]" path="[[pathInstall(addon)]]">Install</ha-call-api-button></div></template><template is="dom-if" if="[[addonState]]"><div class="card-content"><table class="info"><tbody><tr><td>Version</td><td>[[addonState.version]]</td></tr><tr><td>State</td><td>[[addonState.state]]</td></tr><tr><td>Boot</td><td>[[addonState.boot]]</td></tr></tbody></table></div><div class="card-actions"><template is="dom-if" if="[[!isRunning]]"><ha-call-api-button hass="[[hass]]" path="[[pathStart(addon)]]">Start</ha-call-api-button></template><template is="dom-if" if="[[isRunning]]"><ha-call-api-button class="warning" hass="[[hass]]" path="[[pathStop(addon)]]">Stop</ha-call-api-button></template><template is="dom-if" if="[[computeUpdateAvailable(addonState)]]"><ha-call-api-button hass="[[hass]]" path="[[pathUpdate(addon)]]">Update</ha-call-api-button></template><ha-call-api-button class="warning" hass="[[hass]]" path="[[pathUninstall(addon)]]">Uninstall</ha-call-api-button></div></template></paper-card></template></dom-module><script>Polymer({is:"hassio-addon-state",properties:{hass:{type:Object},addon:{type:String},isRunning:{type:Boolean,computed:"computeIsRunning(addonState)"},addonInfo:{type:Object,value:null},addonState:{type:Object,value:null}},computeIsRunning:function(t){return t&&"started"===t.state},computeUpdateAvailable:function(t){return t&&!t.detached&&t.version!==t.last_version},pathStart:function(t){return"hassio/addons/"+t+"/start"},pathStop:function(t){return"hassio/addons/"+t+"/stop"},pathInstall:function(t){return"hassio/addons/"+t+"/install"},pathUninstall:function(t){return"hassio/addons/"+t+"/uninstall"},pathUpdate:function(t){return"hassio/addons/"+t+"/update"}})</script><dom-module id="hassio-addon-options" assetpath="addon-view/"><template><style include="ha-style">:host{display:block}paper-card{display:block}iron-autogrow-textarea{width:100%}</style><paper-card heading="Options"><div class="card-content"><iron-autogrow-textarea value="{{options}}"></iron-autogrow-textarea></div><div class="card-actions"><ha-call-api-button hass="[[hass]]" disabled="[[!optionsParsed]]" data="[[computeOptionsData(optionsParsed)]]" path="[[pathOptions(addon)]]">Save</ha-call-api-button></div></paper-card></template></dom-module><script>Polymer({is:"hassio-addon-options",properties:{hass:{type:Object},addon:{type:String},options:{type:String,value:""},optionsParsed:{type:Object,computed:"parseOptions(options)"},addonState:{type:Object,value:null,observer:"addonStateChanged"}},addonStateChanged:function(t){this.options=t?JSON.stringify(t.options,null,2):""},parseOptions:function(t){try{return JSON.parse(t)}catch(t){return null}},computeOptionsData:function(t){return{options:t}},pathOptions:function(t){return"hassio/addons/"+t+"/options"}})</script><dom-module id="hassio-addon-logs" assetpath="addon-view/"><template><style include="iron-flex ha-style">:host,paper-card{display:block}</style><paper-card heading="Logs"><div class="card-content"><pre>[[addonLogs]]</pre></div><div class="card-actions"><paper-button on-tap="refresh">Refresh</paper-button></div></paper-card></template></dom-module><script>Polymer({is:"hassio-addon-logs",properties:{hass:{type:Object},addon:{type:String,observer:"addonChanged"},addonLogs:{type:String,value:""}},addonChanged:function(s){if(!this.hass)return void setTimeout(function(){this.addonChanged(s)}.bind(this),0);this.refresh()},refresh:function(){this.hass.callApi("get","hassio/addons/"+this.addon+"/logs").then(function(s){this.addonLogs=s}.bind(this))}})</script><dom-module id="hassio-addon-view" assetpath="addon-view/"><template><style include="iron-flex ha-style">paper-card{display:block}.controls paper-card,hassio-addon-options{margin-bottom:24px}.content{padding:24px 0 32px;max-width:600px;margin:0 auto}.status{@apply(--layout-horizontal);margin-bottom:24px}.status>*{@apply(--layout-flex)}.status>:first-child{margin-right:24px}</style><app-header-layout has-scrolling-region=""><app-header fixed=""><app-toolbar><paper-icon-button icon="mdi:arrow-left" on-tap="backTapped"></paper-icon-button><div main-title="">[[addonInfo.name]]</div></app-toolbar></app-header><div class="content"><div class="status"><hassio-addon-info hass="[[hass]]" addon-info="[[addonInfo]]"></hassio-addon-info><hassio-addon-state hass="[[hass]]" addon="[[addon]]" addon-info="[[addonInfo]]" addon-state="[[addonState]]"></hassio-addon-state></div><template is="dom-if" if="[[addonState]]"><div class="controls"><hassio-addon-options hass="[[hass]]" addon="[[addon]]" addon-state="[[addonState]]"></hassio-addon-options><hassio-addon-logs hass="[[hass]]" addon="[[addon]]"></hassio-addon-logs></div></template></div></app-header-layout></template></dom-module><script>Polymer({is:"hassio-addon-view",properties:{hass:{type:Object},narrow:{type:Boolean},showMenu:{type:Boolean,value:!1},addon:{type:String,observer:"addonChanged"},supervisorInfo:{type:Object},addonInfo:{type:Object,computed:"computeAddonInfo(supervisorInfo, addon)"},addonState:{type:Object,value:null},addonLogs:{type:String,value:""}},listeners:{"hass-api-called":"apiCalled"},apiCalled:function(){this.addonChanged(this.addon)},addonChanged:function(n){if(!this.hass)return void setTimeout(function(){this.addonChanged(n)}.bind(this),0);this.hass.callApi("get","hassio/addons/"+n+"/info").then(function(n){this.addonState=n.data}.bind(this),function(){this.addonState=null}.bind(this))},computeAddonInfo:function(n,d){if(!n)return null;for(var e=0;e<n.addons.length;e++){var o=n.addons[e];if(o.slug===d)return o}return null},backTapped:function(){this.fire("hassio-select-addon",{addon:null})}})</script><dom-module id="hassio-repositories-editor" assetpath="addon-store/"><template><style include="ha-style">:host{display:block}paper-card{display:block}iron-autogrow-textarea{width:100%}</style><paper-card heading="Add-On Repositories"><div class="card-content"><p>Configure which add-on repositories to fetch data from. One repository per line.</p><iron-autogrow-textarea value="{{options}}"></iron-autogrow-textarea></div><div class="card-actions"><ha-call-api-button hass="[[hass]]" data="[[computeOptionsData(options)]]" path="hassio/supervisor/options">Save</ha-call-api-button></div></paper-card></template></dom-module><script>Polymer({is:"hassio-repositories-editor",properties:{hass:{type:Object},options:{type:String,value:""},repos:{type:Array,value:[],observer:"reposChanged"}},reposChanged:function(e){this.options=e.join("\n")},computeOptionsData:function(e){return{addons_repositories:e.split("\n")}}})</script><dom-module id="hassio-addon-repository" assetpath="addon-store/"><template><style include="iron-flex ha-style">:host,paper-card{display:block}paper-item{cursor:pointer}</style><paper-card heading="[[repo.name]]"><template is="dom-if" if="[[computeShowIntro(repo)]]"><div class="card-content"><template is="dom-if" if="[[repo.maintainer]]">Maintained by [[repo.maintainer]].</template><template is="dom-if" if="[[repo.url]]"><a href="[[repo.url]]" target="_blank">Visit repository website.</a></template></div></template><template is="dom-repeat" items="[[addons]]" as="addon"><paper-item><paper-item-body two-line="" on-tap="addonTapped"><div>[[addon.name]]</div><div secondary="">[[addon.description]]</div></paper-item-body>[[computeInstallStatus(addon)]]</paper-item></template></paper-card></template></dom-module><script>Polymer({is:"hassio-addon-repository",properties:{repo:{type:Object},addons:{type:Array}},computeShowIntro:function(t){return t.url||t.maintainer},computeInstallStatus:function(t){return t.installed||"Not installed"},addonTapped:function(t){this.fire("hassio-select-addon",{addon:this.addons[t.model.index].slug}),t.target.blur()}})</script><dom-module id="hassio-addon-store" assetpath="addon-store/"><template><style include="iron-flex ha-style">paper-card{display:block}.content{padding:24px 0 32px;max-width:600px;margin:0 auto}hassio-addon-repository{margin-top:24px}</style><app-header-layout has-scrolling-region=""><app-header fixed=""><app-toolbar><paper-icon-button icon="mdi:arrow-left" on-tap="backTapped"></paper-icon-button><div main-title="">Hass.io Add-Ons</div><paper-icon-button icon="mdi:refresh" on-tap="refreshTapped"></paper-icon-button></app-toolbar></app-header><div class="content"><hassio-repositories-editor hass="[[hass]]" repos="[[supervisorInfo.addons_repositories]]"></hassio-repositories-editor><template is="dom-repeat" items="[[repos]]" as="repo"><hassio-addon-repository repo="[[repo]]" addons="[[computeAddOns(repo.slug)]]"></hassio-addon-repository></template></div></app-header-layout></template></dom-module><script>Polymer({_coreRepos:[{slug:"core",name:"Built-in Add-Ons",url:"https://home-assistant.io/addons",maintainer:"Home Assistant authors"}],is:"hassio-addon-store",properties:{hass:{type:Object},narrow:{type:Boolean},showMenu:{type:Boolean,value:!1},addons:{type:Array,value:[]},repos:{type:Array,value:[]},supervisorInfo:{type:Object}},listeners:{"hass-api-called":"apiCalled"},apiCalled:function(s){s.detail.success&&this.loadData()},attached:function(){this.loadData()},loadData:function(){this.hass.callApi("get","hassio/supervisor/addons").then(function(s){this.addons=s.data.addons,this.repos=this._coreRepos.concat(s.data.repositories)}.bind(this),function(){this.addons=[],this.repos=[]}.bind(this))},computeAddOns:function(s){return this.addons.filter(function(t){return t.repository===s})},refreshTapped:function(){this.hass.callApi("post","hassio/supervisor/reload").then(function(){this.loadData()}.bind(this))},backTapped:function(){this.fire("hassio-select-addon",{addon:null})}})</script><dom-module id="hassio-loading" assetpath="./"><template><style include="iron-flex ha-style">[hidden]{display:none!important}.placeholder{height:100%}.layout{height:calc(100% - 64px)}</style><div class="placeholder"><app-toolbar><ha-menu-button narrow="[[narrow]]" show-menu="[[showMenu]]"></ha-menu-button><div main-title="">Hass.io</div></app-toolbar><div class="layout horizontal center-center"><paper-spinner active=""></paper-spinner></div></div></template></dom-module><script>Polymer({is:"hassio-loading",properties:{hass:{type:Object},narrow:{type:Boolean,value:!1},showMenu:{type:Boolean,value:!1}}})</script><script>Polymer({is:"hassio-data",properties:{supervisor:{type:Object,value:{},notify:!0},host:{type:Object,value:{},notify:!0},homeassistant:{type:Object,value:{},notify:!0}},attached:function(){this.refresh()},refresh:function(){this.fetchSupervisorInfo(),this.fetchHostInfo(),this.fetchHassInfo()},fetchSupervisorInfo:function(){this.hass.callApi("get","hassio/supervisor/info").then(function(t){this.supervisor=t.data}.bind(this))},fetchHostInfo:function(){this.hass.callApi("get","hassio/host/info").then(function(t){this.host=t.data}.bind(this))},fetchHassInfo:function(){this.hass.callApi("get","hassio/homeassistant/info").then(function(t){this.homeassistant=t.data}.bind(this))}})</script></div><dom-module id="ha-panel-hassio"><style>iron-pages{height:100%}</style><template><hassio-data id="data" hass="[[hass]]" supervisor="{{supervisorInfo}}" homeassistant="{{hassInfo}}" host="{{hostInfo}}"></hassio-data><template is="dom-if" if="[[dashboardSelected(currentPage)]]"><template is="dom-if" if="[[!loaded]]"><hassio-loading narrow="[[narrow]]" hass="[[hass]]" show-menu="[[showMenu]]"></hassio-loading></template><template is="dom-if" if="[[loaded]]"><hassio-dashboard hass="[[hass]]" narrow="[[narrow]]" show-menu="[[showMenu]]" supervisor-info="[[supervisorInfo]]" host-info="[[hostInfo]]" hass-info="[[hassInfo]]"></hassio-dashboard></template></template><template is="dom-if" if="[[addonViewSelected(currentPage)]]" restamp=""><hassio-addon-view hass="[[hass]]" supervisor-info="[[supervisorInfo]]" host-info="[[hostInfo]]" addon="[[addon]]"></hassio-addon-view></template><template is="dom-if" if="[[addonStoreSelected(currentPage)]]"><hassio-addon-store id="addon-store" hass="[[hass]]" supervisor-info="[[supervisorInfo]]"></hassio-addon-store></template></template></dom-module><script>Polymer({is:"ha-panel-hassio",properties:{hass:{type:Object},narrow:{type:Boolean},showMenu:{type:Boolean,value:!1},addon:{type:String,value:""},supervisorInfo:{type:Object,value:null},hostInfo:{type:Object,value:null},hassInfo:{type:Object,value:null},forceLoading:{type:Boolean,value:!1},loaded:{type:Boolean,computed:"computeIsLoaded(supervisorInfo, hostInfo, hassInfo, forceLoading)"},currentPage:{type:String,value:"dashboard"},lastPage:{type:String,value:"dashboard"}},listeners:{"hassio-select-addon":"addonSelected","hassio-show-store":"showStore","hass-api-called":"apiCalled"},apiCalled:function(e){e.detail.success&&this.$.data.refresh()},computeIsLoaded:function(e,t,a,o){return null!==e&&null!==t&&null!==a&&!o},addonSelected:function(e){var t=e.detail.addon;this.currentPage===this.lastPage&&(this.lastPage="dashboard"),t?(this.lastPage=this.currentPage,this.currentPage="addon-view",this.addon=t):(this.currentPage=this.lastPage,setTimeout(function(){this.addon=t}.bind(this),0))},showStore:function(){this.currentPage="addon-store"},dashboardSelected:function(e){return"dashboard"===e},addonStoreSelected:function(e){return"addon-store"===e},addonViewSelected:function(e){return"addon-view"===e}})</script></body></html>
\ No newline at end of file
+});</script><dom-module id="hassio-addon-state" assetpath="addon-view/"><template><style include="ha-style">:host{display:block}paper-card{display:block}</style><paper-card heading="Installed"><template is="dom-if" if="[[!addonState]]"><div class="card-content"><div>Add-on is not installed.</div></div><div class="card-actions"><ha-call-api-button hass="[[hass]]" path="[[pathInstall(addon)]]">Install</ha-call-api-button></div></template><template is="dom-if" if="[[addonState]]"><div class="card-content"><table class="info"><tbody><tr><td>Version</td><td>[[addonState.version]]</td></tr><tr><td>State</td><td>[[addonState.state]]</td></tr><tr><td>Boot</td><td>[[addonState.boot]]</td></tr></tbody></table></div><div class="card-actions"><template is="dom-if" if="[[!isRunning]]"><ha-call-api-button hass="[[hass]]" path="[[pathStart(addon)]]">Start</ha-call-api-button></template><template is="dom-if" if="[[isRunning]]"><ha-call-api-button class="warning" hass="[[hass]]" path="[[pathStop(addon)]]">Stop</ha-call-api-button></template><template is="dom-if" if="[[computeUpdateAvailable(addonState)]]"><ha-call-api-button hass="[[hass]]" path="[[pathUpdate(addon)]]">Update</ha-call-api-button></template><ha-call-api-button class="warning" hass="[[hass]]" path="[[pathUninstall(addon)]]">Uninstall</ha-call-api-button></div></template></paper-card></template></dom-module><script>Polymer({is:"hassio-addon-state",properties:{hass:{type:Object},addon:{type:String},isRunning:{type:Boolean,computed:"computeIsRunning(addonState)"},addonInfo:{type:Object,value:null},addonState:{type:Object,value:null}},computeIsRunning:function(t){return t&&"started"===t.state},computeUpdateAvailable:function(t){return t&&!t.detached&&t.version!==t.last_version},pathStart:function(t){return"hassio/addons/"+t+"/start"},pathStop:function(t){return"hassio/addons/"+t+"/stop"},pathInstall:function(t){return"hassio/addons/"+t+"/install"},pathUninstall:function(t){return"hassio/addons/"+t+"/uninstall"},pathUpdate:function(t){return"hassio/addons/"+t+"/update"}})</script><dom-module id="hassio-addon-options" assetpath="addon-view/"><template><style include="ha-style">:host{display:block}paper-card{display:block}iron-autogrow-textarea{width:100%}</style><paper-card heading="Options"><div class="card-content"><iron-autogrow-textarea value="{{options}}"></iron-autogrow-textarea></div><div class="card-actions"><ha-call-api-button hass="[[hass]]" disabled="[[!optionsParsed]]" data="[[computeOptionsData(optionsParsed)]]" path="[[pathOptions(addon)]]">Save</ha-call-api-button></div></paper-card></template></dom-module><script>Polymer({is:"hassio-addon-options",properties:{hass:{type:Object},addon:{type:String},options:{type:String,value:""},optionsParsed:{type:Object,computed:"parseOptions(options)"},addonState:{type:Object,value:null,observer:"addonStateChanged"}},addonStateChanged:function(t){this.options=t?JSON.stringify(t.options,null,2):""},parseOptions:function(t){try{return JSON.parse(t)}catch(t){return null}},computeOptionsData:function(t){return{options:t}},pathOptions:function(t){return"hassio/addons/"+t+"/options"}})</script><dom-module id="hassio-addon-logs" assetpath="addon-view/"><template><style include="iron-flex ha-style">:host,paper-card{display:block}</style><paper-card heading="Logs"><div class="card-content"><pre>[[addonLogs]]</pre></div><div class="card-actions"><paper-button on-tap="refresh">Refresh</paper-button></div></paper-card></template></dom-module><script>Polymer({is:"hassio-addon-logs",properties:{hass:{type:Object},addon:{type:String,observer:"addonChanged"},addonLogs:{type:String,value:""}},addonChanged:function(s){if(!this.hass)return void setTimeout(function(){this.addonChanged(s)}.bind(this),0);this.refresh()},refresh:function(){this.hass.callApi("get","hassio/addons/"+this.addon+"/logs").then(function(s){this.addonLogs=s}.bind(this))}})</script><dom-module id="hassio-addon-view" assetpath="addon-view/"><template><style include="iron-flex ha-style">paper-card{display:block}.controls paper-card,hassio-addon-options{margin-bottom:24px}.content{padding:24px 0 32px;max-width:600px;margin:0 auto}.status{@apply(--layout-horizontal);margin-bottom:24px}.status>*{@apply(--layout-flex)}.status>:first-child{margin-right:24px}</style><app-header-layout has-scrolling-region=""><app-header fixed=""><app-toolbar><paper-icon-button icon="mdi:arrow-left" on-tap="backTapped"></paper-icon-button><div main-title="">[[addonInfo.name]]</div></app-toolbar></app-header><div class="content"><div class="status"><hassio-addon-info hass="[[hass]]" addon-info="[[addonInfo]]"></hassio-addon-info><hassio-addon-state hass="[[hass]]" addon="[[addon]]" addon-info="[[addonInfo]]" addon-state="[[addonState]]"></hassio-addon-state></div><template is="dom-if" if="[[addonState]]"><div class="controls"><hassio-addon-options hass="[[hass]]" addon="[[addon]]" addon-state="[[addonState]]"></hassio-addon-options><hassio-addon-logs hass="[[hass]]" addon="[[addon]]"></hassio-addon-logs></div></template></div></app-header-layout></template></dom-module><script>Polymer({is:"hassio-addon-view",properties:{hass:{type:Object},narrow:{type:Boolean},showMenu:{type:Boolean,value:!1},addon:{type:String,observer:"addonChanged"},supervisorInfo:{type:Object},addonInfo:{type:Object,computed:"computeAddonInfo(supervisorInfo, addon)"},addonState:{type:Object,value:null},addonLogs:{type:String,value:""}},listeners:{"hass-api-called":"apiCalled"},apiCalled:function(){this.addonChanged(this.addon)},addonChanged:function(n){if(!this.hass)return void setTimeout(function(){this.addonChanged(n)}.bind(this),0);this.hass.callApi("get","hassio/addons/"+n+"/info").then(function(n){this.addonState=n.data}.bind(this),function(){this.addonState=null}.bind(this))},computeAddonInfo:function(n,d){if(!n)return null;for(var e=0;e<n.addons.length;e++){var o=n.addons[e];if(o.slug===d)return o}return null},backTapped:function(){this.fire("hassio-select-addon",{addon:null})}})</script><dom-module id="hassio-repositories-editor" assetpath="addon-store/"><template><style include="ha-style">:host{display:block}paper-card{display:block}iron-autogrow-textarea{width:100%}</style><paper-card heading="Add-On Repositories"><div class="card-content"><p>Configure which add-on repositories to fetch data from. One repository per line.</p><iron-autogrow-textarea value="{{options}}"></iron-autogrow-textarea></div><div class="card-actions"><ha-call-api-button hass="[[hass]]" data="[[computeOptionsData(options)]]" path="hassio/supervisor/options">Save</ha-call-api-button></div></paper-card></template></dom-module><script>Polymer({is:"hassio-repositories-editor",properties:{hass:{type:Object},options:{type:String,value:""},repos:{type:Array,value:[],observer:"reposChanged"}},reposChanged:function(e){this.options=e.join("\n")},computeOptionsData:function(e){return{addons_repositories:e.split("\n")}}})</script><dom-module id="hassio-addon-repository" assetpath="addon-store/"><template><style include="iron-flex ha-style">:host,paper-card{display:block}paper-item{cursor:pointer}</style><paper-card heading="[[repo.name]]"><template is="dom-if" if="[[computeShowIntro(repo)]]"><div class="card-content"><template is="dom-if" if="[[repo.maintainer]]">Maintained by [[repo.maintainer]].</template><template is="dom-if" if="[[repo.url]]"><a href="[[repo.url]]" target="_blank">Visit repository website.</a></template></div></template><template is="dom-repeat" items="[[addons]]" as="addon"><paper-item><paper-item-body two-line="" on-tap="addonTapped"><div>[[addon.name]]</div><div secondary="">[[addon.description]]</div></paper-item-body>[[computeInstallStatus(addon)]]</paper-item></template></paper-card></template></dom-module><script>Polymer({is:"hassio-addon-repository",properties:{repo:{type:Object},addons:{type:Array}},computeShowIntro:function(t){return t.url||t.maintainer},computeInstallStatus:function(t){return t.installed||"Not installed"},addonTapped:function(t){this.fire("hassio-select-addon",{addon:this.addons[t.model.index].slug}),t.target.blur()}})</script><dom-module id="hassio-addon-store" assetpath="addon-store/"><template><style include="iron-flex ha-style">paper-card{display:block}.content{padding:24px 0 32px;max-width:600px;margin:0 auto}hassio-addon-repository{margin-top:24px}</style><app-header-layout has-scrolling-region=""><app-header fixed=""><app-toolbar><paper-icon-button icon="mdi:arrow-left" on-tap="backTapped"></paper-icon-button><div main-title="">Hass.io Add-Ons</div><paper-icon-button icon="mdi:refresh" on-tap="refreshTapped"></paper-icon-button></app-toolbar></app-header><div class="content"><hassio-repositories-editor hass="[[hass]]" repos="[[supervisorInfo.addons_repositories]]"></hassio-repositories-editor><template is="dom-repeat" items="[[repos]]" as="repo"><hassio-addon-repository repo="[[repo]]" addons="[[computeAddOns(repo.slug)]]"></hassio-addon-repository></template></div></app-header-layout></template></dom-module><script>Polymer({is:"hassio-addon-store",properties:{hass:{type:Object},narrow:{type:Boolean},showMenu:{type:Boolean,value:!1},addons:{type:Array,value:[]},repos:{type:Array,value:[]},supervisorInfo:{type:Object}},listeners:{"hass-api-called":"apiCalled"},apiCalled:function(s){s.detail.success&&this.loadData()},attached:function(){this.loadData()},loadData:function(){this.hass.callApi("get","hassio/supervisor/addons").then(function(s){this.addons=s.data.addons,this.repos=s.data.repositories}.bind(this),function(){this.addons=[],this.repos=[]}.bind(this))},computeAddOns:function(s){return this.addons.filter(function(a){return a.repository===s})},refreshTapped:function(){this.hass.callApi("post","hassio/supervisor/reload").then(function(){this.loadData()}.bind(this))},backTapped:function(){this.fire("hassio-select-addon",{addon:null})}})</script><dom-module id="hassio-loading" assetpath="./"><template><style include="iron-flex ha-style">[hidden]{display:none!important}.placeholder{height:100%}.layout{height:calc(100% - 64px)}</style><div class="placeholder"><app-toolbar><ha-menu-button narrow="[[narrow]]" show-menu="[[showMenu]]"></ha-menu-button><div main-title="">Hass.io</div></app-toolbar><div class="layout horizontal center-center"><paper-spinner active=""></paper-spinner></div></div></template></dom-module><script>Polymer({is:"hassio-loading",properties:{hass:{type:Object},narrow:{type:Boolean,value:!1},showMenu:{type:Boolean,value:!1}}})</script><script>Polymer({is:"hassio-data",properties:{supervisor:{type:Object,value:{},notify:!0},host:{type:Object,value:{},notify:!0},homeassistant:{type:Object,value:{},notify:!0}},attached:function(){this.refresh()},refresh:function(){this.fetchSupervisorInfo(),this.fetchHostInfo(),this.fetchHassInfo()},fetchSupervisorInfo:function(){this.hass.callApi("get","hassio/supervisor/info").then(function(t){this.supervisor=t.data}.bind(this))},fetchHostInfo:function(){this.hass.callApi("get","hassio/host/info").then(function(t){this.host=t.data}.bind(this))},fetchHassInfo:function(){this.hass.callApi("get","hassio/homeassistant/info").then(function(t){this.homeassistant=t.data}.bind(this))}})</script></div><dom-module id="ha-panel-hassio"><style>iron-pages{height:100%}</style><template><hassio-data id="data" hass="[[hass]]" supervisor="{{supervisorInfo}}" homeassistant="{{hassInfo}}" host="{{hostInfo}}"></hassio-data><template is="dom-if" if="[[dashboardSelected(currentPage)]]"><template is="dom-if" if="[[!loaded]]"><hassio-loading narrow="[[narrow]]" hass="[[hass]]" show-menu="[[showMenu]]"></hassio-loading></template><template is="dom-if" if="[[loaded]]"><hassio-dashboard hass="[[hass]]" narrow="[[narrow]]" show-menu="[[showMenu]]" supervisor-info="[[supervisorInfo]]" host-info="[[hostInfo]]" hass-info="[[hassInfo]]"></hassio-dashboard></template></template><template is="dom-if" if="[[addonViewSelected(currentPage)]]" restamp=""><hassio-addon-view hass="[[hass]]" supervisor-info="[[supervisorInfo]]" host-info="[[hostInfo]]" addon="[[addon]]"></hassio-addon-view></template><template is="dom-if" if="[[addonStoreSelected(currentPage)]]"><hassio-addon-store id="addon-store" hass="[[hass]]" supervisor-info="[[supervisorInfo]]"></hassio-addon-store></template></template></dom-module><script>Polymer({is:"ha-panel-hassio",properties:{hass:{type:Object},narrow:{type:Boolean},showMenu:{type:Boolean,value:!1},addon:{type:String,value:""},supervisorInfo:{type:Object,value:null},hostInfo:{type:Object,value:null},hassInfo:{type:Object,value:null},forceLoading:{type:Boolean,value:!1},loaded:{type:Boolean,computed:"computeIsLoaded(supervisorInfo, hostInfo, hassInfo, forceLoading)"},currentPage:{type:String,value:"dashboard"},lastPage:{type:String,value:"dashboard"}},listeners:{"hassio-select-addon":"addonSelected","hassio-show-store":"showStore","hass-api-called":"apiCalled"},apiCalled:function(e){e.detail.success&&this.$.data.refresh()},computeIsLoaded:function(e,t,a,o){return null!==e&&null!==t&&null!==a&&!o},addonSelected:function(e){var t=e.detail.addon;this.currentPage===this.lastPage&&(this.lastPage="dashboard"),t?(this.lastPage=this.currentPage,this.currentPage="addon-view",this.addon=t):(this.currentPage=this.lastPage,setTimeout(function(){this.addon=t}.bind(this),0))},showStore:function(){this.currentPage="addon-store"},dashboardSelected:function(e){return"dashboard"===e},addonStoreSelected:function(e){return"addon-store"===e},addonViewSelected:function(e){return"addon-view"===e}})</script></body></html>
\ No newline at end of file
diff --git a/homeassistant/components/frontend/www_static/panels/ha-panel-hassio.html.gz b/homeassistant/components/frontend/www_static/panels/ha-panel-hassio.html.gz
index c7689872442..5ed1205a999 100644
Binary files a/homeassistant/components/frontend/www_static/panels/ha-panel-hassio.html.gz and b/homeassistant/components/frontend/www_static/panels/ha-panel-hassio.html.gz differ
diff --git a/homeassistant/components/frontend/www_static/service_worker.js b/homeassistant/components/frontend/www_static/service_worker.js
index 79fc54a2fc6..445c8d0b9df 100644
--- a/homeassistant/components/frontend/www_static/service_worker.js
+++ b/homeassistant/components/frontend/www_static/service_worker.js
@@ -1 +1 @@
-"use strict";function setOfCachedUrls(e){return e.keys().then(function(e){return e.map(function(e){return e.url})}).then(function(e){return new Set(e)})}function notificationEventCallback(e,t){firePushCallback({action:t.action,data:t.notification.data,tag:t.notification.tag,type:e},t.notification.data.jwt)}function firePushCallback(e,t){delete e.data.jwt,0===Object.keys(e.data).length&&e.data.constructor===Object&&delete e.data,fetch("/api/notify.html5/callback",{method:"POST",headers:new Headers({"Content-Type":"application/json",Authorization:"Bearer "+t}),body:JSON.stringify(e)})}var precacheConfig=[["/","c255cdae4bfd691ee9fa43e38e8dc462"],["/frontend/panels/dev-event-2db9c218065ef0f61d8d08db8093cad2.html","b5b751e49b1bba55f633ae0d7a92677d"],["/frontend/panels/dev-info-61610e015a411cfc84edd2c4d489e71d.html","6568377ee31cbd78fedc003b317f7faf"],["/frontend/panels/dev-service-415552027cb083badeff5f16080410ed.html","a4b1ec9bfa5bc3529af7783ae56cb55c"],["/frontend/panels/dev-state-d70314913b8923d750932367b1099750.html","c61b5b1461959aac106400e122993e9e"],["/frontend/panels/dev-template-567fbf86735e1b891e40c2f4060fec9b.html","d2853ecf45de1dbadf49fe99a7424ef3"],["/frontend/panels/map-31c592c239636f91e07c7ac232a5ebc4.html","182580419ce2c935ae6ec65502b6db96"],["/static/compatibility-83d9c77748dafa9db49ae77d7f3d8fb0.js","5f05c83be2b028d577962f9625904806"],["/static/core-5d08475f03adb5969bd31855d5ca0cfd.js","1cd99ba798bfcff9768c9d2bb2f58a7c"],["/static/frontend-5999c8fac69c503b846672cae75a12b0.html","d6ce8eb348fbea599933b2a72beb1337"],["/static/mdi-1cc8593d3684f7f6f3b3854403216f77.html","eac41ec8397af607a07bc174e3c2475f"],["static/fonts/roboto/Roboto-Bold.ttf","d329cc8b34667f114a95422aaad1b063"],["static/fonts/roboto/Roboto-Light.ttf","7b5fb88f12bec8143f00e21bc3222124"],["static/fonts/roboto/Roboto-Medium.ttf","fe13e4170719c2fc586501e777bde143"],["static/fonts/roboto/Roboto-Regular.ttf","ac3f799d5bbaf5196fab15ab8de8431c"],["static/icons/favicon-192x192.png","419903b8422586a7e28021bbe9011175"],["static/icons/favicon.ico","04235bda7843ec2fceb1cbe2bc696cf4"],["static/images/card_media_player_bg.png","a34281d1c1835d338a642e90930e61aa"],["static/webcomponents-lite.min.js","32b5a9b7ada86304bec6b43d3f2194f0"]],cacheName="sw-precache-v3--"+(self.registration?self.registration.scope:""),ignoreUrlParametersMatching=[/^utm_/],addDirectoryIndex=function(e,t){var n=new URL(e);return"/"===n.pathname.slice(-1)&&(n.pathname+=t),n.toString()},cleanResponse=function(e){return e.redirected?("body"in e?Promise.resolve(e.body):e.blob()).then(function(t){return new Response(t,{headers:e.headers,status:e.status,statusText:e.statusText})}):Promise.resolve(e)},createCacheKey=function(e,t,n,a){var c=new URL(e);return a&&c.pathname.match(a)||(c.search+=(c.search?"&":"")+encodeURIComponent(t)+"="+encodeURIComponent(n)),c.toString()},isPathWhitelisted=function(e,t){if(0===e.length)return!0;var n=new URL(t).pathname;return e.some(function(e){return n.match(e)})},stripIgnoredUrlParameters=function(e,t){var n=new URL(e);return n.search=n.search.slice(1).split("&").map(function(e){return e.split("=")}).filter(function(e){return t.every(function(t){return!t.test(e[0])})}).map(function(e){return e.join("=")}).join("&"),n.toString()},hashParamName="_sw-precache",urlsToCacheKeys=new Map(precacheConfig.map(function(e){var t=e[0],n=e[1],a=new URL(t,self.location),c=createCacheKey(a,hashParamName,n,!1);return[a.toString(),c]}));self.addEventListener("install",function(e){e.waitUntil(caches.open(cacheName).then(function(e){return setOfCachedUrls(e).then(function(t){return Promise.all(Array.from(urlsToCacheKeys.values()).map(function(n){if(!t.has(n)){var a=new Request(n,{credentials:"same-origin"});return fetch(a).then(function(t){if(!t.ok)throw new Error("Request for "+n+" returned a response with status "+t.status);return cleanResponse(t).then(function(t){return e.put(n,t)})})}}))})}).then(function(){return self.skipWaiting()}))}),self.addEventListener("activate",function(e){var t=new Set(urlsToCacheKeys.values());e.waitUntil(caches.open(cacheName).then(function(e){return e.keys().then(function(n){return Promise.all(n.map(function(n){if(!t.has(n.url))return e.delete(n)}))})}).then(function(){return self.clients.claim()}))}),self.addEventListener("fetch",function(e){if("GET"===e.request.method){var t,n=stripIgnoredUrlParameters(e.request.url,ignoreUrlParametersMatching);t=urlsToCacheKeys.has(n);t||(n=addDirectoryIndex(n,"index.html"),t=urlsToCacheKeys.has(n));!t&&"navigate"===e.request.mode&&isPathWhitelisted(["^((?!(static|api|local|service_worker.js|manifest.json)).)*$"],e.request.url)&&(n=new URL("/",self.location).toString(),t=urlsToCacheKeys.has(n)),t&&e.respondWith(caches.open(cacheName).then(function(e){return e.match(urlsToCacheKeys.get(n)).then(function(e){if(e)return e;throw Error("The cached response that was expected is missing.")})}).catch(function(t){return console.warn('Couldn\'t serve response for "%s" from cache: %O',e.request.url,t),fetch(e.request)}))}}),self.addEventListener("push",function(e){var t;e.data&&(t=e.data.json(),e.waitUntil(self.registration.showNotification(t.title,t).then(function(e){firePushCallback({type:"received",tag:t.tag,data:t.data},t.data.jwt)})))}),self.addEventListener("notificationclick",function(e){var t;notificationEventCallback("clicked",e),e.notification.close(),e.notification.data&&e.notification.data.url&&(t=e.notification.data.url)&&e.waitUntil(clients.matchAll({type:"window"}).then(function(e){var n,a;for(n=0;n<e.length;n++)if(a=e[n],a.url===t&&"focus"in a)return a.focus();if(clients.openWindow)return clients.openWindow(t)}))}),self.addEventListener("notificationclose",function(e){notificationEventCallback("closed",e)});
\ No newline at end of file
+"use strict";function setOfCachedUrls(e){return e.keys().then(function(e){return e.map(function(e){return e.url})}).then(function(e){return new Set(e)})}function notificationEventCallback(e,t){firePushCallback({action:t.action,data:t.notification.data,tag:t.notification.tag,type:e},t.notification.data.jwt)}function firePushCallback(e,t){delete e.data.jwt,0===Object.keys(e.data).length&&e.data.constructor===Object&&delete e.data,fetch("/api/notify.html5/callback",{method:"POST",headers:new Headers({"Content-Type":"application/json",Authorization:"Bearer "+t}),body:JSON.stringify(e)})}var precacheConfig=[["/","c255cdae4bfd691ee9fa43e38e8dc462"],["/frontend/panels/dev-event-2db9c218065ef0f61d8d08db8093cad2.html","b5b751e49b1bba55f633ae0d7a92677d"],["/frontend/panels/dev-info-61610e015a411cfc84edd2c4d489e71d.html","6568377ee31cbd78fedc003b317f7faf"],["/frontend/panels/dev-service-415552027cb083badeff5f16080410ed.html","a4b1ec9bfa5bc3529af7783ae56cb55c"],["/frontend/panels/dev-state-d70314913b8923d750932367b1099750.html","c61b5b1461959aac106400e122993e9e"],["/frontend/panels/dev-template-567fbf86735e1b891e40c2f4060fec9b.html","d2853ecf45de1dbadf49fe99a7424ef3"],["/frontend/panels/map-31c592c239636f91e07c7ac232a5ebc4.html","182580419ce2c935ae6ec65502b6db96"],["/static/compatibility-83d9c77748dafa9db49ae77d7f3d8fb0.js","5f05c83be2b028d577962f9625904806"],["/static/core-5d08475f03adb5969bd31855d5ca0cfd.js","1cd99ba798bfcff9768c9d2bb2f58a7c"],["/static/frontend-5999c8fac69c503b846672cae75a12b0.html","d6ce8eb348fbea599933b2a72beb1337"],["/static/mdi-f407a5a57addbe93817ee1b244d33fbe.html","5459090f217c77747b08d06e0bf73388"],["static/fonts/roboto/Roboto-Bold.ttf","d329cc8b34667f114a95422aaad1b063"],["static/fonts/roboto/Roboto-Light.ttf","7b5fb88f12bec8143f00e21bc3222124"],["static/fonts/roboto/Roboto-Medium.ttf","fe13e4170719c2fc586501e777bde143"],["static/fonts/roboto/Roboto-Regular.ttf","ac3f799d5bbaf5196fab15ab8de8431c"],["static/icons/favicon-192x192.png","419903b8422586a7e28021bbe9011175"],["static/icons/favicon.ico","04235bda7843ec2fceb1cbe2bc696cf4"],["static/images/card_media_player_bg.png","a34281d1c1835d338a642e90930e61aa"],["static/webcomponents-lite.min.js","32b5a9b7ada86304bec6b43d3f2194f0"]],cacheName="sw-precache-v3--"+(self.registration?self.registration.scope:""),ignoreUrlParametersMatching=[/^utm_/],addDirectoryIndex=function(e,t){var n=new URL(e);return"/"===n.pathname.slice(-1)&&(n.pathname+=t),n.toString()},cleanResponse=function(e){return e.redirected?("body"in e?Promise.resolve(e.body):e.blob()).then(function(t){return new Response(t,{headers:e.headers,status:e.status,statusText:e.statusText})}):Promise.resolve(e)},createCacheKey=function(e,t,n,a){var c=new URL(e);return a&&c.pathname.match(a)||(c.search+=(c.search?"&":"")+encodeURIComponent(t)+"="+encodeURIComponent(n)),c.toString()},isPathWhitelisted=function(e,t){if(0===e.length)return!0;var n=new URL(t).pathname;return e.some(function(e){return n.match(e)})},stripIgnoredUrlParameters=function(e,t){var n=new URL(e);return n.search=n.search.slice(1).split("&").map(function(e){return e.split("=")}).filter(function(e){return t.every(function(t){return!t.test(e[0])})}).map(function(e){return e.join("=")}).join("&"),n.toString()},hashParamName="_sw-precache",urlsToCacheKeys=new Map(precacheConfig.map(function(e){var t=e[0],n=e[1],a=new URL(t,self.location),c=createCacheKey(a,hashParamName,n,!1);return[a.toString(),c]}));self.addEventListener("install",function(e){e.waitUntil(caches.open(cacheName).then(function(e){return setOfCachedUrls(e).then(function(t){return Promise.all(Array.from(urlsToCacheKeys.values()).map(function(n){if(!t.has(n)){var a=new Request(n,{credentials:"same-origin"});return fetch(a).then(function(t){if(!t.ok)throw new Error("Request for "+n+" returned a response with status "+t.status);return cleanResponse(t).then(function(t){return e.put(n,t)})})}}))})}).then(function(){return self.skipWaiting()}))}),self.addEventListener("activate",function(e){var t=new Set(urlsToCacheKeys.values());e.waitUntil(caches.open(cacheName).then(function(e){return e.keys().then(function(n){return Promise.all(n.map(function(n){if(!t.has(n.url))return e.delete(n)}))})}).then(function(){return self.clients.claim()}))}),self.addEventListener("fetch",function(e){if("GET"===e.request.method){var t,n=stripIgnoredUrlParameters(e.request.url,ignoreUrlParametersMatching);t=urlsToCacheKeys.has(n);t||(n=addDirectoryIndex(n,"index.html"),t=urlsToCacheKeys.has(n));!t&&"navigate"===e.request.mode&&isPathWhitelisted(["^((?!(static|api|local|service_worker.js|manifest.json)).)*$"],e.request.url)&&(n=new URL("/",self.location).toString(),t=urlsToCacheKeys.has(n)),t&&e.respondWith(caches.open(cacheName).then(function(e){return e.match(urlsToCacheKeys.get(n)).then(function(e){if(e)return e;throw Error("The cached response that was expected is missing.")})}).catch(function(t){return console.warn('Couldn\'t serve response for "%s" from cache: %O',e.request.url,t),fetch(e.request)}))}}),self.addEventListener("push",function(e){var t;e.data&&(t=e.data.json(),e.waitUntil(self.registration.showNotification(t.title,t).then(function(e){firePushCallback({type:"received",tag:t.tag,data:t.data},t.data.jwt)})))}),self.addEventListener("notificationclick",function(e){var t;notificationEventCallback("clicked",e),e.notification.close(),e.notification.data&&e.notification.data.url&&(t=e.notification.data.url)&&e.waitUntil(clients.matchAll({type:"window"}).then(function(e){var n,a;for(n=0;n<e.length;n++)if(a=e[n],a.url===t&&"focus"in a)return a.focus();if(clients.openWindow)return clients.openWindow(t)}))}),self.addEventListener("notificationclose",function(e){notificationEventCallback("closed",e)});
\ No newline at end of file
diff --git a/homeassistant/components/frontend/www_static/service_worker.js.gz b/homeassistant/components/frontend/www_static/service_worker.js.gz
index 19a3b5a09e3..fbbb0388c05 100644
Binary files a/homeassistant/components/frontend/www_static/service_worker.js.gz and b/homeassistant/components/frontend/www_static/service_worker.js.gz differ
diff --git a/homeassistant/const.py b/homeassistant/const.py
index 3946e4d20a7..57d4da7bc19 100644
--- a/homeassistant/const.py
+++ b/homeassistant/const.py
@@ -2,7 +2,7 @@
 """Constants used by Home Assistant components."""
 MAJOR_VERSION = 0
 MINOR_VERSION = 44
-PATCH_VERSION = '1'
+PATCH_VERSION = '2'
 __short_version__ = '{}.{}'.format(MAJOR_VERSION, MINOR_VERSION)
 __version__ = '{}.{}'.format(__short_version__, PATCH_VERSION)
 REQUIRED_PYTHON_VER = (3, 4, 2)