diff --git a/tools/sane-desc.c b/tools/sane-desc.c
index 7bbd012..6efa961 100644
--- a/tools/sane-desc.c
+++ b/tools/sane-desc.c
@@ -76,6 +76,7 @@ typedef enum output_mode
   output_mode_html_backends,
   output_mode_html_backends_split,
   output_mode_html_mfgs,
+  output_mode_html_one_big,
   output_mode_statistics,
   output_mode_usermap,
   output_mode_db,
@@ -316,7 +317,7 @@ print_usage (char *program_name)
 	  "                         "
 	  "(multiple directories can be concatenated by \":\")\n");
   printf ("  -m|--mode mode         "
-	  "Output mode (ascii, html-backends-split, html-mfgs,\n"
+	  "Output mode (ascii, html-backends-split, html-mfgs, html-one-big\n"
 	  "                         xml, statistics, usermap, db, udev, udev+acl, plist, hal, hal-new)\n");
   printf ("  -t|--title \"title\"     The title used for HTML pages\n");
   printf ("  -i|--intro \"intro\"     A short description of the "
@@ -394,6 +395,11 @@ get_options (int argc, char **argv)
 	      DBG_INFO ("Output mode: %s\n", optarg);
 	      mode = output_mode_html_mfgs;
 	    }
+	  else if (strcmp (optarg, "html-one-big") == 0)
+	    {
+	      DBG_INFO ("Output mode: %s\n", optarg);
+	      mode = output_mode_html_one_big;
+	    }
 	  else if (strcmp (optarg, "statistics") == 0)
 	    {
 	      DBG_INFO ("Output mode: %s\n", optarg);
@@ -1992,6 +1998,204 @@ ascii_print_backends (void)
     }				/* while (be) */
 }
 
