diff --git a/exec/filearea-lb.js b/exec/filearea-lb.js
index af8bf4d179f4d3c5edc8b51fd891d253b139d593..fc1a780f22e3811f1e89aa05668ed88056842603 100644
--- a/exec/filearea-lb.js
+++ b/exec/filearea-lb.js
@@ -143,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(
-					"%-25s %7s %s",
-					formatFileName(state.batch[b].name),
-					file_size_str(state.batch[b].size),
-					state.batch[b].desc ? state.batch[b].desc : ""
-				)
-			);
-			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();
 
@@ -161,18 +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) {
-			f.writeln(state.batch[b].name);
-		}
-		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() {
@@ -182,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();
@@ -209,6 +207,7 @@ var Batch = function(parentFrame) {
 		this.frame.delete();
 		state.chooser = chooser;
 		state.browse = browse;
+        chooser.refresh();
 	}
 
 }
@@ -371,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();
@@ -379,15 +384,72 @@ 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();
 }
 
@@ -412,9 +474,9 @@ var formatFileName = function(name, length) {
 var fileChooser = function(code) {
 
 	var treeBuilder = function(tree, item) {
-
 		var str = format(
-			" %-25s%-8s%8s %s",
+			"%c%-25s%-8s%8s %s",
+            batchSelected(item) ? '*' : ' ',
 			formatFileName(item.name),
             file_size_str(item.size),
             system.datestr(item.added),
@@ -438,6 +500,7 @@ var fileChooser = function(code) {
     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(
@@ -552,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()) {