diff --git a/exec/fileman.js b/exec/fileman.js
index 325419c4053e4e858d26738534e30a37b92546c8..106624c228d7e6907fba1a400937e1f5c1b2c0a6 100755
--- a/exec/fileman.js
+++ b/exec/fileman.js
@@ -466,6 +466,72 @@ function view_archive(file, dircode)
 	base.close();
 }
 
+function viewable_text_file(filename)
+{
+	switch(filename.toLowerCase()) {
+		case 'read.me':
+		case 'readme':
+		case 'readme.now':
+		case 'compiling':
+			return true;
+	}
+	var ext = file_getext(filename);
+	if(!ext)
+		return false;
+	switch(ext.toLowerCase()) {
+		case '.asc':
+		case '.txt':
+		case '.diz':
+		case '.nfo':
+		case '.doc':
+		case '.c':
+		case '.cc':
+		case '.cpp':
+		case '.h':
+		case '.hh':
+		case '.hpp':
+		case '.js':
+		case '.json':
+		case '.htm':
+		case '.html':
+		case '.css':
+		case '.ini':
+		case '.bbs':
+			return true;
+	}
+	return false;
+}
+
+function view_text_file(file, dircode)
+{
+	if(!dircode)
+		dircode = file.dircode;
+	var base = new FileBase(dircode);
+	if(!base.open()) {
+		uifc.msg("Unable to open base: " + dircode);
+		return;
+	}
+	var path = base.get_path(file);
+	if(path) {
+		var f = new File(path);
+		if(f.open("r")) {
+			var txt = f.readAll();
+			if(txt)
+				uifc.showbuf(WIN_MID|WIN_SAV, file.name, txt.join('\n'));
+			f.close();
+		}
+	}
+	base.close();
+}
+
+function view_contents(file, dircode)
+{
+	if(viewable_text_file(file.name))
+		view_text_file(file, dircode);
+	else
+		view_archive(file, dircode);
+}
+
 function confirm(prompt)
 {
 	var choice = uifc.list(WIN_MID|WIN_SAV, prompt, [ "Yes", "No" ]);
@@ -518,7 +584,7 @@ function edit(file, dircode)
 			"Move File...",
 			"Remove File...",
 			"View Details...",
-			"View Archive...",
+			"View Contents...",
 			"Filename: " + file.name,
 			"Description: " + (file.desc || ""),
 			"Uploader: " + (file.from || ""),
@@ -527,7 +593,7 @@ function edit(file, dircode)
 			"|---------- Extended Description -----------|"
 			];
 		if(file.extdesc) {
-			var extdesc = strip_ctrl_a(file.extdesc).split('\r\n');
+			var extdesc = strip_ctrl_a(file.extdesc).split('\n');
 			opts = opts.concat(extdesc);
 		}
 		const title = (dircode || file.dircode) + "/" +  orig.name;
@@ -569,7 +635,7 @@ function edit(file, dircode)
 				view_details(file, dircode);
 				break;
 			case 3:
-				view_archive(file, dircode);
+				view_contents(file, dircode);
 				break;
 			case 4:
 				edit_filename(file);
@@ -591,7 +657,9 @@ function edit(file, dircode)
 			case 9:
 				break;
 			default: // Extended description
-				var extdesc = file.extdesc ? file.extdesc.split('\r\n') : [];
+				if(file.extdesc)
+					file.extdesc = file.extdesc.replace(/\r/g, '');
+				var extdesc = file.extdesc ? file.extdesc.split('\n') : [];
 				var index = choice - 10;
 				if(mask & MSK_DEL) {
 					extdesc.splice(index, /* deleteCount: */1);