diff --git a/src/tap/data/LimitedTableIterator.java b/src/tap/data/LimitedTableIterator.java
index 4adeb237d2a6318a591171dfbcce3ca64d1ca228..a5b9c64ea15c9cccdda97605f3f13f7bb534b562 100644
--- a/src/tap/data/LimitedTableIterator.java
+++ b/src/tap/data/LimitedTableIterator.java
@@ -55,7 +55,7 @@ import com.oreilly.servlet.multipart.ExceededSizeException;
  * </p>
  * 
  * @author Gr&eacute;gory Mantelet (ARI)
- * @version 2.0 (12/2014)
+ * @version 2.0 (01/2015)
  * @since 2.0
  */
 public class LimitedTableIterator implements TableIterator {
@@ -119,9 +119,9 @@ public class LimitedTableIterator implements TableIterator {
 	public < T extends TableIterator > LimitedTableIterator(final Class<T> classIt, final InputStream input, final LimitUnit type, final int limit) throws DataReadException{
 		try{
 			Constructor<T> construct = classIt.getConstructor(InputStream.class);
-			if (type == LimitUnit.bytes && limit > 0){
+			if (LimitUnit.bytes.isCompatibleWith(type) && limit > 0){
 				maxNbRows = -1;
-				innerIt = construct.newInstance(new LimitedSizeInputStream(input, limit));
+				innerIt = construct.newInstance(new LimitedSizeInputStream(input, limit * type.bytesFactor()));
 			}else{
 				innerIt = construct.newInstance(input);
 				maxNbRows = (type == null || type != LimitUnit.rows) ? -1 : limit;
diff --git a/src/tap/resource/TAP.java b/src/tap/resource/TAP.java
index 6bfc38e625ad900ddcbc0ca06c657d19cf8d6db6..2341dd98bea7bd29dc3c5faacc871421189b33cf 100644
--- a/src/tap/resource/TAP.java
+++ b/src/tap/resource/TAP.java
@@ -521,10 +521,17 @@ public class TAP implements VOSIResource {
 		if (outputLimit != null && outputLimit.length >= 2 && outputLimitType != null && outputLimitType.length >= 2){
 			if (outputLimit[0] > -1 || outputLimit[1] > -1){
 				xml.append("\t<outputLimit>\n");
-				if (outputLimit[0] > -1)
-					xml.append("\t\t<default ").append(VOSerializer.formatAttribute("unit", outputLimitType[0].toString())).append(">").append(outputLimit[0]).append("</default>\n");
-				if (outputLimit[1] > -1)
-					xml.append("\t\t<hard ").append(VOSerializer.formatAttribute("unit", outputLimitType[1].toString())).append(">").append(outputLimit[1]).append("</hard>\n");
+				String limitType;
+				if (outputLimit[0] > -1){
+					long limit = outputLimit[0] * outputLimitType[0].bytesFactor();
+					limitType = (outputLimitType[0] == null || outputLimitType[0] == LimitUnit.rows) ? LimitUnit.rows.toString() : LimitUnit.bytes.toString();
+					xml.append("\t\t<default ").append(VOSerializer.formatAttribute("unit", limitType)).append(">").append(limit).append("</default>\n");
+				}
+				if (outputLimit[1] > -1){
+					long limit = outputLimit[1] * outputLimitType[1].bytesFactor();
+					limitType = (outputLimitType[1] == null || outputLimitType[1] == LimitUnit.rows) ? LimitUnit.rows.toString() : LimitUnit.bytes.toString();
+					xml.append("\t\t<hard ").append(VOSerializer.formatAttribute("unit", limitType)).append(">").append(limit).append("</hard>\n");
+				}
 				xml.append("\t</outputLimit>\n");
 			}
 		}
@@ -537,48 +544,15 @@ public class TAP implements VOSIResource {
 			if (uploadLimit != null && uploadLimit.length >= 2 && uploadLimitType != null && uploadLimitType.length >= 2){
 				if (uploadLimit[0] > -1 || uploadLimit[1] > -1){
 					xml.append("\t<uploadLimit>\n");
+					String limitType;
 					if (uploadLimit[0] > -1){
-						String limitType;
-						long limit = uploadLimit[0];
-						switch(uploadLimitType[0]){
-							case kilobytes:
-								limit *= 1000l;
-								limitType = LimitUnit.rows.toString();
-								break;
-							case megabytes:
-								limit *= 1000000l;
-								limitType = LimitUnit.rows.toString();
-								break;
-							case gigabytes:
-								limit *= 1000000000l;
-								limitType = LimitUnit.rows.toString();
-								break;
-							default:
-								limitType = uploadLimitType[0].toString();
-								break;
-						}
+						long limit = uploadLimit[0] * uploadLimitType[0].bytesFactor();
+						limitType = (uploadLimitType[0] == null || uploadLimitType[0] == LimitUnit.rows) ? LimitUnit.rows.toString() : LimitUnit.bytes.toString();
 						xml.append("\t\t<default ").append(VOSerializer.formatAttribute("unit", limitType)).append("\">").append(limit).append("</default>\n");
 					}
 					if (uploadLimit[1] > -1){
-						String limitType;
-						long limit = uploadLimit[1];
-						switch(uploadLimitType[1]){
-							case kilobytes:
-								limit *= 1000l;
-								limitType = LimitUnit.rows.toString();
-								break;
-							case megabytes:
-								limit *= 1000000l;
-								limitType = LimitUnit.rows.toString();
-								break;
-							case gigabytes:
-								limit *= 1000000000l;
-								limitType = LimitUnit.rows.toString();
-								break;
-							default:
-								limitType = uploadLimitType[1].toString();
-								break;
-						}
+						long limit = uploadLimit[1] * uploadLimitType[1].bytesFactor();
+						limitType = (uploadLimitType[1] == null || uploadLimitType[1] == LimitUnit.rows) ? LimitUnit.rows.toString() : LimitUnit.bytes.toString();
 						xml.append("\t\t<hard ").append(VOSerializer.formatAttribute("unit", limitType)).append("\">").append(limit).append("</hard>\n");
 					}
 					xml.append("\t</uploadLimit>\n");
diff --git a/src/tap/upload/Uploader.java b/src/tap/upload/Uploader.java
index 0d5deb704c7d6a4a088fbd6a95124a971af0d460..994552b199a672a99aa8346723b9c04dab8b5b67 100644
--- a/src/tap/upload/Uploader.java
+++ b/src/tap/upload/Uploader.java
@@ -120,24 +120,8 @@ public class Uploader {
 		if (this.service.uploadEnabled()){
 			// ...and set the rows or bytes limit:
 			if (this.service.getUploadLimitType()[1] != null && this.service.getUploadLimit()[1] > 0){
-				switch(service.getUploadLimitType()[1]){
-					case kilobytes:
-						limit = (int)(1000l * this.service.getUploadLimit()[1]);
-						limitUnit = LimitUnit.bytes;
-						break;
-					case megabytes:
-						limit = (int)(1000000l * this.service.getUploadLimit()[1]);
-						limitUnit = LimitUnit.bytes;
-						break;
-					case gigabytes:
-						limit = (int)(1000000000l * this.service.getUploadLimit()[1]);
-						limitUnit = LimitUnit.bytes;
-						break;
-					default:
-						limit = this.service.getUploadLimit()[1];
-						limitUnit = this.service.getUploadLimitType()[1];
-						break;
-				}
+				limit = (int)(this.service.getUploadLimitType()[1].bytesFactor() * this.service.getUploadLimit()[1]);
+				limitUnit = (this.service.getUploadLimitType()[1] == LimitUnit.rows) ? LimitUnit.rows : LimitUnit.bytes;
 			}else{
 				limit = -1;
 				limitUnit = null;