diff --git a/pd/nw/dialog_search.html b/pd/nw/dialog_search.html
index ce91076e0c30b25b304b7f745826ee7a5e0a92e3..e543d6d55a3df9e639774b5f1661c4285cdcc3b9 100644
--- a/pd/nw/dialog_search.html
+++ b/pd/nw/dialog_search.html
@@ -28,11 +28,19 @@ index.setRef("id");
 var filetypes = [".pd", ".txt", ".htm", ".html", ".pdf"];
 
 // Table of Contents to start with
+/* NOTE: A section title is indicated by an entry consisting just of the title
+   field. All other entries *must* also contain the directory (relative to the
+   pd-l2ork lib directory) in the id field, and may optionally contain a
+   description field. */
 var toc = [
+    // Original Pd documentation
+    {
+        title: "Pure Data",
+    },
     {
         id: "doc/1.manual",
         title: "Pd Manual",
-        description: "detailed description of the program's behavior and user interface"
+        description: "HTML manual for Pure Data"
     },
     {
         id: "doc/2.control.examples",
@@ -45,10 +53,100 @@ var toc = [
         description: "objects and concepts related to producing audio in realtime"
     },
     {
-        id: "doc/4.data.structures/pd-l2ork/ds-tutorials",
+        id: "doc/4.data.structures",
         title: "Data Structures",
         description: "custom data manipulation and interactive graphics"
-    }
+    },
+    {
+        id: "doc/5.reference",
+        title: "Reference",
+        description: "reference patches for key concepts and built-in objects"
+    },
+    {
+        id: "doc/6.externs",
+        title: "Externals",
+        description: "how to code control and signal objects in C"
+    },
+/*  // Section 7 of the vanilla Pd docs, uncomment these if needed.
+    {
+        title: "Stuff",
+    },
+    {
+        id: "doc/7.stuff/soundfile-tools",
+        title: "Soundfile Tools",
+        description: "some standard audio transformations packaged to work with mono soundfiles"
+    },
+    {
+        id: "doc/7.stuff/synth",
+        title: "Synth",
+        description: "polyphonic subtractive synthesizer example"
+    },
+    {
+        id: "doc/7.stuff/tools",
+        title: "Tools",
+        description: "useful little helper patches"
+    },
+*/
+    // Pd-L2Ork extras
+    {
+        title: "Pd-L2Ork",
+    },
+    {
+        id: "doc/4.data.structures/pd-l2ork/ds-tutorials",
+        title: "Data Structure Tutorials",
+        description: "overview of svg-based data structure drawing commands"
+    },
+    {
+        id: "extra/disis",
+        title: "DISIS",
+        description: "DISIS externals (wiimote et al)"
+    },
+    // PDDP tutorials
+    {
+        title: "PDDP Tutorials",
+    },
+    {
+        id: "doc/manuals/0.Intro",
+        title: "Intro",
+        description: "getting started with Pd"
+    },
+    {
+        id: "doc/manuals/1.Sound",
+        title: "Sound",
+        description: "Pd sound examples"
+    },
+    {
+        id: "doc/manuals/2.Image",
+        title: "Image",
+        description: "3D graphics with GEM"
+    },
+    {
+        id: "doc/manuals/3.Networking",
+        title: "Networking",
+        description: "introduction to Pd's networking facilities"
+    },
+    // External libraries
+    // NOTE: These are just some popular examples. Pd-L2Ork ships with
+    // many external libraries, too many to list them all. Feel free
+    // to edit this list as needed.
+    {
+        title: "Externals",
+    },
+    {
+        id: "extra/cyclone",
+        title: "Cyclone",
+        description: "library of clones of Max/MSP 4.x objects"
+    },
+    {
+        id: "extra/Gem",
+        title: "GEM",
+        description: "Graphics Environment for Multimedia (OpenGL graphics in Pd)"
+    },
+    {
+        id: "extra/lyon",
+        title: "LyonPotpourri",
+        description: "Eric Lyon's external collection"
+    },
 ];
 
 // Stop-gap translator
@@ -127,16 +225,26 @@ function display_toc() {
         text_node;
     toc.forEach(function(doc, i, a) {
         div = document.createElement("div");
-        a = document.createElement("a");
-        a.href = "javascript: click_toc('" + doc.id + "');";
-        a.textContent = doc.title;
-        // set title to path for tooltip
-        a.title = doc.id;
-        header = document.createElement("h3");
-        header.appendChild(a);
-        text_node = document.createTextNode(doc.description);
-        div.appendChild(header);
-        div.appendChild(text_node);
+	if (doc.id) {
+            a = document.createElement("a");
+            a.href = "javascript: click_toc('" + doc.id + "');";
+            a.textContent = doc.title;
+            // set title to path for tooltip
+            a.title = doc.id;
+            header = document.createElement("h3");
+            header.appendChild(a);
+            div.appendChild(header);
+	    if (doc.description) {
+		text_node = document.createTextNode(doc.description);
+		div.appendChild(text_node);
+	    }
+	} else {
+	    // make a session title
+            header = document.createElement("h2");
+            text_node = document.createTextNode(doc.title);
+            header.appendChild(text_node);
+            div.appendChild(header);
+	}
         results_elem.appendChild(div);
     });
 }
@@ -169,7 +277,7 @@ function display_directory_callback(err, files) {
                 doc_path = path.join(current_dir, f);
                 doc = index.documentStore.getDoc(doc_path) || {
                     id: doc_path,
-                    title: f,
+                    title: path.basename(f, ".pd"),
                     description: null
                 };
                 display_doc(doc);
@@ -190,9 +298,9 @@ function file_browser_click() {
 
 function file_browser_callback(elem) {
     var doc = elem.value;
-    pdgui.post("file callback: file is " + elem.value);
-    pdgui.post("dir is " + pdgui.defunkify_windows_path(path.dirname(doc)));
-    pdgui.post("file is " + pdgui.defunkify_windows_path(path.basename(doc)));
+    //pdgui.post("file callback: file is " + elem.value);
+    //pdgui.post("dir is " + pdgui.defunkify_windows_path(path.dirname(doc)));
+    //pdgui.post("file is " + pdgui.defunkify_windows_path(path.basename(doc)));
     pdgui.doc_open(pdgui.defunkify_windows_path(path.dirname(doc)),
         pdgui.defunkify_windows_path(path.basename(doc)));
     display_directory(pdgui.defunkify_windows_path(path.dirname(doc)));
@@ -414,7 +522,7 @@ function register_window_id(id, attrs) {
     add_events();
     // set file types for the file dialog
     document.getElementById("file_browser").accept = filetypes.join(",");
-    document.getElementById("results").textContent = "Building Index...";
+    document.getElementById("results").textContent = "Building index...";
     document.getElementById("search_text").disabled = true;
     document.getElementById("file_browser").setAttribute("nwworkingdir",
         pdgui.get_gui_dir() + "/doc"); // Probably need a doc getter in pdgui
@@ -422,7 +530,7 @@ function register_window_id(id, attrs) {
 }
 
 function display_no_results() {
-    document.getElementById("results").textContent = "No Results Found.";
+    document.getElementById("results").textContent = "No results found.";
 }
 
 function display_doc(doc) {
@@ -439,9 +547,11 @@ function display_doc(doc) {
     a.title = doc.id;
     header = document.createElement("h3");
     header.appendChild(a);
-    text_node = document.createTextNode(doc.description);
     div.appendChild(header);
-    div.appendChild(text_node);
+    if (doc.description) {
+	text_node = document.createTextNode(doc.description);
+	div.appendChild(text_node);
+    }
     results_elem.appendChild(div);
 }
 
@@ -451,9 +561,16 @@ function doc_search() {
         results,
         doc,
         i;
-    // if the search term is doc/* short circuit the search and
-    // just list the docs in that directory
-    if (search_text.slice(0, 4) === "doc/" &&
+    // if the search term is empty then just redisplay the toc
+    if (!search_text) {
+        clear_results();
+        display_toc();
+        return;
+    }
+    // if the search term is doc/* or extra/* then short circuit
+    // the search and just list the docs in that directory
+    if ((search_text.slice(0, 4) === "doc/" ||
+         search_text.slice(0, 6) === "extra/") &&
         search_text.indexOf(" ") === -1) {
         display_directory(path.join(pdgui.get_lib_dir(), search_text));
         return;