diff --git a/IPython/html/static/base/js/utils.js b/IPython/html/static/base/js/utils.js
index b8aba88..6b731c1 100644
--- a/IPython/html/static/base/js/utils.js
+++ b/IPython/html/static/base/js/utils.js
@@ -488,15 +488,20 @@ IPython.utils = (function (IPython) {
         }
     }
     
+    var ajax_error_msg = function (jqXHR) {
+        // Return a JSON error message if there is one,
+        // otherwise the basic HTTP status text.
+        if (jqXHR.responseJSON && jqXHR.responseJSON.message) {
+            return jqXHR.responseJSON.message;
+        } else {
+            return jqXHR.statusText;
+        }
+    }
     var log_ajax_error = function (jqXHR, status, error) {
         // log ajax failures with informative messages
         var msg = "API request failed (" + jqXHR.status + "): ";
         console.log(jqXHR);
-        if (jqXHR.responseJSON && jqXHR.responseJSON.message) {
-            msg += jqXHR.responseJSON.message;
-        } else {
-            msg += jqXHR.statusText;
-        }
+        msg += ajax_error_msg(jqXHR);
         console.log(msg);
     };
 
@@ -519,6 +524,7 @@ IPython.utils = (function (IPython) {
         platform: platform,
         is_or_has : is_or_has,
         is_focused : is_focused,
+        ajax_error_msg : ajax_error_msg,
         log_ajax_error : log_ajax_error,
     };
 
diff --git a/IPython/html/static/notebook/js/notebook.js b/IPython/html/static/notebook/js/notebook.js
index 7eb913e..1fdb103 100644
--- a/IPython/html/static/notebook/js/notebook.js
+++ b/IPython/html/static/notebook/js/notebook.js
@@ -2125,13 +2125,14 @@ var IPython = (function (IPython) {
      */
     Notebook.prototype.load_notebook_error = function (xhr, status, error) {
         $([IPython.events]).trigger('notebook_load_failed.Notebook', [xhr, status, error]);
-        var msg;
+        utils.log_ajax_error(xhr, status, error);
+        var msg = $("<div>");
         if (xhr.status === 400) {
-            msg = error;
+            msg.text(utils.ajax_error_msg(xhr));
         } else if (xhr.status === 500) {
-            msg = "An unknown error occurred while loading this notebook. " +
+            msg.text("An unknown error occurred while loading this notebook. " +
             "This version can load notebook formats " +
-            "v" + this.nbformat + " or earlier.";
+            "v" + this.nbformat + " or earlier. See the server log for details.");
         }
         IPython.dialog.modal({
             title: "Error loading notebook",
@@ -2402,10 +2403,10 @@ var IPython = (function (IPython) {
      * @method delete_checkpoint_error
      * @param {jqXHR} xhr jQuery Ajax object
      * @param {String} status Description of response status
-     * @param {String} error_msg HTTP error message
+     * @param {String} error HTTP error message
      */
-    Notebook.prototype.delete_checkpoint_error = function (xhr, status, error_msg) {
-        $([IPython.events]).trigger('checkpoint_delete_failed.Notebook');
+    Notebook.prototype.delete_checkpoint_error = function (xhr, status, error) {
+        $([IPython.events]).trigger('checkpoint_delete_failed.Notebook', [xhr, status, error]);
     };
 
 
diff --git a/IPython/nbformat/reader.py b/IPython/nbformat/reader.py
index 78e8a1d..ded716c 100644
--- a/IPython/nbformat/reader.py
+++ b/IPython/nbformat/reader.py
@@ -80,6 +80,8 @@ def reads(s, **kwargs):
     nb : NotebookNode
         The notebook that was read.
     """
+    from .current import NBFormatError
+
     nb_dict = parse_json(s, **kwargs)
     (major, minor) = get_version(nb_dict)
     if major in versions: