diff --git a/exec/filearea-lb.js b/exec/filearea-lb.js
index 2b1ead018e86a300e8d5e744ec905bd857f57a1a..fc1a780f22e3811f1e89aa05668ed88056842603 100644
--- a/exec/filearea-lb.js
+++ b/exec/filearea-lb.js
@@ -3,7 +3,6 @@ load("sbbsdefs.js");
 load("nodedefs.js");
 load("cga_defs.js"); // For color definitions
 load("file_size.js");
-load("filedir.js");
 load("frame.js");
 load("tree.js");
 load("scrollbar.js");
@@ -144,17 +143,20 @@ var Batch = function(parentFrame) {
 			if(typeof colors[c] != "undefined")
 				self.tree.colors[c] = colors[c];
 		}
-		for(var b in state.batch) {
-			var item = self.tree.addItem(
-				format(
-					"%-13s %7s %s",
-					state.batch[b].name,
-					file_size_str(file_size(state.batch[b].fullPath)),
-					state.batch[b].description
-				)
-			);
-			item.fileItem = state.batch[b];
-		}
+        var fileItems = batchGet();
+        if (fileItems) {
+            fileItems.forEach( function(fileItem) { 
+                var item = self.tree.addItem(
+                    format(
+                        "%-25s %7s %s",
+                        formatFileName(fileItem.name),
+                        file_size_str(fileItem.size),
+                        fileItem.desc ? fileItem.desc : ""
+                    )
+                );
+                item.fileItem = fileItem;
+            });
+        }
 	}
 	buildTree();
 
@@ -162,20 +164,11 @@ var Batch = function(parentFrame) {
 	this.tree.open();
 
 	var sendBatch = function() {
-		var fn = system.temp_dir + format("%04d.dwn", user.number);
-		var f = new File(fn);
-		f.open("w");
-		for(var b in state.batch) {
-			var ifn = ixbFilenameFormat(state.batch[b].name);
-			var ext = ifn.substr(8, 3);
-			f.writeln(truncsp(ext) == "" ? ifn : (ifn.substr(0, 8) + "." + ext));
-		}
-		f.close();
 		console.clear(BG_BLACK|LIGHTGRAY);
-		bbs.batch_add_list(fn);
-		bbs.batch_download();
+        var result =  bbs.batch_download();
 		console.clear(BG_BLACK|LIGHTGRAY);
 		frame.invalidate();
+        return result;
 	}
 
 	this.cycle = function() {
@@ -185,15 +178,17 @@ var Batch = function(parentFrame) {
 	this.getcmd = function(cmd) {
 		switch(cmd.toUpperCase()) {
 			case "D":
-				sendBatch();
+				if (sendBatch()) {
+                    batchClear();
+                    this.close();
+                }
 				break;
 			case "G":
 				this.close();
 				break;
 			case "R":
 				if(typeof this.tree.currentItem.fileItem != "undefined") {
-					var key = md5_calc(this.tree.currentItem.fileItem.fullPath, true);
-					delete state.batch[key];
+                    batchRemove(this.tree.currentItem.fileItem);
 					this.tree.close();
 					buildTree();
 					this.tree.open();
@@ -212,6 +207,7 @@ var Batch = function(parentFrame) {
 		this.frame.delete();
 		state.chooser = chooser;
 		state.browse = browse;
+        chooser.refresh();
 	}
 
 }
@@ -246,21 +242,22 @@ var Details = function(parentFrame, dirFile) {
 	subFrame.center(dirFile.name);
 	subFrame.attr = BG_BLACK|LIGHTGRAY;
 	subFrame.gotoxy(1, 3);
+
 	subFrame.putmsg(
-		"       Size: " + file_size_str(file_size(dirFile.fullPath)) + "\r\n" +
-		"Uploaded by: " + dirFile.uploader + "\r\n" +
-		"Uploaded on: " + strftime("%d/%m/%Y %H:%M") + "\r\n" +
-		"  Downloads: " + dirFile.timesDownloaded + "\r\n" +
-		"    Credits: " + dirFile.credit + "\r\n" +
-		"Description: " + dirFile.description + "\r\n" +
+		"       Size: " + file_size_str(dirFile.size) + "\r\n" +
+		"Uploaded by: " + (dirFile.from ? dirFile.from : "")  + "\r\n" +
+		"Uploaded on: " + system.datestr(dirFile.added) + "\r\n" +
+		"  Downloads: " + (dirFile.times_downloaded ? dirFile.times_downloaded : "") + "\r\n" +
+		"    Credits: " + dirFile.cost + "\r\n" +
+		"Description: " + (dirFile.desc ? dirFile.desc : "") + "\r\n" +
 		"   Extended: "
 	);
-	if(dirFile.extendedDescription == "") {
+	if(dirFile.extdesc == "") {
 		subFrame.gotoxy(14, 9)
 		subFrame.putmsg("Not available.");
 	} else {
 		subFrame.gotoxy(1, 11);
-		subFrame.putmsg(dirFile.extendedDescription);
+		subFrame.putmsg(dirFile.extdesc);
 	}
 
 	frame.open();
@@ -373,6 +370,12 @@ var Chooser = function(parentFrame, list, treeBuilder) {
 		scrollBar.cycle();
 	}
 
+    this.refresh = function() {
+        self.tree.items = [];
+		list.forEach(function(item) { treeBuilder(self.tree, item); });
+		self.tree.open();
+    }
+
 	this.close = function() {
 		this.tree.close();
 		this.frame.close();
@@ -381,28 +384,103 @@ var Chooser = function(parentFrame, list, treeBuilder) {
 
 }
 
+var batchSelected = function(fileItem) {
+    var fn = system.data_dir + format("user/%04d.dnload", user.number);
+    var f = new File(fn);
+    if (f.open("r")) {
+        var filenames = f.iniGetSections();
+        for (var i = 0; i < filenames.length; ++i) {
+            if (filenames[i] === fileItem.name) {
+                var dirCode = f.iniGetValue(fileItem.name, "dir");
+                if (dirCode === fileItem.dirCode)
+                    return true;
+            }
+        }
+    }
+
+    return false;
+}
+
+var batchGet = function() {
+    var fileItems = [];
+    var fn = system.data_dir + format("user/%04d.dnload", user.number);
+    var f = new File(fn);
+    if (!f.open("r"))
+        return;
+
+    var filenames = f.iniGetSections();
+    filenames.forEach( function(filename) {
+        var dirCode = f.iniGetValue(filename, "dir");
+        var fb = new FileBase(dirCode);
+        fb.open();
+        var item = fb.get(filename);
+        item.fullPath = fb.get_path(filename);
+        item.dirCode = dirCode;
+        fileItems.push(item);
+    });
+
+    return fileItems;
+}
+
+var batchAdd = function(fileItem) {
+    var fn = system.data_dir + format("user/%04d.dnload", user.number);
+    var f = new File(fn);
+    f.open(f.exists ? "r+" : "w+");
+    f.iniSetValue(fileItem.name, "dir", fileItem.dirCode);
+    f.close();
+}
+
+var batchRemove = function(fileItem) {
+    var fn = system.data_dir + format("user/%04d.dnload", user.number);
+    var f = new File(fn);
+    f.open(f.exists ? "r+" : "w+");
+    f.iniRemoveSection(fileItem.name);
+    f.close();
+}
+
+var batchClear = function() {
+    file_remove(system.data_dir + format("user/%04d.dnload", user.number));
+}
+
 var batchToggle = function() {
-	var key = md5_calc(state.chooser.tree.currentItem.fileItem.fullPath, true);
-	if(typeof state.batch[key] == "undefined") {
+    if (!batchSelected(state.chooser.tree.currentItem.fileItem)) {
 		state.chooser.tree.currentItem.text = state.chooser.tree.currentItem.text.replace(/^./, "*");
-		state.batch[key] = state.chooser.tree.currentItem.fileItem;
-	} else {
+        batchAdd(state.chooser.tree.currentItem.fileItem);
+    } else {
 		state.chooser.tree.currentItem.text = state.chooser.tree.currentItem.text.replace(/^\*/, " ");
-		delete state.batch[key];
-	}
+        batchRemove(state.chooser.tree.currentItem.fileItem);
+    }
 	state.chooser.tree.refresh();
 }
 
+var formatFileName = function(name, length) {
+    if (length === undefined || length < 5)
+        length = 24;
+    var split = name.split(".");
+    try {
+        var filename = split[0];
+        var extension = split[1];
+        if (extension.length > 3)
+            extension = extension.substring(0, 3);
+        if (filename.length > length - 4)
+            filename = filename.substring(0, length - 4);
+        var result = filename + '.' + extension;
+    } catch(err) {
+        return name;
+    }
+    return result;
+}
+
 var fileChooser = function(code) {
 
 	var treeBuilder = function(tree, item) {
-
 		var str = format(
-			" %-13s%-7s%8s %s",
-			item.name,
-			file_size_str(file_size(item.fullPath)),
-			system.datestr(item.uploadDate),
-			item.description
+			"%c%-25s%-8s%8s %s",
+            batchSelected(item) ? '*' : ' ',
+			formatFileName(item.name),
+            file_size_str(item.size),
+            system.datestr(item.added),
+            item.desc ? item.desc : ""
 		);
 
 		var treeItem = tree.addItem(
@@ -417,11 +495,17 @@ var fileChooser = function(code) {
 		tree.__commands__.SELECT = "I";
 	}
 
-	var fd = new FileDir(file_area.dir[code]);
+	var fd = new FileBase(code);
+    fd.open();
+    var files = fd.get_list("", FileBase.DETAIL.EXTENDED);
+    files.forEach(function(item) {
+        item.fullPath = fd.get_path(item.name);
+        item.dirCode = code;
+    });
 
 	state.chooser = new Chooser(
 		frame,
-		fd.files,
+		files,
 		treeBuilder
 	);
 	state.chooser.open();
@@ -434,7 +518,7 @@ var fileChooser = function(code) {
 	);
 	state.chooser.headerFrame.putmsg(
 		format(
-			" %-13s%-7s%8s %s",
+			" %-25s%-8s%8s %s",
 			"Filename", "Size", "Uploaded", "Description"
 		)
 	);
@@ -531,7 +615,7 @@ var inputHandler = function(userInput) {
 			if(state.browse != BROWSE_BATCH) {
 				ret = true;
 				state.chooser = new Batch(state.chooser.frame);
-			}
+            }
 			break;
 		case "D": // Download
 			if(state.browse == BROWSE_FILES && canDownload()) {
@@ -562,6 +646,7 @@ var inputHandler = function(userInput) {
 			}
 			break;
 		case "T": // Tag a file
+        case " ":
 			if(state.browse == BROWSE_FILES) {
 				ret = true;
 				if(canDownload())
@@ -660,6 +745,7 @@ var init = function() {
 	// chooser.
 	if ((gStartupDirCode != "") && dirCodeIsValid(gStartupDirCode))
 	{
+
 		fileChooser(gStartupDirCode);
 		state.dir = gStartupDirCode;
 		state.lib = file_area.dir[gStartupDirCode].lib_index;
@@ -705,6 +791,8 @@ function dirCodeIsValid(pDirCode) {
 	if (typeof(pDirCode) != "string")
 		return false;
 
+    console.print(gStartupDirCode);
+    console.pause();
 	var dirCodeUpper = pDirCode.toUpperCase();
 	var codeIsValid = false;
 	for (var dirCode in file_area.dir)