diff --git a/homeassistant/components/http/frontend.py b/homeassistant/components/http/frontend.py
index 49170a1fb2aab00456d2e1514f0877ebd8a8ea10..a1c01f9dd609cb45e1da828f838ed22fca93d520 100644
--- a/homeassistant/components/http/frontend.py
+++ b/homeassistant/components/http/frontend.py
@@ -1,2 +1,2 @@
 """ DO NOT MODIFY. Auto-generated by build_polymer script """
-VERSION = "b476e6588846c1ce0e194dfec06da78e"
+VERSION = "e40dd5a3de19a9351e55be788b5bb526"
diff --git a/homeassistant/components/http/www_static/frontend.html b/homeassistant/components/http/www_static/frontend.html
index eca4ad79b3e95a9bea456043b7d11a0dc255d3bc..40656ddead7a2d480f1a0bfae78a33493a9b1582 100644
--- a/homeassistant/components/http/www_static/frontend.html
+++ b/homeassistant/components/http/www_static/frontend.html
@@ -10335,7 +10335,7 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
     entity_id: "",
 
     stateChanged: function(oldVal, newVal) {
-      this.state_unknown = newVal == "";
+      this.state_unknown = newVal == null;
 
       if(this.$.toggleButton) {
         this.$.toggleButton.checked = this.state == 'on';
@@ -10359,14 +10359,15 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
     },
 
     toggle: function(ev) {
-      if(this.$.toggleButton.checked) {
+      if(this.state == "off") {
         this.turn_on();
       } else {
         this.turn_off();
       }
 
+      // unset state while we wait for an update
       var delayUnsetSate = function() {
-        this.state = "";
+        this.state = null;
       }
       setTimeout(delayUnsetSate.bind(this), 500);
     },
@@ -10427,11 +10428,6 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
     </style>
 
     <div horizontal="" layout="" wrap="">
-      <template if="{{filter != null}}">
-        <state-card entity="{{filter_state.entity_id}}" state="{{filter_state.state}}" last_changed="{{filter_state.last_changed}}" state_attr="{{filter_state.attributes}}" cb_turn_on="{{api.turn_on}}" cb_turn_off="{{api.turn_off}}" cb_edit="{{editCallback}}">
-        </state-card>
-      </template>
-
       <template repeat="{{state in states}}">
         <state-card entity="{{state.entity_id}}" state="{{state.state}}" last_changed="{{state.last_changed}}" state_attr="{{state.attributes}}" cb_turn_on="{{api.turn_on}}" cb_turn_off="{{api.turn_off}}" cb_edit="{{editCallback}}">
         </state-card>
@@ -10471,16 +10467,18 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
 
     refilterStates: function() {
       if(this.filter == null) {
-        this.filter_state = null;
         this.states = this.raw_states;
+
       } else {
-        this.filter_state = this.api.getState(this.filter);
+        var filter_state = this.api.getState(this.filter);
 
         var map_states = function(entity_id) {
           return this.api.getState(entity_id);
         }.bind(this)
 
-        this.states = this.filter_state.attributes.entity_id.map(map_states)
+        // take the parent state and append it's children
+        this.states = [filter_state].concat(
+          filter_state.attributes.entity_id.map(map_states))
       }
     },
 
@@ -10611,467 +10609,6 @@ Code distributed by Google as part of the polymer project is also
 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
 -->
 
-<!--
-@group Polymer Core Elements
-
-The `core-ajax` element exposes `XMLHttpRequest` functionality.
-
-    <core-ajax
-        auto
-        url="http://gdata.youtube.com/feeds/api/videos/"
-        params='{"alt":"json", "q":"chrome"}'
-        handleAs="json"
-        on-core-response="{{handleResponse}}"></core-ajax>
-
-With `auto` set to `true`, the element performs a request whenever
-its `url` or `params` properties are changed.
-
-Note: The `params` attribute must be double quoted JSON.
-
-You can trigger a request explicitly by calling `go` on the
-element.
-
-@element core-ajax
-@status beta
-@homepage github.io
--->
-<!--
-Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<!--
-/**
- * @group Polymer Core Elements
- *
- * core-xhr can be used to perform XMLHttpRequests.
- *
- *     <core-xhr id="xhr"></core-xhr>
- *     ...
- *     this.$.xhr.request({url: url, params: params, callback: callback});
- *
- * @element core-xhr
- */
--->
-
-
-
-<polymer-element name="core-xhr" hidden assetpath="polymer/bower_components/core-ajax/">
-
-  <script>
-
-    Polymer('core-xhr', {
-
-      /**
-       * Sends a HTTP request to the server and returns the XHR object.
-       *
-       * @method request
-       * @param {Object} inOptions
-       *    @param {String} inOptions.url The url to which the request is sent.
-       *    @param {String} inOptions.method The HTTP method to use, default is GET.
-       *    @param {boolean} inOptions.sync By default, all requests are sent asynchronously. To send synchronous requests, set to true.
-       *    @param {Object} inOptions.params Data to be sent to the server.
-       *    @param {Object} inOptions.body The content for the request body for POST method.
-       *    @param {Object} inOptions.headers HTTP request headers.
-       *    @param {String} inOptions.responseType The response type. Default is 'text'.
-       *    @param {boolean} inOptions.withCredentials Whether or not to send credentials on the request. Default is false.
-       *    @param {Object} inOptions.callback Called when request is completed.
-       * @returns {Object} XHR object.
-       */
-      request: function(options) {
-        var xhr = new XMLHttpRequest();
-        var url = options.url;
-        var method = options.method || 'GET';
-        var async = !options.sync;
-        //
-        var params = this.toQueryString(options.params);
-        if (params && method == 'GET') {
-          url += (url.indexOf('?') > 0 ? '&' : '?') + params;
-        }
-        var xhrParams = this.isBodyMethod(method) ? (options.body || params) : null;
-        //
-        xhr.open(method, url, async);
-        if (options.responseType) {
-          xhr.responseType = options.responseType;
-        }
-        if (options.withCredentials) {
-          xhr.withCredentials = true;
-        }
-        this.makeReadyStateHandler(xhr, options.callback);
-        this.setRequestHeaders(xhr, options.headers);
-        xhr.send(xhrParams);
-        if (!async) {
-          xhr.onreadystatechange(xhr);
-        }
-        return xhr;
-      },
-    
-      toQueryString: function(params) {
-        var r = [];
-        for (var n in params) {
-          var v = params[n];
-          n = encodeURIComponent(n);
-          r.push(v == null ? n : (n + '=' + encodeURIComponent(v)));
-        }
-        return r.join('&');
-      },
-
-      isBodyMethod: function(method) {
-        return this.bodyMethods[(method || '').toUpperCase()];
-      },
-      
-      bodyMethods: {
-        POST: 1,
-        PUT: 1,
-        DELETE: 1
-      },
-
-      makeReadyStateHandler: function(xhr, callback) {
-        xhr.onreadystatechange = function() {
-          if (xhr.readyState == 4) {
-            callback && callback.call(null, xhr.response, xhr);
-          }
-        };
-      },
-
-      setRequestHeaders: function(xhr, headers) {
-        if (headers) {
-          for (var name in headers) {
-            xhr.setRequestHeader(name, headers[name]);
-          }
-        }
-      }
-
-    });
-
-  </script>
-  
-</polymer-element>
-
-<polymer-element name="core-ajax" hidden attributes="url handleAs auto params response error method headers body contentType withCredentials" assetpath="polymer/bower_components/core-ajax/">
-<script>
-
-  Polymer('core-ajax', {
-    /**
-     * Fired when a response is received.
-     *
-     * @event core-response
-     */
-
-    /**
-     * Fired when an error is received.
-     *
-     * @event core-error
-     */
-
-    /**
-     * Fired whenever a response or an error is received.
-     *
-     * @event core-complete
-     */
-
-    /**
-     * The URL target of the request.
-     *
-     * @attribute url
-     * @type string
-     * @default ''
-     */
-    url: '',
-
-    /**
-     * Specifies what data to store in the `response` property, and
-     * to deliver as `event.response` in `response` events.
-     *
-     * One of:
-     *
-     *    `text`: uses `XHR.responseText`.
-     *
-     *    `xml`: uses `XHR.responseXML`.
-     *
-     *    `json`: uses `XHR.responseText` parsed as JSON.
-     *
-     *    `arraybuffer`: uses `XHR.response`.
-     *
-     *    `blob`: uses `XHR.response`.
-     *
-     *    `document`: uses `XHR.response`.
-     *
-     * @attribute handleAs
-     * @type string
-     * @default 'text'
-     */
-    handleAs: '',
-
-    /**
-     * If true, automatically performs an Ajax request when either `url` or `params` changes.
-     *
-     * @attribute auto
-     * @type boolean
-     * @default false
-     */
-    auto: false,
-
-    /**
-     * Parameters to send to the specified URL, as JSON.
-     *
-     * @attribute params
-     * @type string (JSON)
-     * @default ''
-     */
-    params: '',
-
-    /**
-     * The response for the most recently made request, or null if it hasn't
-     * completed yet or the request resulted in error.
-     *
-     * @attribute response
-     * @type Object
-     * @default null
-     */
-    response: null,
-
-    /**
-     * The error for the most recently made request, or null if it hasn't
-     * completed yet or the request resulted in success.
-     *
-     * @attribute error
-     * @type Object
-     * @default null
-     */
-    error: null,
-
-    /**
-     * The HTTP method to use such as 'GET', 'POST', 'PUT', or 'DELETE'.
-     * Default is 'GET'.
-     *
-     * @attribute method
-     * @type string
-     * @default ''
-     */
-    method: '',
-
-    /**
-     * HTTP request headers to send.
-     *
-     * Example:
-     *
-     *     <core-ajax
-     *         auto
-     *         url="http://somesite.com"
-     *         headers='{"X-Requested-With": "XMLHttpRequest"}'
-     *         handleAs="json"
-     *         on-core-response="{{handleResponse}}"></core-ajax>
-     *
-     * @attribute headers
-     * @type Object
-     * @default null
-     */
-    headers: null,
-
-    /**
-     * Optional raw body content to send when method === "POST".
-     *
-     * Example:
-     *
-     *     <core-ajax method="POST" auto url="http://somesite.com"
-     *         body='{"foo":1, "bar":2}'>
-     *     </core-ajax>
-     *
-     * @attribute body
-     * @type Object
-     * @default null
-     */
-    body: null,
-
-    /**
-     * Content type to use when sending data.
-     *
-     * @attribute contentType
-     * @type string
-     * @default 'application/x-www-form-urlencoded'
-     */
-    contentType: 'application/x-www-form-urlencoded',
-
-    /**
-     * Set the withCredentials flag on the request.
-     *
-     * @attribute withCredentials
-     * @type boolean
-     * @default false
-     */
-    withCredentials: false,
-
-    /**
-     * Additional properties to send to core-xhr.
-     *
-     * Can be set to an object containing default properties
-     * to send as arguments to the `core-xhr.request()` method
-     * which implements the low-level communication.
-     *
-     * @property xhrArgs
-     * @type Object
-     * @default null
-     */
-    xhrArgs: null,
-
-    ready: function() {
-      this.xhr = document.createElement('core-xhr');
-    },
-
-    receive: function(response, xhr) {
-      if (this.isSuccess(xhr)) {
-        this.processResponse(xhr);
-      } else {
-        this.processError(xhr);
-      }
-      this.complete(xhr);
-    },
-
-    isSuccess: function(xhr) {
-      var status = xhr.status || 0;
-      return !status || (status >= 200 && status < 300);
-    },
-
-    processResponse: function(xhr) {
-      var response = this.evalResponse(xhr);
-      if (xhr === this.activeRequest) {
-        this.response = response;
-      }
-      this.fire('core-response', {response: response, xhr: xhr});
-    },
-
-    processError: function(xhr) {
-      var response = xhr.status + ': ' + xhr.responseText;
-      if (xhr === this.activeRequest) {
-        this.error = response;
-      }
-      this.fire('core-error', {response: response, xhr: xhr});
-    },
-
-    complete: function(xhr) {
-      this.fire('core-complete', {response: xhr.status, xhr: xhr});
-    },
-
-    evalResponse: function(xhr) {
-      return this[(this.handleAs || 'text') + 'Handler'](xhr);
-    },
-
-    xmlHandler: function(xhr) {
-      return xhr.responseXML;
-    },
-
-    textHandler: function(xhr) {
-      return xhr.responseText;
-    },
-
-    jsonHandler: function(xhr) {
-      var r = xhr.responseText;
-      try {
-        return JSON.parse(r);
-      } catch (x) {
-        console.warn('core-ajax caught an exception trying to parse response as JSON:');
-        console.warn('url:', this.url);
-        console.warn(x);
-        return r;
-      }
-    },
-
-    documentHandler: function(xhr) {
-      return xhr.response;
-    },
-
-    blobHandler: function(xhr) {
-      return xhr.response;
-    },
-
-    arraybufferHandler: function(xhr) {
-      return xhr.response;
-    },
-
-    urlChanged: function() {
-      if (!this.handleAs) {
-        var ext = String(this.url).split('.').pop();
-        switch (ext) {
-          case 'json':
-            this.handleAs = 'json';
-            break;
-        }
-      }
-      this.autoGo();
-    },
-
-    paramsChanged: function() {
-      this.autoGo();
-    },
-
-    autoChanged: function() {
-      this.autoGo();
-    },
-
-    // TODO(sorvell): multiple side-effects could call autoGo
-    // during one micro-task, use a job to have only one action
-    // occur
-    autoGo: function() {
-      if (this.auto) {
-        this.goJob = this.job(this.goJob, this.go, 0);
-      }
-    },
-
-    /**
-     * Performs an Ajax request to the specified URL.
-     *
-     * @method go
-     */
-    go: function() {
-      var args = this.xhrArgs || {};
-      // TODO(sjmiles): we may want XHR to default to POST if body is set
-      args.body = this.body || args.body;
-      args.params = this.params || args.params;
-      if (args.params && typeof(args.params) == 'string') {
-        args.params = JSON.parse(args.params);
-      }
-      args.headers = this.headers || args.headers || {};
-      if (args.headers && typeof(args.headers) == 'string') {
-        args.headers = JSON.parse(args.headers);
-      }
-      var hasContentType = Object.keys(args.headers).some(function (header) {
-        return header.toLowerCase() === 'content-type';
-      });
-      if (!hasContentType && this.contentType) {
-        args.headers['Content-Type'] = this.contentType;
-      }
-      if (this.handleAs === 'arraybuffer' || this.handleAs === 'blob' ||
-          this.handleAs === 'document') {
-        args.responseType = this.handleAs;
-      }
-      args.withCredentials = this.withCredentials;
-      args.callback = this.receive.bind(this);
-      args.url = this.url;
-      args.method = this.method;
-
-      this.response = this.error = null;
-      this.activeRequest = args.url && this.xhr.request(args);
-      return this.activeRequest;
-    }
-
-  });
-
-</script>
-</polymer-element>
-
-<!--
-Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
 <!--
 `paper-toast` provides lightweight feedback about an operation in a small popup 
 at the base of the screen on mobile and at the lower left on desktop. Toasts are 
@@ -14186,26 +13723,10 @@ core-item {
 
 <polymer-element name="home-assistant-api" attributes="auth" assetpath="polymer/">
   <template>
-    <style>
-    core-ajax {
-      display: none;
-    }
-    </style>
-
     <paper-toast id="toast" role="alert" text=""></paper-toast>
     <event-fire-dialog id="eventDialog" api="{{api}}"></event-fire-dialog>
     <service-call-dialog id="serviceDialog" api="{{api}}"></service-call-dialog>
     <state-set-dialog id="stateDialog" api="{{api}}"></state-set-dialog>
-
-    <core-ajax id="statesAjax" method="GET" url="/api/states" headers="{{ha_headers}}" on-core-response="{{statesLoaded}}" handleas="json">
-    </core-ajax>
-
-    <core-ajax id="eventsAjax" method="GET" url="/api/events" headers="{{ha_headers}}" on-core-response="{{eventsLoaded}}" handleas="json">
-    </core-ajax>
-
-    <core-ajax id="servicesAjax" method="GET" url="/api/services" headers="{{ha_headers}}" on-core-response="{{servicesLoaded}}" handleas="json">
-    </core-ajax>
-
   </template>
   <script>
   Polymer('home-assistant-api',{
diff --git a/homeassistant/components/http/www_static/polymer/bower.json b/homeassistant/components/http/www_static/polymer/bower.json
index d9bb5f79e9d5b24dacef51a0d6301b4eaf8fdc5f..9490918ce0c4ef9a9b85f2bc86d82bf623c972ff 100644
--- a/homeassistant/components/http/www_static/polymer/bower.json
+++ b/homeassistant/components/http/www_static/polymer/bower.json
@@ -21,7 +21,6 @@
     "core-toolbar": "Polymer/core-toolbar#~0.4.2",
     "core-icon-button": "Polymer/core-icon-button#~0.4.2",
     "paper-fab": "Polymer/paper-fab#~0.4.2",
-    "core-ajax": "Polymer/core-ajax#~0.4.2",
     "paper-toast": "Polymer/paper-toast#~0.4.2",
     "paper-dialog": "Polymer/paper-dialog#~0.4.2",
     "paper-button": "Polymer/paper-button#~0.4.2",
diff --git a/homeassistant/components/http/www_static/polymer/home-assistant-api.html b/homeassistant/components/http/www_static/polymer/home-assistant-api.html
index 4c48f9ca33f32f443f47abedb3bddcb462b0256f..1890bfa726dfa25eaa2793ba92afd8656ccd5c1f 100644
--- a/homeassistant/components/http/www_static/polymer/home-assistant-api.html
+++ b/homeassistant/components/http/www_static/polymer/home-assistant-api.html
@@ -1,5 +1,4 @@
 <link rel="import" href="bower_components/polymer/polymer.html">
-<link rel="import" href="bower_components/core-ajax/core-ajax.html">
 <link rel="import" href="bower_components/paper-toast/paper-toast.html">
 
 <link rel="import" href="event-fire-dialog.html">
@@ -8,41 +7,10 @@
 
 <polymer-element name="home-assistant-api" attributes="auth">
   <template>
-    <style>
-    core-ajax {
-      display: none;
-    }
-    </style>
-
     <paper-toast id="toast" role="alert" text=""></paper-toast>
     <event-fire-dialog id="eventDialog" api={{api}}></event-fire-dialog>
     <service-call-dialog id="serviceDialog" api={{api}}></service-call-dialog>
     <state-set-dialog id="stateDialog" api={{api}}></state-set-dialog>
-
-    <core-ajax id="statesAjax"
-      method="GET"
-      url="/api/states"
-      headers="{{ha_headers}}"
-      on-core-response="{{statesLoaded}}"
-      handleAs="json">
-    </core-ajax>
-
-    <core-ajax id="eventsAjax"
-      method="GET"
-      url="/api/events"
-      headers="{{ha_headers}}"
-      on-core-response="{{eventsLoaded}}"
-      handleAs="json">
-    </core-ajax>
-
-    <core-ajax id="servicesAjax"
-      method="GET"
-      url="/api/services"
-      headers="{{ha_headers}}"
-      on-core-response="{{servicesLoaded}}"
-      handleAs="json">
-    </core-ajax>
-
   </template>
   <script>
   Polymer({
diff --git a/homeassistant/components/http/www_static/polymer/state-card.html b/homeassistant/components/http/www_static/polymer/state-card.html
index b9d871aad95f7e8ff4f4e26ea6330fd669b2e9e2..74c7b5a3d1dedebf0dd4db200fd51bbffa36e036 100755
--- a/homeassistant/components/http/www_static/polymer/state-card.html
+++ b/homeassistant/components/http/www_static/polymer/state-card.html
@@ -135,7 +135,7 @@
     entity_id: "",
 
     stateChanged: function(oldVal, newVal) {
-      this.state_unknown = newVal == "";
+      this.state_unknown = newVal == null;
 
       if(this.$.toggleButton) {
         this.$.toggleButton.checked = this.state == 'on';
@@ -159,14 +159,15 @@
     },
 
     toggle: function(ev) {
-      if(this.$.toggleButton.checked) {
+      if(this.state == "off") {
         this.turn_on();
       } else {
         this.turn_off();
       }
 
+      // unset state while we wait for an update
       var delayUnsetSate = function() {
-        this.state = "";
+        this.state = null;
       }
       setTimeout(delayUnsetSate.bind(this), 500);
     },
diff --git a/homeassistant/components/http/www_static/polymer/states-cards.html b/homeassistant/components/http/www_static/polymer/states-cards.html
index 64c4ad265826e7978eb55a8482991f2b12332609..1c1bed4f1f4592b54e6c33276f329e142b038298 100755
--- a/homeassistant/components/http/www_static/polymer/states-cards.html
+++ b/homeassistant/components/http/www_static/polymer/states-cards.html
@@ -22,18 +22,6 @@
     </style>
 
     <div horizontal layout wrap>
-      <template if="{{filter != null}}">
-        <state-card
-          entity="{{filter_state.entity_id}}"
-          state="{{filter_state.state}}"
-          last_changed="{{filter_state.last_changed}}"
-          state_attr="{{filter_state.attributes}}"
-          cb_turn_on="{{api.turn_on}}"
-          cb_turn_off="{{api.turn_off}}"
-          cb_edit={{editCallback}}>
-        </state-card>
-      </template>
-
       <template repeat="{{state in states}}">
         <state-card
           entity="{{state.entity_id}}"
@@ -80,16 +68,18 @@
 
     refilterStates: function() {
       if(this.filter == null) {
-        this.filter_state = null;
         this.states = this.raw_states;
+
       } else {
-        this.filter_state = this.api.getState(this.filter);
+        var filter_state = this.api.getState(this.filter);
 
         var map_states = function(entity_id) {
           return this.api.getState(entity_id);
         }.bind(this)
 
-        this.states = this.filter_state.attributes.entity_id.map(map_states)
+        // take the parent state and append it's children
+        this.states = [filter_state].concat(
+          filter_state.attributes.entity_id.map(map_states))
       }
     },