diff --git a/contribs/lua/job_submit.lua b/contribs/lua/job_submit.lua
index 70c8567e00e3873ceac7b1b2c7c8edee0e5003dd..f5e9a6adc2df5d3a567c4e327e818ea4a31dd937 100644
--- a/contribs/lua/job_submit.lua
+++ b/contribs/lua/job_submit.lua
@@ -16,10 +16,13 @@ require "posix"
 --########################################################################--
 
 
-function slurm_job_submit ( job_desc_addr )
+function slurm_job_submit ( job_desc_addr, part_rec_addr )
 	local job_desc = { job_desc_ptr=job_desc_addr }
+	local part_rec = { part_rec_ptr=part_rec_addr }
 	setmetatable (job_desc, job_req_meta)
+	setmetatable (part_rec, part_rec_meta)
 
+log_info("part name:%s, nodes:%s", part_rec.name, part_rec.nodes)
 	if job_desc.account == nil then
 		local account = "***TEST_ACCOUNT***"
 		log_info("slurm_job_submit: job from uid %d, setting default account value: %s",
@@ -30,12 +33,15 @@ function slurm_job_submit ( job_desc_addr )
 	return
 end
 
-function slurm_job_modify ( job_desc_addr, job_rec_addr )
+function slurm_job_modify ( job_desc_addr, job_rec_addr, part_rec_addr )
 	local job_desc = { job_desc_ptr=job_desc_addr }
 	local job_rec  = { job_rec_ptr=job_rec_addr }
+	local part_rec = { part_rec_ptr=part_rec_addr }
 	setmetatable (job_desc, job_req_meta)
 	setmetatable (job_rec,  job_rec_meta)
+	setmetatable (part_rec, part_rec_meta)
 
+log_info("part name:%s, nodes:%s", part_rec.name, part_rec.nodes)
 	if job_desc.comment == nil then
 		local comment = "***TEST_COMMENT***"
 		log_info("slurm_job_modify: for job %u, setting default comment value: %s",
@@ -50,6 +56,8 @@ end
 --
 --  Initialization code:
 --
+--  Define functions for logging and accessing slurmctld structures
+--
 --########################################################################--
 
 
@@ -71,6 +79,11 @@ job_req_meta = {
 		return _set_job_req_field(table.job_desc_ptr, key, value)
 	end
 }
+part_rec_meta = {
+	__index = function (table, key)
+		return _get_part_rec_field(table.part_rec_ptr, key)
+	end
+}
 
 log_info("initialized")
 
diff --git a/src/plugins/job_submit/lua/job_submit_lua.c b/src/plugins/job_submit/lua/job_submit_lua.c
index 90c780aab1f6f73feca8a6db55c668f9046fb044..72a173660572a10805ecde4d270a3ef0ece01260 100644
--- a/src/plugins/job_submit/lua/job_submit_lua.c
+++ b/src/plugins/job_submit/lua/job_submit_lua.c
@@ -213,8 +213,9 @@ static void _register_lua_slurm_output_functions (void)
 	lua_setglobal (L, "slurm");
 }
 
-/* Get fields in an existing job record
- * NOTE: This is an incomplete list of job record fields, add more as needed */
+/* Get fields in an existing slurmctld job record
+ * NOTE: This is an incomplete list of job record fields.
+ * Add more as needed and send patches to slurm-dev@llnl.gov */
 static int _get_job_rec_field (lua_State *L)
 {
 	const struct job_record *job_ptr = lua_touserdata(L, 1);
@@ -360,7 +361,7 @@ static int _get_job_req_field (lua_State *L)
 	return 1;
 }
 
-/* Set fields in the job request record on job submit or modify */
+/* Set fields in the job request structure on job submit or modify */
 static int _set_job_req_field (lua_State *L)
 {
 	struct job_descriptor *job_desc = lua_touserdata(L, 1);
@@ -485,7 +486,48 @@ static int _set_job_req_field (lua_State *L)
 	return 0;
 }
 
-static void _register_lua_slurm_job_functions (void)
+/* Get fields in an existing slurmctld partition record
+ * NOTE: This is an incomplete list of partition record fields.
+ * Add more as needed and send patches to slurm-dev@llnl.gov */
+static int _get_part_rec_field (lua_State *L)
+{
+	const struct part_record *part_ptr = lua_touserdata(L, 1);
+	const char *name = luaL_checkstring(L, 2);
+
+	if (part_ptr == NULL) {
+		error("_get_part_field: part_ptr is NULL");
+		lua_pushnil (L);
+	} else if (!strcmp(name, "max_nodes")) {
+		lua_pushnumber (L, part_ptr->max_nodes);
+	} else if (!strcmp(name, "max_nodes_orig")) {
+		lua_pushnumber (L, part_ptr->max_nodes_orig);
+	} else if (!strcmp(name, "max_time")) {
+		lua_pushnumber (L, part_ptr->max_time);
+	} else if (!strcmp(name, "min_nodes")) {
+		lua_pushnumber (L, part_ptr->min_nodes);
+	} else if (!strcmp(name, "min_nodes_orig")) {
+		lua_pushnumber (L, part_ptr->min_nodes_orig);
+	} else if (!strcmp(name, "name")) {
+		lua_pushstring (L, part_ptr->name);
+	} else if (!strcmp(name, "nodes")) {
+		lua_pushstring (L, part_ptr->nodes);
+	} else if (!strcmp(name, "priority")) {
+		lua_pushnumber (L, part_ptr->priority);
+	} else if (!strcmp(name, "state_up")) {
+		lua_pushnumber (L, part_ptr->state_up);
+	} else {
+		lua_pushnil (L);
+	}
+
+	return 1;
+}
+#if 0
+/* Filter before packing list of partitions */
+	char *allow_groups;	/* comma delimited list of groups */
+	uid_t *allow_uids;	/* zero terminated list of allowed users */
+#endif
+
+static void _register_lua_slurm_struct_functions (void)
 {
 	lua_pushcfunction(L, _get_job_rec_field);
 	lua_setglobal(L, "_get_job_rec_field");
@@ -493,6 +535,8 @@ static void _register_lua_slurm_job_functions (void)
 	lua_setglobal(L, "_get_job_req_field");
 	lua_pushcfunction(L, _set_job_req_field);
 	lua_setglobal(L, "_set_job_req_field");
+	lua_pushcfunction(L, _get_part_rec_field);
+	lua_setglobal(L, "_get_part_rec_field");
 }
 
 /*
@@ -567,10 +611,10 @@ int init (void)
 
 	/*
 	 *  Register SLURM functions in lua state:
-	 *  logging and job state read/write
+	 *  logging and slurm structure read/write functions
 	 */
 	_register_lua_slurm_output_functions();
-	_register_lua_slurm_job_functions();
+	_register_lua_slurm_struct_functions();
 
 	/*
 	 *  Run the user script:
@@ -616,7 +660,8 @@ extern int job_submit(struct job_descriptor *job_desc)
 		goto out;
 
 	lua_pushlightuserdata (L, job_desc);
-	if (lua_pcall (L, 1, 0, 0) != 0) {
+	lua_pushlightuserdata (L, default_part_loc);
+	if (lua_pcall (L, 2, 0, 0) != 0) {
 		error("%s/lua: %s: %s",
 		      __func__, lua_script_path, lua_tostring (L, -1));
 	} else
@@ -643,7 +688,8 @@ extern int job_modify(struct job_descriptor *job_desc,
 
 	lua_pushlightuserdata (L, job_desc);
 	lua_pushlightuserdata (L, job_ptr);
-	if (lua_pcall (L, 2, 0, 0) != 0) {
+	lua_pushlightuserdata (L, default_part_loc);
+	if (lua_pcall (L, 3, 0, 0) != 0) {
 		error("%s/lua: %s: %s",
 		      __func__, lua_script_path, lua_tostring (L, -1));
 	} else