diff --git a/index.html b/index.html
index 9566067ed..c958f51f6 100644
--- a/index.html
+++ b/index.html
@@ -159,6 +159,7 @@
         <script type="text/javascript" src="js/views/conversation_view.js"></script>
         <script type="text/javascript" src="js/views/new_conversation_view.js"></script>
         <script type="text/javascript" src="js/views/new_group_view.js"></script>
+        <script type="text/javascript" src="js/views/inbox_view.js"></script>
         <script type="text/javascript" src="js/index.js"></script>
         <div id="listener"></div>
         <div id="log"></div>
diff --git a/js/index.js b/js/index.js
index 8f825dfbd..e5a418729 100644
--- a/js/index.js
+++ b/js/index.js
@@ -15,63 +15,14 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 (function () {
-    'use strict';
-    Whisper.Layout = new (Backbone.View.extend({
-        initialize: function () {
-            this.gutter = $('#gutter');
-            this.contacts = $('#contacts');
-            this.resize();
+  'use strict';
 
-            window.addEventListener('resize', this.resize.bind(this));
-
-            new Whisper.ConversationListView({el: $('#contacts'), collection: Whisper.Conversations});
-            Whisper.Conversations.fetch({reset: true}).then(function() {
-                if (Whisper.Conversations.length) {
-                    Whisper.Conversations.at(0).trigger('render');
-                }
-            });
-
-        },
-        events: {
-            'click #new-message': 'new_message',
-            'click #new-group': 'new_group'
-        },
-
-        new_message: function (e) {
-            e.preventDefault();
-            $('.conversation').hide().trigger('close'); // detach any existing conversation views
-            this.view = new Whisper.NewConversationView();
-            //todo: less new
-        },
-
-        new_group: function (e) {
-            e.preventDefault();
-            $('.conversation').trigger('close'); // detach any existing conversation views
-            new Whisper.NewGroupView();
-        },
-        resize: function (e) {
-            var windowheight = window.innerHeight,
-                form = $('.send-message-area').outerHeight(),
-                gutter_offset = this.gutter.offset().top,
-                contacts_offset = this.contacts.offset().top;
-            if (window.innerWidth < 480) {
-                this.gutter.css('height', windowheight - gutter_offset - form);
-                this.contacts.css('height', windowheight - contacts_offset - form);
-            } else {
-                this.gutter.css('height', windowheight - gutter_offset);
-                this.contacts.css('height', windowheight - contacts_offset);
-            }
-            $('.discussion').css('height', windowheight - gutter_offset - form);
-        },
-        setContent: function (content) {
-            $(content).insertAfter(this.gutter);
-            this.resize();
-        }
-    }))({el: document});
+    window.Whisper = window.Whisper || {};
 
     if (textsecure.storage.getUnencrypted("number_id") === undefined) {
         window.location = '/options.html';
     } else {
+        Whisper.Layout = new Whisper.InboxView({el: document});
         textsecure.storage.putUnencrypted("unreadCount", 0);
         extension.navigator.setBadgeText("");
     }
diff --git a/js/models/conversations.js b/js/models/conversations.js
index b83173122..f65adebc2 100644
--- a/js/models/conversations.js
+++ b/js/models/conversations.js
@@ -59,12 +59,13 @@
     sendMessage: function(message, attachments) {
       return encodeAttachments(attachments).then(function(base64_attachments) {
         var timestamp = Date.now();
-        this.messages().add({ body: message,
-                              timestamp: timestamp,
-                              conversationId: this.id,
-                              conversationType: this.get('type'),
-                              type: 'outgoing',
-                              attachments: base64_attachments
+        this.messageCollection.add({
+            body             : message,
+            timestamp        : timestamp,
+            conversationId   : this.id,
+            conversationType : this.get('type'),
+            type             : 'outgoing',
+            attachments      : base64_attachments
         }).save();
 
         this.save({ timestamp:   timestamp,
@@ -88,7 +89,7 @@
       var conversation = this;
       return encodeAttachments(decrypted.message.attachments).then(function(base64_attachments) {
         var timestamp = decrypted.pushMessage.timestamp.toNumber();
-        var m = this.messages().add({
+        var m = this.messageCollection.add({
           body: decrypted.message.body,
           timestamp: timestamp,
           conversationId: this.id,
@@ -103,19 +104,15 @@
         }
         this.save({unreadCount: this.get('unreadCount') + 1, active: true});
 
-        return new Promise(function (resolve) { m.save().then(resolve) });
+        return new Promise(function (resolve) { m.save().then(resolve(m)) });
       }.bind(this));
     },
 
-    fetch: function(options) {
+    fetchMessages: function(options) {
         options = options || {};
         options.conditions = {conversationId: this.id };
         return this.messageCollection.fetch(options);
-    },
-
-    messages: function() {
-      return this.messageCollection;
-    },
+    }
   });
 
   Whisper.ConversationCollection = Backbone.Collection.extend({
diff --git a/js/views/conversation_view.js b/js/views/conversation_view.js
index 92ff5ec24..9f4d61239 100644
--- a/js/views/conversation_view.js
+++ b/js/views/conversation_view.js
@@ -13,10 +13,9 @@
  * You should have received a copy of the GNU Lesser General Public License
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
-var Whisper = Whisper || {};
-
 (function () {
   'use strict';
+    window.Whisper = window.Whisper || {};
 
     Whisper.ConversationView = Backbone.View.extend({
         className: 'conversation',
@@ -31,12 +30,11 @@ var Whisper = Whisper || {};
             });
 
             this.view = new Whisper.MessageListView({
-                collection: this.model.messages()
+                collection: this.model.messageCollection
             });
             this.$el.find('.discussion-container').append(this.view.el);
 
-            this.model.fetch({reset: true});
-            extension.onMessage('message', this.model.fetch.bind(this.model));
+            this.model.fetchMessages({reset: true});
         },
 
         events: {
@@ -60,7 +58,6 @@ var Whisper = Whisper || {};
 
         render: function() {
             Whisper.Layout.setContent(this.$el.show());
-            this.view.scrollToBottom();
             return this;
         }
     });
diff --git a/js/views/inbox_view.js b/js/views/inbox_view.js
new file mode 100644
index 000000000..dafeed36a
--- /dev/null
+++ b/js/views/inbox_view.js
@@ -0,0 +1,80 @@
+/* vim: ts=4:sw=4:expandtab
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+(function () {
+  'use strict';
+
+   window.Whisper = window.Whisper || {};
+
+    Whisper.InboxView = Backbone.View.extend({
+        initialize: function () {
+            this.gutter = $('#gutter');
+            this.contacts = $('#contacts');
+            this.resize();
+
+            window.addEventListener('resize', this.resize.bind(this));
+            this.conversations = new Whisper.ConversationCollection();
+
+            new Whisper.ConversationListView({el: $('#contacts'), collection: Whisper.Conversations});
+            Whisper.Conversations.fetch({reset: true}).then(function() {
+                if (Whisper.Conversations.length) {
+                    Whisper.Conversations.at(0).trigger('render');
+                }
+            });
+            extension.onMessage('message', function(message) {
+                Whisper.Conversations.fetch({id: message.conversationId}).then(function() {
+                    Whisper.Conversations.get(message.conversationId).fetchMessages();
+                });
+            }.bind(this));
+
+        },
+        events: {
+            'click #new-message': 'new_message',
+            'click #new-group': 'new_group'
+        },
+
+        new_message: function (e) {
+            e.preventDefault();
+            $('.conversation').hide().trigger('close'); // detach any existing conversation views
+            this.view = new Whisper.NewConversationView();
+            //todo: less new
+        },
+
+        new_group: function (e) {
+            e.preventDefault();
+            $('.conversation').trigger('close'); // detach any existing conversation views
+            new Whisper.NewGroupView();
+        },
+        resize: function (e) {
+            var windowheight = window.innerHeight,
+                form = $('.send-message-area').outerHeight(),
+                gutter_offset = this.gutter.offset().top,
+                contacts_offset = this.contacts.offset().top;
+            if (window.innerWidth < 480) {
+                this.gutter.css('height', windowheight - gutter_offset - form);
+                this.contacts.css('height', windowheight - contacts_offset - form);
+            } else {
+                this.gutter.css('height', windowheight - gutter_offset);
+                this.contacts.css('height', windowheight - contacts_offset);
+            }
+            $('.discussion').css('height', windowheight - gutter_offset - form);
+        },
+        setContent: function (content) {
+            $(content).insertAfter(this.gutter);
+            this.resize();
+        }
+    });
+
+})();
diff --git a/js/views/message_list_view.js b/js/views/message_list_view.js
index 18f727918..ea8edfb76 100644
--- a/js/views/message_list_view.js
+++ b/js/views/message_list_view.js
@@ -19,6 +19,7 @@ var Whisper = Whisper || {};
         var view = new this.itemView({model: model});
         this.$el.prepend(view.render().el);
       }, this);
+      this.scrollToBottom();
     },
   });
 })();