diff --git a/addons/web_editor/static/src/js/ace.js b/addons/web_editor/static/src/js/ace.js
index cd20815f49c561b497e29488c692b74d89bbcc2f..5fbe7589265d049db0e12e549b283f63268c4adf 100644
--- a/addons/web_editor/static/src/js/ace.js
+++ b/addons/web_editor/static/src/js/ace.js
@@ -127,13 +127,14 @@ var ViewEditor = Widget.extend({
 
     loadViews: function (views) {
         var $viewList = this.$('#ace-view-list').empty();
-        _(this.buildViewGraph(views)).each(function (view) {
+        var viewGraph = this.buildViewGraph(views);
+        _(viewGraph).each(function (view) {
             if (!view.id) { return; }
 
             this.views[view.id] = view;
             new ViewOption(this, view).appendTo($viewList);
-            this.loadView(view.id);
         }.bind(this));
+        return this.loadView(viewGraph[0].id);
     },
     buildViewGraph: function (views) {
         var activeViews = _.uniq(_.filter(views, function (view) {
@@ -171,32 +172,36 @@ var ViewEditor = Widget.extend({
     loadView: function (id) {
         var viewId = parseInt(id, 10);
         var self = this;
-        ajax.jsonRpc('/web/dataset/call', 'call', {
+        return ajax.jsonRpc('/web/dataset/call', 'call', {
             model: 'ir.ui.view',
             method: 'read',
             args: [[viewId], ['arch'], _.extend(base.get_context(), {'lang': null})],
         }).then(function (result) {
-            var editingSession = self.buffers[viewId] = new ace.EditSession(result[0].arch);
-            editingSession.setMode("ace/mode/xml");
-            editingSession.setUndoManager(new ace.UndoManager());
-            editingSession.setUseWorker(false);
-            editingSession.on("change", function () {
-                setTimeout(function () {
-                    var $option = self.$('#ace-view-list').find('[value='+viewId+']');
-                    var bufferName = $option.text();
-                    var dirtyMarker = " (unsaved changes)";
-                    var isDirty = editingSession.getUndoManager().hasUndo();
-                    if (isDirty && bufferName.indexOf(dirtyMarker) < 0) {
-                        $option.text(bufferName + dirtyMarker);
-                    } else if (!isDirty && bufferName.indexOf(dirtyMarker) > 0) {
-                        $option.text(bufferName.substring(0, bufferName.indexOf(dirtyMarker)));
-                    }
-                }, 1);
-            });
-            if (viewId === self.selectedViewId()) {
-                self.displayView.call(self, viewId);
-            }
+            self._displayArch(result[0].arch, viewId);
+        });
+    },
+    _displayArch: function(arch, viewId) {
+        var self = this;
+        var editingSession = this.buffers[viewId] = new ace.EditSession(arch);
+        editingSession.setUseWorker(false);
+        editingSession.setMode("ace/mode/xml");
+        editingSession.setUndoManager(new ace.UndoManager());
+        editingSession.on("change", function () {
+            setTimeout(function () {
+                var $option = self.$('#ace-view-list').find('[value='+viewId+']');
+                var bufferName = $option.text();
+                var dirtyMarker = " (unsaved changes)";
+                var isDirty = editingSession.getUndoManager().hasUndo();
+                if (isDirty && bufferName.indexOf(dirtyMarker) < 0) {
+                    $option.text(bufferName + dirtyMarker);
+                } else if (!isDirty && bufferName.indexOf(dirtyMarker) > 0) {
+                    $option.text(bufferName.substring(0, bufferName.indexOf(dirtyMarker)));
+                }
+            }, 1);
         });
+        if (viewId === self.selectedViewId()) {
+            self.displayView.call(self, viewId);
+        }
     },
     selectedViewId: function () {
         return parseInt(this.$('#ace-view-list').val(), 10);
@@ -212,8 +217,16 @@ var ViewEditor = Widget.extend({
         }
     },
     displaySelectedView: function () {
-        this.displayView(this.selectedViewId());
-        this.updateHash();
+        var self = this;
+        var viewID = this.selectedViewId();
+        if (this.buffers[viewID]) {
+            this.displayView(viewID);
+            this.updateHash();
+        } else {
+            this.loadView(viewID).then(function() {
+                self.updateHash();
+            });
+        }
     },
     formatXml: function () {
         var xml = new XmlDocument(this.aceEditor.getValue());