diff --git a/webv4/lib/files.js b/webv4/lib/files.js
index a4fc22ba812564cace06a8fa54f5533e58b19c1a..e429149c31b632b79181e9033f85397ff47d093b 100644
--- a/webv4/lib/files.js
+++ b/webv4/lib/files.js
@@ -2,26 +2,30 @@ require('filebase.js', 'FileBase');
 require('file_size.js', 'file_size_str');
 
 function count_files(dir) {
-    var n = 0;
     const fn = format("%s%s.ixb", file_area.dir[dir].data_dir, dir);
-    if (!file_exists(fn)) return n;
+    if (!file_exists(fn)) return 0;
     return Math.floor(file_size(fn) / 22); // ixb record length is 22 bytes
 }
 
+function libHasFiles(lib) {
+    return lib.dir_list.some(function (e) {
+        return count_files(e.code) > 0;
+    });
+}
+
 function listLibraries() {
-	return file_area.lib_list.filter(function (library) {
-        return library.dir_list.length >= 1;
+	return file_area.lib_list.filter(function (lib) {
+        return lib.dir_list.length >= 1 && libHasFiles(lib);
     });
 }
 
-function listDirectories(library) {
-	var dirs = [];
-	file_area.lib_list[library].dir_list.forEach(function (dir) {
-        const fc = count_files(dir.code);
-        if (fc < 1) return;
-		dirs.push({ dir: dir, fileCount: fc });
-	});
-	return dirs;
+function listDirectories(lib) {
+    return file_area.lib_list[lib].dir_list.reduce(function (a, c) {
+        const fc = count_files(c.code);
+        if (fc < 1) return a;
+        a.push({ dir: c, fileCount: fc });
+        return a;
+    }, []);
 }
 
 function listFiles(dir) {
diff --git a/webv4/pages/002-files.xjs b/webv4/pages/002-files.xjs
index b0e510aaa014f991db9bd8d9120349d84ee10850..d17c7b46fd2a1529417f33730af00286491e3fb2 100644
--- a/webv4/pages/002-files.xjs
+++ b/webv4/pages/002-files.xjs
@@ -24,19 +24,28 @@
 		</li>
 	</ol>
 
-	<?xjs function writeFileDetails(file) { ?>
-		<a href="./api/files.ssjs?call=download-file&amp;dir=<? Request.write_param('dir'); ?>&amp;file=<? write(file.name); ?>" target="_blank" class="list-group-item striped" data-file-list-element data-size="<? write(file._size); ?>" data-uploaded="<? write(file.uldate); ?>" data-name="<? write(file.name); ?>">
-			<strong><? write(file.name); ?></strong> (<? write(file.size); ?>)
-			<p><em>Uploaded <? write(system.timestr(file.uldate)); ?></em></p>
-			<?xjs if (typeof file.extdesc === 'undefined') { ?>
-				<p><? write(file.desc); ?></p>
-			<?xjs } else if (file.extdesc.search(/(\x1B\[|[\xA8-\xFE])/) > -1) { ?>
-				<pre class="ansi"><? write(html_encode(file.extdesc, true, false, true, true)); ?></pre>
-			<?xjs } else { ?>
-				<pre class="list"><? write(file.extdesc.replace(/[^\r,\n\x20-\x7E]/g, '')); ?></pre>
-			<?xjs } ?>
-		</a>
-	<?xjs } ?>
+	<? function writeFileDetails(file) { ?>
+		<? const cd = file_area.dir[Request.get_param('dir')].can_download && user.compare_ars(file_area.dir[Request.get_param('dir')].download_ars); ?>
+		<? if (cd) { ?>
+			<a href="./api/files.ssjs?call=download-file&amp;dir=<? Request.write_param('dir'); ?>&amp;file=<? write(file.name); ?>" target="_blank" class="list-group-item striped" data-file-list-element data-size="<? write(file._size); ?>" data-uploaded="<? write(file.uldate); ?>" data-name="<? write(file.name); ?>">
+		<? } else { ?>
+			<li class="list-group-item striped" data-file-list-element data-size="<? write(file._size); ?>" data-uploaded="<? write(file.uldate); ?>" data-name="<? write(file.name); ?>">
+		<? } ?>
+		<strong><? write(file.name); ?></strong> (<? write(file.size); ?>)
+		<p><em>Uploaded <? write(system.timestr(file.uldate)); ?></em></p>
+		<?xjs if (typeof file.extdesc === 'undefined') { ?>
+			<p><? write(file.desc); ?></p>
+		<?xjs } else if (file.extdesc.search(/(\x1B\[|[\xA8-\xFE])/) > -1) { ?>
+			<pre class="ansi"><? write(html_encode(file.extdesc, true, false, true, true)); ?></pre>
+		<?xjs } else { ?>
+			<pre class="list"><? write(file.extdesc.replace(/[^\r,\n\x20-\x7E]/g, '')); ?></pre>
+		<?xjs } ?>
+		<? if (cd) { ?>
+			</a>
+		<? } else { ?>
+			</li>
+		<? } ?>
+	<? } ?>
 
 	<div class="clearfix" style="margin-bottom:1em;">
 		<div class="dropdown pull-right">
diff --git a/webv4/root/api/files.ssjs b/webv4/root/api/files.ssjs
index 00f08a3b732714f00fae881e94bea39bac5edbca..6737c49b616f7edc6b75f472776fa3d1345269f9 100644
--- a/webv4/root/api/files.ssjs
+++ b/webv4/root/api/files.ssjs
@@ -20,6 +20,7 @@ if ((http_request.method === 'GET' || http_request.method === 'POST') &&
                 file_area.dir[http_request.query.dir[0]].index >= 0 &&
 				file_area.dir[http_request.query.dir[0]].can_download &&
 				typeof http_request.query.file !== 'undefined'
+				&& user.compare_ars(file_area.dir[http_request.query.dir[0]].download_ars)
 			) {
 				var dircode = file_area.dir[http_request.query.dir[0]].code;
 				var fileBase = new FileBase(dircode);