+char *none_if_null(char *string) {
+	return string == NULL ? "*none*" : string;
+}
+
+void printf_td(char *class, char *content) {
+	printf ("\t<td class=\"%s\">%s</td>\n", class, content == NULL ? "*none*" : content);
+}
+
+void printf_td_url_chain(char *class, char *text, url_entry *url) {
+	printf ("\t<td class=\"%s\">", class);
+	if (url)
+		printf("<a href=\"%s\">%s</a>", url->name, text);
+	else
+		printf (text);
+	printf ("</td>\n");
+}
+
+void printf_td_type (char *class, device_type type) {
+	printf_td (class, type == type_scanner
+		? "scanner"
+		: type == type_stillcam
+			? "stillcam"
+			: type == type_vidcam
+				? "vidcam"
+				: type == type_meta
+					? "meta"
+					: type == type_api
+						? "api"
+						: "*unknown*");
+}
+
+char *model_status_text(status_entry status) {
+	return status == status_minimal
+		? "minimal"
+		: status == status_basic
+			? "basic"
+			: status == status_good
+				? "good"
+				: status ==	status_complete
+					? "complete"
+					: status == status_untested
+						? "untested"
+							: status == status_unsupported
+								? "unsupported"
+								: NULL;
+}
+
+void printf_td_status(char *class, status_entry status) {
+	char long_class[30] = "status-";
+	char *status_text = model_status_text(status);
+	strncat(&long_class, status_text, sizeof(long_class));
+	printf_td (&long_class, status_text);
+}
+
+char *strip_html_char(char *buf) {
+	char *p = buf;
+	while (*p) {
+		if (*p == '<' || *p == '>') {
+			*p = ' ';
+		}
+		++p;
+	}
+	return buf;
+}
+
+#define HTML_HEADER \
+"<!DOCTYPE HTML PUBLIC \"ISO/IEC 15445:2000//DTD HTML//EN\">\n" \
+"<html>\n" \
+"	<head>\n" \
+"		<title>SANE - Manufactors - Models - filter</title>\n" \
+"		<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">" \
+"		<meta name=\"Description\" content=\"SANE - Filtered formatted status of working backends.\">\n" \
+"		<style type=\"text/css\">\n" \
+"			HTML {\n" \
+"				font-family: sans-serif;\n" \
+"			}\n" \
+"			THEAD {\n" \
+"			}\n" \
+"			TBODY {\n" \
+"			}\n" \
+"			TD.backendnew {\n" \
+"				background-color: #00F;\n" \
+"			}\n" \
+"		</style>\n" \
+"		<link rel=\"stylesheet\" type=\"text/css\" href=\"sane.css\" media=\"all\">\n" \
+"		<!-- Table sort Javascript by http://www.javascripttoolbox.com/ -->\n" \
+"		<link rel=\"stylesheet\" type=\"text/css\" href=\"table.css\" media=\"all\">\n" \
+"		<script type=\"text/javascript\" src=\"table.js\">\n" \
+"		</script>\n" \
+"		<script language=\"javascript\" type=\"text/javascript\">\n" \
+"		<!--\n" \
+"			function sortBy(strSortCol, strSortDirection, strSubCatID){\n" \
+"				var searchTerm=\"params\";\n" \
+"				if(searchTerm!=\"part\"){\n" \
+"					var url=\"param_table.asp?family_id=607&category_id=163&subfamily_id=791\" + \"&OrderBy=\" + strSortCol + \"&Direction=\" + strSortDirection + \"#\" + strSubCatID;\n" \
+"					document.sort_form.action=url;\n" \
+"					document.sort_form.submit();  \n" \
+"				}\n" \
+"			}\n" \
+"		//-->\n" \
+"		</script>\n" \
+"	</head>\n" \
+"<body>\n"
+
+#define TABLE_ROWS_PER_PAGE "50"
+#define HTML_TABLE_HEADER \
+"<table summary=\"SANE backends status table\" id=\"t1\" class=\"table-autopage:" TABLE_ROWS_PER_PAGE " example table-autosort table-autofilter table-stripeclass:alternate table-page-number:t1page table-page-count:t1pages table-filtered-rowcount:t1filtercount table-rowcount:t1allcount\">\n" \
+"<caption>SANE backends status table</caption>\n" \
+"<thead>\n" \
+"	<tr>\n" \
+"		<th id=\"c01\" class=\"table-filterable table-sortable:default\">Status</th>\n" \
+"		<th id=\"c02\" class=\"table-filterable table-sortable:default\">Mfg</th>\n" \
+"		<th id=\"c03\" class=\"table-sortable:default\">Model</th>\n" \
+"		<th id=\"c04\" class=\"table-filterable table-sortable:default\">Backend</th>\n" \
+"		<th id=\"c05\" class=\"table-filterable table-sortable:default\">Version</th>\n" \
+"		<th id=\"c06\" class=\"table-filterable table-sortable:default\">Manpage</th>\n" \
+"		<th id=\"c07\" class=\"table-filterable table-sortable:default\">Type</th>\n" \
+"		<th id=\"c08\" class=\"table-filterable table-sortable:default\">Desc</th>\n" \
+"		<th id=\"c09\" class=\"table-filterable table-sortable:default\">Interface</th>\n" \
+"		<th id=\"c10\" class=\"table-filterable table-sortable:default\">Vendor-id</th>\n" \
+"		<th id=\"c11\" class=\"table-filterable table-sortable:default\">Product-id</th>\n" \
+"	</tr>\n" \
+"</thead>\n" \
+"<tbody>\n"
+
+#define HTML_TABLE_FOOTER \
+"</tbody>\n" \
+"<tfoot>\n" \
+"<tr>\n" \
+"	<td class=\"table-page:previous\" style=\"cursor:pointer;\">&lt; &lt; Previous</td>\n" \
+"	<td class=\"table-page:next\" style=\"cursor:pointer;\">Next &gt; &gt;</td>\n" \
+"	<td colspan=\"9\" style=\"text-align:center;\">Page <span id=\"t1page\"></span>&nbsp;of <span id=\"t1pages\"></span></td>\n" \
+"</tr>\n" \
+"<tr>\n" \
+"	<td colspan=\"11\"><span id=\"t1filtercount\"></span>&nbsp;of <span id=\"t1allcount\"></span>&nbsp;rows match filter(s)</td>\n" \
+"</tr>\n" \
+"</tfoot>\n" \
+"</table>\n" \
+""
+
+/* Print one big HTML table with all models */
+static void
+html_one_big_table (void)
+{
+	backend_entry *be = first_backend;
+	unsigned int rownum = 0;
+
+	while (be) {
+		type_entry *type = be->type;
+		while (type) {
+			if (type->mfg) {
+				mfg_entry *mfg = type->mfg;
+				while (mfg) {
+					model_entry *model = mfg->model;
+					while (model) {
+						printf ("<tr class=\"row%d\" title=\"%s %s %s %s\">\n", rownum++ % 2, 
+							be->comment ? strip_html_char(be->comment) : "",
+							mfg->comment ? strip_html_char(mfg->comment) : "",
+							model->comment ? strip_html_char(model->comment) : "", 
+							type->desc ? strip_html_char(type->desc->comment) : "");
+						printf_td_url_chain ("status", model_status_text(model->status), model->url);
+						printf_td_url_chain ("mfg", mfg->name, mfg->url);
+						printf_td ("model", model->name);
+						printf_td (be->new ? "backendnew" : "backend", be->name);
+						printf_td ("version", be->version);
+						printf_td_url_chain ("manpage", be->manpage, be->url);
+						printf_td_type ("type", type->type);
+						if (type->desc) {
+							printf_td_url_chain ("desc", type->desc->comment,  type->desc->url);
+						} else {
+							printf_td ("desc", NULL);
+						}
+						printf_td ("interface", model->interface);
+						printf_td ("vendor-id", model->usb_vendor_id);
+						printf_td ("product-id", model->usb_product_id);
+						printf ("</tr>\n");
+						model = model->next;
+					}
+					mfg = mfg->next;
+				} /* while (mfg) */
+			}
+			type = type->next;
+		} /* while (type) */
+		be = be->next;
+	} /* while (be) */
+}
+
+/* Print one big HTML table with all models */
+static void
+print_one_big_table (void)
+{
+	printf (HTML_HEADER);
+	printf (HTML_TABLE_HEADER);
+	html_one_big_table();
+	printf (HTML_TABLE_FOOTER);
+	printf ("</body></html>\n");
+	/* html_print_footer(); */
+}
 
 static char *
 clean_string (char *c)
@@ -3806,6 +4010,9 @@ main (int argc, char **argv)
     case output_mode_html_mfgs:
       html_print_mfgs ();
       break;
+    case output_mode_html_one_big:
+      print_one_big_table ();
+      break;
     case output_mode_statistics:
       print_statistics ();
       break;
