diff --git a/channel.c b/channel.c
index e4f121f84b838a3c7b4cade05d73966d2110cb69..655bac85f6e3fdcddb883bdf70e3f7e0153ffa8c 100755
--- a/channel.c
+++ b/channel.c
@@ -939,7 +939,7 @@ void ast_channel_free(struct ast_channel *chan)
 	free(chan);
 	ast_mutex_unlock(&chlock);
 
-	ast_device_state_changed(name);
+	ast_device_state_changed_literal(name);
 }
 
 static void ast_spy_detach(struct ast_channel *chan) 
@@ -2883,7 +2883,7 @@ int ast_setstate(struct ast_channel *chan, int state)
 		return 0;
 
 	chan->_state = state;
-	ast_device_state_changed(chan->name);
+	ast_device_state_changed_literal(chan->name);
 	manager_event(EVENT_FLAG_CALL,
 		      (oldstate == AST_STATE_DOWN) ? "Newchannel" : "Newstate",
 		      "Channel: %s\r\n"
diff --git a/devicestate.c b/devicestate.c
index 3b5c581f4d380bd919c5cdd902ad3c32b5775589..c85f9a8fec3dd0c97897d2dd6dd9567568f78781 100755
--- a/devicestate.c
+++ b/devicestate.c
@@ -193,22 +193,14 @@ static void do_state_change(const char *device)
 	ast_hint_state_changed(device);
 }
 
-/*--- ast_device_state_changed: Accept change notification, add it to change queue */
-int ast_device_state_changed(const char *fmt, ...) 
+static int __ast_device_state_changed_literal(char *buf)
 {
-	char buf[AST_MAX_EXTENSION];
 	char *device;
 	char *parse;
 	struct state_change *change = NULL;
-	va_list ap;
-
-	va_start(ap, fmt);
-	vsnprintf(buf, sizeof(buf), fmt, ap);
-	va_end(ap);
 
 	parse = buf;
 	device = strsep(&parse, "-");
-
 	if (change_thread != AST_PTHREADT_NULL)
 		change = calloc(1, sizeof(*change) + strlen(device));
 
@@ -230,6 +222,25 @@ int ast_device_state_changed(const char *fmt, ...)
 	return 1;
 }
 
+int ast_device_state_changed_literal(const char *dev)
+{
+	char *buf;
+	buf = ast_strdupa(dev);
+	return __ast_device_state_changed_literal(buf);
+}
+
+/*--- ast_device_state_changed: Accept change notification, add it to change queue */
+int ast_device_state_changed(const char *fmt, ...) 
+{
+	char buf[AST_MAX_EXTENSION];
+	va_list ap;
+
+	va_start(ap, fmt);
+	vsnprintf(buf, sizeof(buf), fmt, ap);
+	va_end(ap);
+	return __ast_device_state_changed_literal(buf);
+}
+
 /*--- do_devstate_changes: Go through the dev state change queue and update changes in the dev state thread */
 static void *do_devstate_changes(void *data)
 {
diff --git a/include/asterisk/devicestate.h b/include/asterisk/devicestate.h
index 687e6819f9dc1e7b2b18d2c43e72b7714c16652b..ec8c6620b8ca3642d120c5189a18dcf27e5ff99e 100755
--- a/include/asterisk/devicestate.h
+++ b/include/asterisk/devicestate.h
@@ -79,6 +79,16 @@ int ast_device_state(const char *device);
 int ast_device_state_changed(const char *fmt, ...)
 	__attribute__ ((format (printf, 1, 2)));
 
+
+/*! Tells Asterisk the State for Device is changed */
+/*!
+ * \param device devicename like a dialstrin
+ * Asterisk polls the new extensionstates and calls the registered
+ * callbacks for the changed extensions
+ * Returns 0 on success, -1 on failure
+ */
+int ast_device_state_changed_literal(const char *device);
+
 /*! Registers a device state change callback */
 /*!
  * \param data to pass to callback