diff --git a/src/slaunch/opt.c b/src/slaunch/opt.c
index 868264aa6520cb56edd9cb37c8a649ea3b8b4e97..6b87a2868b2190bf19e7eb386f347a8d75ff346c 100644
--- a/src/slaunch/opt.c
+++ b/src/slaunch/opt.c
@@ -678,6 +678,7 @@ static void _opt_default()
 	opt.contiguous	    = false;
         opt.exclusive       = false;
 	opt.nodelist	    = NULL;
+	opt.nodefile	    = NULL;
 	opt.max_launch_time = 120;/* 120 seconds to launch job             */
 	opt.max_exit_timeout= 60; /* Warn user 60 seconds after task exit */
 	opt.msg_timeout     = 5;  /* Default launch msg timeout           */
@@ -907,6 +908,7 @@ void set_options(const int argc, char **argv, int first)
 		{"chdir",         required_argument, 0, 'D'},
 		{"local-error",   required_argument, 0, 'e'},
 		{"remote-error",  required_argument, 0, 'E'},
+		{"nodefile",      required_argument, 0, 'F'},
 		{"geometry",      required_argument, 0, 'g'},
 		{"local-input",   required_argument, 0, 'i'},
 		{"remote-input",  required_argument, 0, 'I'},
@@ -959,7 +961,7 @@ void set_options(const int argc, char **argv, int first)
 		{"multi-prog",       no_argument,       0, LONG_OPT_MULTI},
 		{NULL,               0,                 0, 0}
 	};
-	char *opt_string = "+c:Cd:D:e:E:g:i:I:J:kKlm:n:N:"
+	char *opt_string = "+c:Cd:D:e:E:F:g:i:I:J:kKlm:n:N:"
 		"o:O:Qr:R:t:uvVw:W:Z";
 
 	struct option *optz = spank_option_table_create (long_options);
@@ -1021,6 +1023,19 @@ void set_options(const int argc, char **argv, int first)
 			else
 				opt.local_efname = xstrdup(optarg);
 			break;
+		case (int)'F':
+			if(!first && opt.nodefile)
+				break;
+			
+			xfree(opt.nodefile);
+			opt.nodefile = xstrdup(optarg);
+#ifdef HAVE_BG
+			info("\tThe nodefile option should only be used if\n"
+			     "\tthe block you are asking for can be created.\n"
+			     "\tPlease consult smap before using this option\n"
+			     "\tor your job may be stuck with no way to run.");
+#endif
+			break;
 		case (int)'E':
 			if(!first && opt.remote_efname)
 				break;
@@ -1417,6 +1432,16 @@ static bool _opt_verify(void)
 	hostlist_t hl = NULL;
 	hostlist_t hl_unique = NULL;
 
+	if (opt.nodelist != NULL && opt.nodefile != NULL) {
+		error("The -w,--nodelist and -F,--nodefile parameters"
+		      " may not be used at the same time.");
+		verified = false;
+	} else if (opt.nodefile != NULL) {
+		char *tmp;
+		tmp = slurm_read_hostfile(opt.nodefile, 0);
+		opt.nodelist = xstrdup(tmp);
+		free(tmp);
+	}
 	if (opt.nodelist != NULL) {
 		hl = hostlist_create(opt.nodelist);
 		hl_unique = hostlist_copy(hl);
@@ -1451,7 +1476,7 @@ static bool _opt_verify(void)
 	if (!opt.num_nodes_set
 	    && opt.num_tasks_set && opt.num_tasks < opt.num_nodes)
 		opt.num_nodes = opt.num_tasks;
-	if (opt.num_nodes_set
+	if (opt.node_list
 	    && opt.num_nodes != hostlist_count(hl_unique)) {
 		if (opt.num_nodes > hostlist_count(hl_unique)) {
 			error("Asked for more nodes (%d) "
@@ -1459,7 +1484,7 @@ static bool _opt_verify(void)
 			      opt.num_nodes, hostlist_count(hl_unique));
 			verified = false;
 		} else { /* num_nodes < hostlist_count */
-			/* shrink the nodelist instead of an error? */
+			/* FIXME - shrink the nodelist instead of an error */
 			error("Asked for fewer nodes (%d) "
 			      "than listed in the nodelist (%d)",
 			      opt.num_nodes, hostlist_count(hl_unique));
diff --git a/src/slaunch/opt.h b/src/slaunch/opt.h
index 1dd35f35bbfb4cdaeecbb85bf38b55e337f18a11..8537f825e6a049719350b1bd191e9c08a8eabc44 100644
--- a/src/slaunch/opt.h
+++ b/src/slaunch/opt.h
@@ -115,7 +115,8 @@ typedef struct slaunch_options {
 	long tmpdisk;		/* --tmp=n			*/
 	char *constraints;	/* --constraints=, -C constraint*/
 	bool contiguous;	/* --contiguous			*/
-	char *nodelist;		/* --nodelist=node1,node2,...	*/
+	char *nodelist;		/* -w,--nodelist=node1,node2,...*/
+	char *nodefile;         /* -F,--nodefile=filename       */
 	int relative;		/* --relative -r N              */
 	bool relative_set;      /* true if --relative set explicitly */
 	bool no_alloc;		/* --no-allocate, -Z		*/