diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index f6e2a28..1f88d72 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -48,6 +48,7 @@ struct _param
 	char	   *pg_host;
 	int			verbose;
 	int			dry_run;
+	int		transaction_limit;
 };
 
 int			vacuumlo(char *, struct _param *);
@@ -286,6 +287,8 @@ vacuumlo(char *database, struct _param * param)
 		}
 		else
 			deleted++;
+        	if(param->transaction_limit!=0 && deleted>=param->transaction_limit)
+		    break;
 	}
 	PQclear(res);
 
@@ -313,6 +316,7 @@ usage(const char *progname)
 	printf("  -h HOSTNAME  database server host or socket directory\n");
 	printf("  -n           don't remove large objects, just show what would be done\n");
 	printf("  -p PORT      database server port\n");
+	printf("  -l LIMIT     stop after removing LIMIT LOs\n");
 	printf("  -U USERNAME  user name to connect as\n");
 	printf("  -w           never prompt for password\n");
 	printf("  -W           force password prompt\n");
@@ -342,6 +346,7 @@ main(int argc, char **argv)
 	param.pg_port = NULL;
 	param.verbose = 0;
 	param.dry_run = 0;
+	param.transaction_limit = 0;
 
 	if (argc > 1)
 	{
@@ -359,7 +364,7 @@ main(int argc, char **argv)
 
 	while (1)
 	{
-		c = getopt(argc, argv, "h:U:p:vnwW");
+		c = getopt(argc, argv, "h:U:p:l:vnwW");
 		if (c == -1)
 			break;
 
@@ -395,6 +400,14 @@ main(int argc, char **argv)
 				}
 				param.pg_port = strdup(optarg);
 				break;
+			case 'l':
+				param.transaction_limit = strtol(optarg, NULL, 10);
+				if ((param.transaction_limit < 0) || (param.transaction_limit > 2147483647))
+				{
+				    fprintf(stderr, "%s: invalid transaction limit number: %s, valid range is form 0(disabled) to 2147483647.\n", progname, optarg);
+				    exit(1);
+				}
+				break;
 			case 'h':
 				param.pg_host = strdup(optarg);
 				break;
