diff --git a/src/sbbs3/atcodes.cpp b/src/sbbs3/atcodes.cpp
index 21eac815a2c462354d1df589054e84c40ecbbb96..8151c7dcc5fcfe6041a212fc79f154e4c257db49 100644
--- a/src/sbbs3/atcodes.cpp
+++ b/src/sbbs3/atcodes.cpp
@@ -448,7 +448,12 @@ char* sbbs_t::atcode(char* sp, char* str)
 	}
 
 	if(!strcmp(sp,"FREESPACE")) {
-		sprintf(str,"%lu",getfreediskspace(cfg.temp_dir)); 
+		sprintf(str,"%lu",getfreediskspace(cfg.temp_dir,0)); 
+		return(str);
+	}
+
+	if(!strcmp(sp,"FREESPACEK")) {
+		sprintf(str,"%lu",getfreediskspace(cfg.temp_dir,1024)); 
 		return(str);
 	}
 
diff --git a/src/sbbs3/ftpsrvr.c b/src/sbbs3/ftpsrvr.c
index cc85b2d10ab7fbf35e07a34a4bf30c297f726986..70d50a38b37c832a46cc6585ef62f69a0fbfd46b 100644
--- a/src/sbbs3/ftpsrvr.c
+++ b/src/sbbs3/ftpsrvr.c
@@ -2822,9 +2822,9 @@ static void ctrl_thread(void* arg)
 			else
 				l=0;
 			if(local_fsys)
-				avail=getfreediskspace(local_dir);
+				avail=getfreediskspace(local_dir,0);
 			else
-				avail=getfreediskspace(scfg.data_dir);	/* Change to temp_dir? */
+				avail=getfreediskspace(scfg.data_dir,0);	/* Change to temp_dir? */
 			if(l && l>avail)
 				sockprintf(sock,"504 Only %lu bytes available.",avail);
 			else
