diff --git a/UPGRADE.txt b/UPGRADE.txt
index df7e3a0810f261ed62439de90a846bc2dac5727c..f486241dc9a4631315b79dc56faee5ea14337c8b 100644
--- a/UPGRADE.txt
+++ b/UPGRADE.txt
@@ -47,6 +47,7 @@ pbx_lua:
    (such as app.goto).  Now when an application such as app.goto() is called,
    control is returned back to the pbx engine and the current extension
    function stops executing.
+ - autoservice_start() and autoservice_start() no longer return a value.
 
 ===========================================================
 ===========================================================
diff --git a/pbx/pbx_lua.c b/pbx/pbx_lua.c
index 61f93ab636bb5f124889545b3c049e872159b8d5..25acc4981a9ece928d6e2eb4f1e94d8753d8c1aa 100644
--- a/pbx/pbx_lua.c
+++ b/pbx/pbx_lua.c
@@ -717,26 +717,28 @@ static int lua_func_read(lua_State *L)
  * This function will set a flag that will cause pbx_lua to maintain an
  * autoservice on this channel.  The autoservice will automatically be stopped
  * and restarted before calling applications and functions.
- *
- * \return This function returns the result of the ast_autoservice_start()
- * function as a boolean to its lua caller.
  */
 static int lua_autoservice_start(lua_State *L)
 {
 	struct ast_channel *chan;
-	int res;
+
+	lua_getfield(L, LUA_REGISTRYINDEX, "autoservice");
+	if (lua_toboolean(L, -1)) {
+		/* autservice already running */
+		lua_pop(L, 1);
+		return 0;
+	}
+	lua_pop(L, 1);
 
 	lua_getfield(L, LUA_REGISTRYINDEX, "channel");
 	chan = lua_touserdata(L, -1);
 	lua_pop(L, 1);
 
-	res = ast_autoservice_start(chan);
+	ast_autoservice_start(chan);
 
-	lua_pushboolean(L, !res);
+	lua_pushboolean(L, 1);
 	lua_setfield(L, LUA_REGISTRYINDEX, "autoservice");
-
-	lua_pushboolean(L, !res);
-	return 1;
+	return 0;
 }
 
 /*!
@@ -748,26 +750,28 @@ static int lua_autoservice_start(lua_State *L)
  * This function will stop any autoservice running and turn off the autoservice
  * flag.  If this function returns false, it's probably because no autoservice
  * was running to begin with.
- *
- * \return This function returns the result of the ast_autoservice_stop()
- * function as a boolean to its lua caller.
  */
 static int lua_autoservice_stop(lua_State *L)
 {
 	struct ast_channel *chan;
-	int res;
+
+	lua_getfield(L, LUA_REGISTRYINDEX, "autoservice");
+	if (!lua_toboolean(L, -1)) {
+		/* no autservice running */
+		lua_pop(L, 1);
+		return 0;
+	}
+	lua_pop(L, 1);
 
 	lua_getfield(L, LUA_REGISTRYINDEX, "channel");
 	chan = lua_touserdata(L, -1);
 	lua_pop(L, 1);
 
-	res = ast_autoservice_stop(chan);
+	ast_autoservice_stop(chan);
 
 	lua_pushboolean(L, 0);
 	lua_setfield(L, LUA_REGISTRYINDEX, "autoservice");
-
-	lua_pushboolean(L, !res);
-	return 1;
+	return 0;
 }
 
 /*!
@@ -1429,7 +1433,13 @@ static int exec(struct ast_channel *chan, const char *context, const char *exten
 		ast_module_user_remove(u);
 		return -1;
 	}
-		
+
+	lua_getfield(L, LUA_REGISTRYINDEX, "autoservice");
+	if (lua_toboolean(L, -1)) {
+		ast_autoservice_start(chan);
+	}
+	lua_pop(L, 1);
+
 	lua_update_registry(L, context, exten, priority);
 	
 	lua_pushstring(L, context);
@@ -1459,6 +1469,13 @@ static int exec(struct ast_channel *chan, const char *context, const char *exten
 		lua_pop(L, 1);
 	}
 	lua_remove(L, error_func);
+
+	lua_getfield(L, LUA_REGISTRYINDEX, "autoservice");
+	if (lua_toboolean(L, -1)) {
+		ast_autoservice_stop(chan);
+	}
+	lua_pop(L, 1);
+
 	if (!chan) lua_close(L);
 	ast_module_user_remove(u);
 	return res;