diff --git a/web/root/blogs/blog_config.js b/web/root/blogs/blog_config.js
index 87690a574ca637d97495b6374c8932802453b069..93c870ec818aa18a2d219ecf555ca5fda8cea955 100644
--- a/web/root/blogs/blog_config.js
+++ b/web/root/blogs/blog_config.js
@@ -1,29 +1,27 @@
 // User editable settings...
 
-// Internal code of the message base
-var msg_code="GENERAL";
-
 // Number of posts to show per page.
 var max_posts=16;
 
 // Minimum number of characters in an exerpt
 var min_chars=400;
 
+// Number of pixels per level to indent comments
+var indent_pixels=20;
+
 //
 // Don't change stuff down here.
 //
 
 // User name of the blogger
 var parameters=http_request.path_info.substr(1).split("/");
-var poster=parameters[0];
-var year=parseInt(parameters[1],10);
-var month=parseInt(parameters[2],10);
-var day=parseInt(parameters[3],10);
-var msgid=parseInt(parameters[4],10);
-var subject=parameters[5];
-if(poster.indexOf("/")>=0) {
-	poster=poster.substr(0,poster.indexOf("/"));
-}
+var msg_code=parameters[0];
+var poster=parameters[1];
+var year=parseInt(parameters[2],10);
+var month=parseInt(parameters[3],10);
+var day=parseInt(parameters[4],10);
+var msgid=parseInt(parameters[5],10);
+var subject=parameters[6];
 
 //var pnum=system.matchuser(poster);
 //if(pnum==0) {
@@ -41,7 +39,7 @@ if(!isNaN(msgid)) {
 	if(subject==undefined || subject=="") {
 		var hdr=msgbase.get_msg_header(parseInt(msgid));
 		http_reply.status="301 Moved Permanently";
-		http_reply.header["Location"]="http://"+http_request.host+http_request.virtual_path+poster+"/"+format("%04d",year)+"/"+format("%02d",month)+"/"+format("%02d",day)+"/"+msgid+"/"+clean_subject(hdr.subject);
+		http_reply.header["Location"]="http://"+http_request.host+http_request.virtual_path+msg_code+"/"+hdr.from+"/"+format("%04d",year)+"/"+format("%02d",month)+"/"+format("%02d",day)+"/"+msgid+"/"+clean_subject(hdr.subject);
 		exit(0);
 	}
 }
diff --git a/web/root/blogs/blog_item.xjs b/web/root/blogs/blog_item.xjs
index d15cca6c2c1ad08dc08a66bc245a7d3b8222f256..5ac6cb91f6a044a66193596c6715901c3ccdb97f 100644
--- a/web/root/blogs/blog_item.xjs
+++ b/web/root/blogs/blog_item.xjs
@@ -1,10 +1,28 @@
 <?xjs
-load("/synchronet/src/web/root/blogs/blog_config.js");
+load(cwd+"/blog_config.js");
 ?>
 
 <html>
 <head>
 <title>The Blogifier!</title>
+<script>
+<!--
+function toggle_display(itemID, buttonID)
+{
+	var item = document.getElementById(itemID);
+	var button = document.getElementById(buttonID);
+
+	if (item.style.display != "none") {
+		item.style.display = "none";
+		button.src="<?xjs write(http_request.virtual_path)?>plus.gif";
+	}
+	else {
+		item.style.display = "block";
+		button.src="<?xjs write(http_request.virtual_path)?>minus.gif";
+	}
+}
+//-->
+</script>
 </head>
 <body>
 