diff --git a/src/sbbs3/js_system.c b/src/sbbs3/js_system.c
index 737b9f07c603764794d90c80fc9a6ca4bb0b5ec1..4b728a46e44697ab4ed9af46b243f7f5d48a725d 100644
--- a/src/sbbs3/js_system.c
+++ b/src/sbbs3/js_system.c
@@ -156,7 +156,7 @@ static JSBool js_system_get(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
 			p=lastuseron;
 			break;
 		case SYS_PROP_FREEDISKSPACE:
-			val = getfreediskspace(cfg->temp_dir);
+			val = getfreediskspace(cfg->temp_dir,0);
 			if(INT_FITS_IN_JSVAL(val) && !(val&0x80000000))
 				*vp = INT_TO_JSVAL(val);
 			else
diff --git a/src/sbbs3/tmp_xfer.cpp b/src/sbbs3/tmp_xfer.cpp
index 4f20bc91044a62e7d938180aa87e2ba425920491..b7aa680bca796d6ba63858e5f4f68fd75295b638 100644
--- a/src/sbbs3/tmp_xfer.cpp
+++ b/src/sbbs3/tmp_xfer.cpp
@@ -105,7 +105,7 @@ void sbbs_t::temp_xfer()
 		switch(ch) {
 			case 'A':   /* add to temp file */
 				/* free disk space */
-				space=getfreediskspace(cfg.temp_dir);
+				space=getfreediskspace(cfg.temp_dir,0);
 				if(space<(ulong)cfg.min_dspace*1024L) {
 					bputs(text[LowDiskSpace]);
 					sprintf(str,"Diskspace is low: %s (%lu bytes)"
@@ -289,7 +289,7 @@ void sbbs_t::extract(uint dirnum)
 		intmp=1;
 
 	/* get free disk space */
-	space=getfreediskspace(cfg.temp_dir);
+	space=getfreediskspace(cfg.temp_dir,0);
 	if(space<(ulong)cfg.min_dspace*1024L) {
 		bputs(text[LowDiskSpace]);
 		sprintf(str,"Diskspace is low: %s (%lu bytes)",cfg.temp_dir,space);
diff --git a/src/sbbs3/upload.cpp b/src/sbbs3/upload.cpp
index 8b573098f93c5c48df6e75eff01eaf27d05487a8..05ecd7179169117f4fd21db757d7a3834f3d59bb 100644
--- a/src/sbbs3/upload.cpp
+++ b/src/sbbs3/upload.cpp
@@ -260,10 +260,10 @@ bool sbbs_t::upload(uint dirnum)
 
 
 	/* get free disk space */
-	space=getfreediskspace(path);
-	if(space<(ulong)cfg.min_dspace*1024L) {
+	space=getfreediskspace(path,1024);
+	if(space<(ulong)cfg.min_dspace) {
 		bputs(text[LowDiskSpace]);
-		sprintf(str,"Diskspace is low: %s (%lu bytes)",path,space);
+		sprintf(str,"Diskspace is low: %s (%lu kilobytes)",path,space);
 		errorlog(str);
 		if(!dir_op(dirnum))
 			return(false); 
diff --git a/src/xpdev/dirwrap.c b/src/xpdev/dirwrap.c
index 3cfcb40d9756261299b3a0f2b025822ae469f5da..2b478d2ad5a4c77c5c177414c975e0f0b52a32b0 100644
--- a/src/xpdev/dirwrap.c
+++ b/src/xpdev/dirwrap.c
@@ -577,11 +577,23 @@ ulong DLLCALL delfiles(char *inpath, char *spec)
 /* Return free disk space in bytes (up to a maximum of 4GB)					*/
 /****************************************************************************/
 #if defined(_WIN32)
-	typedef BOOL(WINAPI * GetDiskFreeSpaceEx_t)
-		(LPCTSTR,PULARGE_INTEGER,PULARGE_INTEGER,PULARGE_INTEGER); 
+typedef BOOL(WINAPI * GetDiskFreeSpaceEx_t)
+	(LPCTSTR,PULARGE_INTEGER,PULARGE_INTEGER,PULARGE_INTEGER); 
+
+static int bit_num(ulong val)
+{
+	int i;
+
+	for(i=31;i>=0;i--)
+		if(val&(1<<i))
+			return(i);
+
+	return(-1);
+}
 #endif
 
-ulong DLLCALL getfreediskspace(const char* path)
+/* Unit should be a power-of-2 (e.g. 1024 to report kilobytes) */
+ulong DLLCALL getfreediskspace(const char* path, ulong unit)
 {
 #if defined(_WIN32)
 	char			root[16];
@@ -606,6 +618,10 @@ ulong DLLCALL getfreediskspace(const char* path)
 			&size,		// receives the number of bytes on disk
 			NULL))		// receives the free bytes on disk
 			return(0);
+
+		if(unit)
+			avail.QuadPart=Int64ShrlMod32(avail.QuadPart,bit_num(unit));
+
 #if defined(_ANONYMOUS_STRUCT)
 		if(avail.HighPart)
 #else
@@ -631,6 +647,8 @@ ulong DLLCALL getfreediskspace(const char* path)
 		))
 		return(0);
 
+	if(unit)
+		NumberOfFreeClusters/=unit;
 	return(NumberOfFreeClusters*SectorsPerCluster*BytesPerSector);
 
 
@@ -642,6 +660,8 @@ ulong DLLCALL getfreediskspace(const char* path)
     if (statfs(path, &fs) < 0)
     	return 0;
 
+	if(unit)
+		fs.f_bavail/=unit;
     return fs.f_bsize * fs.f_bavail;
     
 #else
diff --git a/src/xpdev/dirwrap.h b/src/xpdev/dirwrap.h
index 9509271dda507dd2577ec22c774875483447bcbd..c3c4e9f578a0ca24b7076e6b7e8f557f7e4779f0 100644
--- a/src/xpdev/dirwrap.h
+++ b/src/xpdev/dirwrap.h
@@ -197,7 +197,7 @@ DLLEXPORT time_t	DLLCALL fdate(const char *filename);
 DLLEXPORT BOOL		DLLCALL	isdir(const char *filename);
 DLLEXPORT char*		DLLCALL getfname(const char* path);
 DLLEXPORT int		DLLCALL getfattr(const char* filename);
-DLLEXPORT ulong		DLLCALL getfreediskspace(const char* path);
+DLLEXPORT ulong		DLLCALL getfreediskspace(const char* path, ulong unit);
 DLLEXPORT ulong		DLLCALL delfiles(char *inpath, char *spec);
 
 #if defined(__unix__)