diff --git a/app/assets/javascripts/discourse/components/category-drop.js.es6 b/app/assets/javascripts/discourse/components/category-drop.js.es6
index faa87ea45ce..bb63d0bbf95 100644
--- a/app/assets/javascripts/discourse/components/category-drop.js.es6
+++ b/app/assets/javascripts/discourse/components/category-drop.js.es6
@@ -2,10 +2,7 @@ var get = Ember.get;
 
 export default Ember.Component.extend({
   classNameBindings: ['category::no-category', 'categories:has-drop','categoryStyle'],
-
-  categoryStyle: function(){
-    return Discourse.SiteSettings.category_style;
-  }.property(),
+  categoryStyle: Discourse.computed.setting('category_style'),
 
   tagName: 'li',
 
@@ -50,11 +47,11 @@ export default Ember.Component.extend({
       if (color) {
         var style = "";
         if (color) { style += "background-color: #" + color + ";" }
-        return style;
+        return style.htmlSafe();
       }
     }
 
-    return "background-color: #eee;";
+    return "background-color: #eee;".htmlSafe();
   }.property('category'),
 
   badgeStyle: function() {
@@ -68,11 +65,11 @@ export default Ember.Component.extend({
         var style = "";
         if (color) { style += "background-color: #" + color + "; border-color: #" + color + ";"; }
         if (textColor) { style += "color: #" + textColor + "; "; }
-        return style;
+        return style.htmlSafe();
       }
     }
 
-    return "background-color: #eee; color: #333";
+    return "background-color: #eee; color: #333".htmlSafe();
   }.property('category'),
 
   clickEventName: function() {
diff --git a/app/assets/javascripts/discourse/controllers/about.js.es6 b/app/assets/javascripts/discourse/controllers/about.js.es6
index e35882706a4..3452f63d3c0 100644
--- a/app/assets/javascripts/discourse/controllers/about.js.es6
+++ b/app/assets/javascripts/discourse/controllers/about.js.es6
@@ -1,6 +1,4 @@
-import ObjectController from 'discourse/controllers/object';
-
-export default ObjectController.extend({
+export default Ember.Controller.extend({
   faqOverriden: Ember.computed.gt('siteSettings.faq_url.length', 0),
 
   contactInfo: function() {
diff --git a/app/assets/javascripts/discourse/controllers/badges/show.js.es6 b/app/assets/javascripts/discourse/controllers/badges/show.js.es6
index ed43f558889..77bfa341bfb 100644
--- a/app/assets/javascripts/discourse/controllers/badges/show.js.es6
+++ b/app/assets/javascripts/discourse/controllers/badges/show.js.es6
@@ -1,25 +1,19 @@
 import ObjectController from 'discourse/controllers/object';
 
-/**
-  Controller for showing a particular badge.
-
-  @class BadgesShowController
-  @extends ObjectController
-  @namespace Discourse
-  @module Discourse
-**/
 export default ObjectController.extend({
+  noMoreBadges: false,
+  userBadges: null,
   needs: ["application"],
 
   actions: {
-    loadMore: function() {
-      var self = this;
-      var userBadges = this.get('userBadges');
+    loadMore() {
+      const self = this;
+      const userBadges = this.get('userBadges');
 
       Discourse.UserBadge.findByBadgeId(this.get('model.id'), {
         offset: userBadges.length
-      }).then(function(userBadges) {
-        self.get('userBadges').pushObjects(userBadges);
+      }).then(function(result) {
+        userBadges.pushObjects(result);
         if(userBadges.length === 0){
           self.set('noMoreBadges', true);
         }
diff --git a/app/assets/javascripts/discourse/controllers/discovery.js.es6 b/app/assets/javascripts/discourse/controllers/discovery.js.es6
index abaaa1e2b4b..6bb1d5ad909 100644
--- a/app/assets/javascripts/discourse/controllers/discovery.js.es6
+++ b/app/assets/javascripts/discourse/controllers/discovery.js.es6
@@ -1,13 +1,11 @@
-import ObjectController from 'discourse/controllers/object';
-
-export default ObjectController.extend({
+export default Ember.Controller.extend({
   needs: ['navigation/category', 'discovery/topics', 'application'],
   loading: false,
 
   category: Em.computed.alias('controllers.navigation/category.category'),
   noSubcategories: Em.computed.alias('controllers.navigation/category.noSubcategories'),
 
-  loadedAllItems: Em.computed.not("controllers.discovery/topics.canLoadMore"),
+  loadedAllItems: Em.computed.not("controllers.discovery/topics.model.canLoadMore"),
 
   _showFooter: function() {
     this.set("controllers.application.showFooter", this.get("loadedAllItems"));
diff --git a/app/assets/javascripts/discourse/controllers/discovery/topics.js.es6 b/app/assets/javascripts/discourse/controllers/discovery/topics.js.es6
index 293d9c826c7..98bb9e70e1b 100644
--- a/app/assets/javascripts/discourse/controllers/discovery/topics.js.es6
+++ b/app/assets/javascripts/discourse/controllers/discovery/topics.js.es6
@@ -13,6 +13,7 @@ var controllerOpts = {
 
   order: 'default',
   ascending: false,
+  expandGloballyPinned: false,
 
   actions: {
 
@@ -80,6 +81,7 @@ var controllerOpts = {
   }.property(),
 
   isFilterPage: function(filter, filterType) {
+    if (!filter) { return false; }
     return filter.match(new RegExp(filterType + '$', 'gi')) ? true : false;
   },
 
@@ -92,15 +94,15 @@ var controllerOpts = {
   }.property('filter', 'topics.length'),
 
   showDismissAtTop: function() {
-    return (this.isFilterPage(this.get('filter'), 'new') ||
-           this.isFilterPage(this.get('filter'), 'unread')) &&
-           this.get('topics.length') >= 30;
-  }.property('filter', 'topics.length'),
+    return (this.isFilterPage(this.get('model.filter'), 'new') ||
+           this.isFilterPage(this.get('model.filter'), 'unread')) &&
+           this.get('model.topics.length') >= 30;
+  }.property('model.filter', 'model.topics.length'),
 
-  hasTopics: Em.computed.gt('topics.length', 0),
-  allLoaded: Em.computed.empty('more_topics_url'),
-  latest: Discourse.computed.endWith('filter', 'latest'),
-  new: Discourse.computed.endWith('filter', 'new'),
+  hasTopics: Em.computed.gt('model.topics.length', 0),
+  allLoaded: Em.computed.empty('model.more_topics_url'),
+  latest: Discourse.computed.endWith('model.filter', 'latest'),
+  new: Discourse.computed.endWith('model.filter', 'new'),
   top: Em.computed.notEmpty('period'),
   yearly: Em.computed.equal('period', 'yearly'),
   monthly: Em.computed.equal('period', 'monthly'),
@@ -114,7 +116,7 @@ var controllerOpts = {
     if( category ) {
       return I18n.t('topics.bottom.category', {category: category.get('name')});
     } else {
-      var split = this.get('filter').split('/');
+      var split = (this.get('filter') || '').split('/');
       if (this.get('topics.length') === 0) {
         return I18n.t("topics.none." + split[0], {
           category: split[1]
@@ -130,7 +132,7 @@ var controllerOpts = {
   footerEducation: function() {
     if (!this.get('allLoaded') || this.get('topics.length') > 0 || !Discourse.User.current()) { return; }
 
-    var split = this.get('filter').split('/');
+    var split = (this.get('filter') || '').split('/');
 
     if (split[0] !== 'new' && split[0] !== 'unread') { return; }
 
diff --git a/app/assets/javascripts/discourse/controllers/static.js.es6 b/app/assets/javascripts/discourse/controllers/static.js.es6
index f2e18692d0a..2e9050b2d5a 100644
--- a/app/assets/javascripts/discourse/controllers/static.js.es6
+++ b/app/assets/javascripts/discourse/controllers/static.js.es6
@@ -1,9 +1,9 @@
-export default Em.ObjectController.extend({
-  showLoginButton: Em.computed.equal('path', 'login'),
+export default Ember.Controller.extend({
+  showLoginButton: Em.computed.equal('model.path', 'login'),
 
   actions: {
     markFaqRead: function() {
-      if (Discourse.User.current()) {
+      if (this.currentUser) {
         Discourse.ajax("/users/read-faq", { method: "POST" });
       }
     }
diff --git a/app/assets/javascripts/discourse/controllers/topic-entrance.js.es6 b/app/assets/javascripts/discourse/controllers/topic-entrance.js.es6
index 411496b06f0..b98b14550df 100644
--- a/app/assets/javascripts/discourse/controllers/topic-entrance.js.es6
+++ b/app/assets/javascripts/discourse/controllers/topic-entrance.js.es6
@@ -17,7 +17,7 @@ function entranceDate(dt, showTime) {
   );
 }
 
-export default Ember.ObjectController.extend({
+export default Ember.Controller.extend({
   position: null,
 
   createdDate: function() {
@@ -51,11 +51,11 @@ export default Ember.ObjectController.extend({
     },
 
     enterTop: function() {
-      Discourse.URL.routeTo(this.get('url'));
+      Discourse.URL.routeTo(this.get('model.url'));
     },
 
     enterBottom: function() {
-      Discourse.URL.routeTo(this.get('lastPostUrl'));
+      Discourse.URL.routeTo(this.get('model.lastPostUrl'));
     }
   }
 });
diff --git a/app/assets/javascripts/discourse/controllers/user-card.js.es6 b/app/assets/javascripts/discourse/controllers/user-card.js.es6
index 60922c4c152..74fcda0630b 100644
--- a/app/assets/javascripts/discourse/controllers/user-card.js.es6
+++ b/app/assets/javascripts/discourse/controllers/user-card.js.es6
@@ -1,6 +1,4 @@
-import ObjectController from 'discourse/controllers/object';
-
-export default ObjectController.extend({
+export default Ember.Controller.extend({
   needs: ['topic', 'application'],
   visible: false,
   user: null,
diff --git a/app/assets/javascripts/discourse/mixins/string-buffer.js.es6 b/app/assets/javascripts/discourse/mixins/string-buffer.js.es6
index 469873d22f2..ebc293fa9e9 100644
--- a/app/assets/javascripts/discourse/mixins/string-buffer.js.es6
+++ b/app/assets/javascripts/discourse/mixins/string-buffer.js.es6
@@ -19,9 +19,12 @@ export default Ember.Mixin.create({
   },
 
   _rerenderString() {
+    const $sel = this.$();
+    if ($sel) { return; }
+
     const buffer = [];
     this.renderString(buffer);
-    this.$().html(buffer.join(''));
+    $sel.html(buffer.join(''));
   },
 
   rerenderString() {
diff --git a/app/assets/javascripts/discourse/router.js.es6 b/app/assets/javascripts/discourse/router.js.es6
index 70ca3b85768..a7669926df2 100644
--- a/app/assets/javascripts/discourse/router.js.es6
+++ b/app/assets/javascripts/discourse/router.js.es6
@@ -2,7 +2,7 @@ const rootURL = Discourse.BaseUri && Discourse.BaseUri !== "/" ? Discourse.BaseU
 
 const Router = Ember.Router.extend({
   rootURL,
-  location: Ember.Test ? 'none': 'discourse-location'
+  location: Ember.testing ? 'none': 'discourse-location'
 });
 
 export function mapRoutes() {
diff --git a/app/assets/javascripts/discourse/templates/about.hbs b/app/assets/javascripts/discourse/templates/about.hbs
index b555a334862..ca3f050ffe0 100644
--- a/app/assets/javascripts/discourse/templates/about.hbs
+++ b/app/assets/javascripts/discourse/templates/about.hbs
@@ -14,15 +14,15 @@
     </ul>
 
     <section class='about'>
-      <h2>{{i18n 'about.title' title=title}}</h2>
-      <p>{{description}}</p>
+      <h2>{{i18n 'about.title' title=model.title}}</h2>
+      <p>{{model.description}}</p>
     </section>
 
-    {{#if admins}}
+    {{#if model.admins}}
       <section class='about admins'>
         <h3>{{i18n 'about.our_admins'}}</h3>
 
-        {{#each a in admins}}
+        {{#each a in model.admins}}
           {{user-small user=a}}
         {{/each}}
         <div class='clearfix'></div>
@@ -30,12 +30,12 @@
       </section>
     {{/if}}
 
-    {{#if moderators}}
+    {{#if model.moderators}}
       <section class='about moderators'>
         <h3>{{i18n 'about.our_moderators'}}</h3>
 
         <div class='users'>
-          {{#each m in moderators}}
+          {{#each m in model.moderators}}
             {{user-small user=m}}
           {{/each}}
         </div>
@@ -55,33 +55,33 @@
         </tr>
         <tr>
           <td class='title'>{{i18n 'about.topic_count'}}</td>
-          <td>{{number stats.topic_count}}</td>
-          <td>{{number stats.topics_7_days}}</td>
-          <td>{{number stats.topics_30_days}}</td>
+          <td>{{number model.stats.topic_count}}</td>
+          <td>{{number model.stats.topics_7_days}}</td>
+          <td>{{number model.stats.topics_30_days}}</td>
         </tr>
         <tr>
           <td>{{i18n 'about.post_count'}}</td>
-          <td>{{number stats.post_count}}</td>
-          <td>{{number stats.posts_7_days}}</td>
-          <td>{{number stats.posts_30_days}}</td>
+          <td>{{number model.stats.post_count}}</td>
+          <td>{{number model.stats.posts_7_days}}</td>
+          <td>{{number model.stats.posts_30_days}}</td>
         </tr>
         <tr>
           <td>{{i18n 'about.user_count'}}</td>
-          <td>{{number stats.user_count}}</td>
-          <td>{{number stats.users_7_days}}</td>
-          <td>{{number stats.users_30_days}}</td>
+          <td>{{number model.stats.user_count}}</td>
+          <td>{{number model.stats.users_7_days}}</td>
+          <td>{{number model.stats.users_30_days}}</td>
         </tr>
         <tr>
           <td>{{i18n 'about.active_user_count'}}</td>
           <td>&mdash;</td>
-          <td>{{number stats.active_users_7_days}}</td>
-          <td>{{number stats.active_users_30_days}}</td>
+          <td>{{number model.stats.active_users_7_days}}</td>
+          <td>{{number model.stats.active_users_30_days}}</td>
         </tr>
         <tr>
           <td>{{i18n 'about.like_count'}}</td>
-          <td>{{number stats.like_count}}</td>
-          <td>{{number stats.likes_7_days}}</td>
-          <td>{{number stats.likes_30_days}}</td>
+          <td>{{number model.stats.like_count}}</td>
+          <td>{{number model.stats.likes_7_days}}</td>
+          <td>{{number model.stats.likes_30_days}}</td>
         </tr>
       </table>
     </section>
diff --git a/app/assets/javascripts/discourse/templates/badges/show.hbs b/app/assets/javascripts/discourse/templates/badges/show.hbs
index 3579c70eec1..ed72176c528 100644
--- a/app/assets/javascripts/discourse/templates/badges/show.hbs
+++ b/app/assets/javascripts/discourse/templates/badges/show.hbs
@@ -1,16 +1,16 @@
 <div class='container show-badge'>
   <h1>
     {{#link-to 'badges.index'}}{{i18n 'badges.title'}}{{/link-to}}
-    <i class='fa fa-angle-right'></i>
-    {{displayName}}
+    {{fa-icon "angle-right"}}
+    {{model.displayName}}
   </h1>
 
   <table class='badges-listing'>
     <tbody>
       <tr>
-        <td class='badge'>{{user-badge badge=this}}</td>
-        <td class='description'>{{{displayDescriptionHtml}}}</td>
-        <td class='grant-count'>{{i18n 'badges.granted' count=grant_count}}</td>
+        <td class='badge'>{{user-badge badge=model}}</td>
+        <td class='description'>{{{model.displayDescriptionHtml}}}</td>
+        <td class='grant-count'>{{i18n 'badges.granted' count=model.grant_count}}</td>
         <td class='info'>{{i18n 'badges.allow_title'}} {{{view.allowTitle}}}<br>{{i18n 'badges.multiple_grant'}} {{{view.multipleGrant}}}
         </td>
       </tr>
diff --git a/app/assets/javascripts/discourse/templates/components/category-drop.hbs b/app/assets/javascripts/discourse/templates/components/category-drop.hbs
index 803fe6f19ca..f997416464a 100644
--- a/app/assets/javascripts/discourse/templates/components/category-drop.hbs
+++ b/app/assets/javascripts/discourse/templates/components/category-drop.hbs
@@ -1,6 +1,6 @@
 {{#if category}}
-  <a href {{action "expand"}} class="badge-category" {{bind-attr style="badgeStyle"}}>
-    <span class="badge-category-bg" {{bind-attr style="categoryColor"}}></span>
+  <a href {{action "expand"}} class="badge-category" style={{badgeStyle}}>
+    <span class="badge-category-bg" style={{categoryColor}}></span>
     {{#if category.read_restricted}}
       {{fa-icon "lock"}}
     {{/if}}
@@ -8,14 +8,14 @@
   </a>
 {{else}}
   {{#if noSubcategories}}
-    <a href {{action "expand"}} class='badge-category home' {{bind-attr style="badgeStyle"}}>{{i18n 'categories.no_subcategory'}}</a>
+  <a href {{action "expand"}} class='badge-category home' style={{badgeStyle}}>{{i18n 'categories.no_subcategory'}}</a>
   {{else}}
-    <a href {{action "expand"}} class='badge-category home' {{bind-attr style="badgeStyle"}}>{{allCategoriesLabel}}</a>
+  <a href {{action "expand"}} class='badge-category home' style={{badgeStyle}}>{{allCategoriesLabel}}</a>
   {{/if}}
 {{/if}}
 
 {{#if categories}}
-  <a href {{action "expand"}} {{bind-attr class="dropdownButtonClass" style="badgeStyle"}}><i {{bind-attr class="iconClass"}}></i></a>
+  <a href {{action "expand"}} class={{dropdownButtonClass}} style={{badgeStyle}}><i class={{iconClass}}></i></a>
   <section {{bind-attr class="expanded::hidden :category-dropdown-menu :chooser"}}>
     <div class='cat'><a {{bind-attr href=allCategoriesUrl}} data-drop-close="true" class='badge-category home'>{{allCategoriesLabel}}</a></div>
     {{#if subCategory}}
diff --git a/app/assets/javascripts/discourse/templates/discovery/topics.hbs b/app/assets/javascripts/discourse/templates/discovery/topics.hbs
index bdcc9800fb3..5a92b7f011d 100644
--- a/app/assets/javascripts/discourse/templates/discovery/topics.hbs
+++ b/app/assets/javascripts/discourse/templates/discovery/topics.hbs
@@ -39,19 +39,19 @@
         canBulkSelect=canBulkSelect
         changeSort="changeSort"
         toggleBulkSelect="toggleBulkSelect"
-        hideCategory=hideCategory
+        hideCategory=model.hideCategory
         order=order
         ascending=ascending
         bulkSelectEnabled=bulkSelectEnabled
         selected=selected
         expandGloballyPinned=expandGloballyPinned
-        expandAllPinned=expandAllPinned
-        topics=topics}}
+        expandAllPinned=model.expandAllPinned
+        topics=model.topics}}
   {{/if}}
 </div>
 
 <footer class='topic-list-bottom'>
-  {{conditional-loading-spinner condition=loadingMore}}
+  {{conditional-loading-spinner condition=model.loadingMore}}
   {{#if allLoaded}}
     {{#if showDismissRead}}
       <button title="{{i18n 'topics.bulk.dismiss_topics_tooltip'}}" id='dismiss-topics' class='btn dismiss-read' {{action "dismissRead" "topics"}}>{{i18n 'topics.bulk.dismiss_topics'}}</button>
diff --git a/app/assets/javascripts/discourse/templates/static.hbs b/app/assets/javascripts/discourse/templates/static.hbs
index ff09643a727..d84e205785b 100644
--- a/app/assets/javascripts/discourse/templates/static.hbs
+++ b/app/assets/javascripts/discourse/templates/static.hbs
@@ -1,9 +1,9 @@
 <div class='container'>
   <div class='contents clearfix body-page'>
-    {{{html}}}
+    {{{model.html}}}
 
     {{#if showLoginButton}}
-      <button class="btn btn-primary" {{action "showLogin"}}><i class="fa fa-user"></i>{{i18n 'log_in'}}</button>
+    <button class="btn btn-primary" {{action "showLogin"}}>{{fa-icon "user"}}{{i18n 'log_in'}}</button>
     {{/if}}
   </div>
 </div>