@@ -96,12 +114,13 @@ while(1) {
 	body=body.split("&#13;&#10;").join("<br>");
 ?>
 
-<div style="padding-left: <?xjs write(thread_depth*10) ?>px">
-<b><?xjs write(hdr.subject); ?></b> (<?xjs write(date); ?>)<br>
-By: <?xjs write(hdr.from); ?><br>
-<p><?xjs write(body); ?></p>
+<div style="padding-left: <?xjs write(thread_depth*indent_pixels) ?>px">
+<a onClick="toggle_display('msg-<?xjs write(msgid)?>','button-<?xjs write(msgid) ?>');"><img src="<?xjs write(http_request.virtual_path) ?>plus.gif" id="button-<?xjs write(msgid); ?>"></a> <b><?xjs write(hdr.subject); ?></b> (<?xjs write(date); ?>)<br>
+By: <i><?xjs write(hdr.from); ?></i><br>
+<div id="msg-<?xjs write(msgid) ?>" style="display: none"><?xjs write(body); ?>
 <hr>
 </div>
+</div>
 
 <?xjs
 }
diff --git a/web/root/blogs/index.xjs b/web/root/blogs/index.xjs
index a8dd93f3e82db2878deae07311153c458b348209..5c02f59b67417a0073d3c70b59420d49427328c5 100644
--- a/web/root/blogs/index.xjs
+++ b/web/root/blogs/index.xjs
@@ -1,5 +1,6 @@
 <?xjs
-load("/synchronet/src/web/root/blogs/blog_config.js");
+load("sbbsdefs.js");
+load(cwd+"/blog_config.js");
 if(!isNaN(msgid)) {
 	xjs_load("blog_item.xjs");
 	exit(0);
@@ -13,14 +14,20 @@ if(!isNaN(msgid)) {
 <body>
 
 <p>
-  Welcome to the <?xjs write(msgbase.cfg.name); ?> Blogifier for <?xjs write(poster); ?>
+  Welcome to the <?xjs write(msgbase.cfg.name); ?> Blogifier <?xjs if(poster != '') write("for "+poster); ?>
 </p>
 
 <?xjs
 for(i=msgbase.last_msg; i>=msgbase.first_msg; i--) {
 	var hdr=msgbase.get_msg_header(i);
-	if(hdr.from.toUpperCase() != poster.toUpperCase())
+	if(hdr==null)
 		continue;
+	if(hdr.attr & (MSG_PRIVATE|MSG_DELETE))
+		continue;
+	if(poster!=undefined && poster!='') {
+		if(hdr.from.toUpperCase() != poster.toUpperCase())
+			continue;
+	}
 //	if(hdr.from_ext != pnum)
 //		continue;
 	if(hdr.thread_back)
@@ -55,11 +62,11 @@ for(i=msgbase.last_msg; i>=msgbase.first_msg; i--) {
 	exerpt=exerpt.split("&#13;&#10;").join("<br>");
 ?>
 
-<b><?xjs write(hdr.subject); ?></b> (<?xjs write(date); ?>)<br>
+<b><?xjs write(hdr.subject); ?></b> (<?xjs write(date); ?>) - <i><?xjs write(hdr.from) ?></i><br>
 <p><?xjs write(exerpt); if(read_more) write("<b>...</b>"); ?></p>
 
 <p><a href="<?xjs 
-write("http://"+http_request.host+http_request.virtual_path+poster+"/"+format("%04d",this_year)+"/"+format("%02d",this_month)+"/"+format("%02d",this_day)+"/"+i+"/"+clean_subject(hdr.subject));
+write("http://"+http_request.host+http_request.virtual_path+msg_code+"/"+hdr.from+"/"+format("%04d",this_year)+"/"+format("%02d",this_month)+"/"+format("%02d",this_day)+"/"+i+"/"+clean_subject(hdr.subject));
 ?>">Comments...</a></p>
 
 <?xjs
diff --git a/web/root/blogs/minus.gif b/web/root/blogs/minus.gif
new file mode 100644
index 0000000000000000000000000000000000000000..7b9d3341576ffbec1271f054797d05f07151d8e0
Binary files /dev/null and b/web/root/blogs/minus.gif differ
diff --git a/web/root/blogs/plus.gif b/web/root/blogs/plus.gif
new file mode 100644
index 0000000000000000000000000000000000000000..c5af2ba220c31c7fb42eaad06d22c50d54b154e4
Binary files /dev/null and b/web/root/blogs/plus.gif differ