diff --git a/CHANGES b/CHANGES
index febf1ee279d59404ab899412995a70f43c0e165f..4625ee0c88f030a65891ffdbd0ef90d80921eb64 100644
--- a/CHANGES
+++ b/CHANGES
@@ -29,3 +29,11 @@ Changes since Asterisk 1.4-beta was branched:
      two channels.
   * Added 'Strategy' field to manager event QueueParams which represents
      the queue strategy in use. 
+  * From the to-do lists: straighten out the app timeout args:
+     Wait() app now really does 0.3 seconds- was truncating arg to an int.
+     WaitExten() same as Wait().
+     Congestion() - Now takes floating pt. argument.
+     Busy() - now takes floating pt. argument.
+     Read() - timeout now can be floating pt.
+     WaitForRing() now takes floating pt timeout arg.
+     SpeechBackground() -- clarified in the docstrings that the timeout is an integer seconds.
diff --git a/apps/app_read.c b/apps/app_read.c
index bb3dd669bf79572fff2f06e568c4b320c6ce64f6..5db886b03776c6b0970f2efd0150aa2b3da66ad7 100644
--- a/apps/app_read.c
+++ b/apps/app_read.c
@@ -77,8 +77,8 @@ static char *descrip =
 "                'n' to read digits even if the line is not up.\n"
 "  attempts   -- if greater than 1, that many attempts will be made in the \n"
 "                event no data is entered.\n"
-"  timeout    -- An integer number of seconds to wait for a digit response. If greater\n"
-"                than 0, that value will override the default timeout.\n\n"
+"  timeout    -- The number of seconds to wait for a digit response. If greater\n"
+"                than 0, that value will override the default timeout. Can be floating point.\n\n"
 "Read should disconnect if the function fails or errors out.\n";
 
 
@@ -91,6 +91,7 @@ static int read_exec(struct ast_channel *chan, void *data)
 	char tmp[256] = "";
 	int maxdigits = 255;
 	int tries = 1, to = 0, x = 0;
+	double tosec;
 	char *argcopy = NULL;
 	struct tone_zone_sound *ts;
 	struct ast_flags flags = {0};
@@ -126,11 +127,11 @@ static int read_exec(struct ast_channel *chan, void *data)
 	}
 
 	if (!ast_strlen_zero(arglist.timeout)) {
-		to = atoi(arglist.timeout);
-		if (to <= 0)
+		tosec = atof(arglist.timeout);
+		if (tosec <= 0)
 			to = 0;
 		else
-			to *= 1000;
+			to = tosec * 1000.0;
 	}
 
 	if (ast_strlen_zero(arglist.filename)) {
diff --git a/apps/app_speech_utils.c b/apps/app_speech_utils.c
index 525aa0af4005f1b783798d0ed94363af61f554d3..42b7fb0315007c994f44809d5eb31c31f7620304 100644
--- a/apps/app_speech_utils.c
+++ b/apps/app_speech_utils.c
@@ -64,7 +64,7 @@ static char *speechbackground_descrip =
 "Once they stop talking the processing sound is played to indicate the speech recognition engine is working.\n"
 "Once results are available the application returns and results (score and text) are available using dialplan functions.\n"
 "The first text and score are ${SPEECH_TEXT(0)} AND ${SPEECH_SCORE(0)} while the second are ${SPEECH_TEXT(1)} and ${SPEECH_SCORE(1)}.\n"
-"The first argument is the sound file and the second is the timeout. Note the timeout will only start once the sound file has stopped playing.\n";
+"The first argument is the sound file and the second is the timeout integer in seconds. Note the timeout will only start once the sound file has stopped playing.\n";
 
 static char *speechdeactivategrammar_descrip =
 "SpeechDeactivateGrammar(Grammar Name)\n"
diff --git a/apps/app_waitforring.c b/apps/app_waitforring.c
index a4f69ae7746e78622635464d062a72502985b20f..d59644baca6020454eb6346736653fa5c36c4c52 100644
--- a/apps/app_waitforring.c
+++ b/apps/app_waitforring.c
@@ -58,16 +58,17 @@ static int waitforring_exec(struct ast_channel *chan, void *data)
 	struct ast_module_user *u;
 	struct ast_frame *f;
 	int res = 0;
+	double s;
 	int ms;
 
-	if (!data || (sscanf(data, "%d", &ms) != 1)) {
+	if (!data || (sscanf(data, "%lg", &s) != 1)) {
                 ast_log(LOG_WARNING, "WaitForRing requires an argument (minimum seconds)\n");
 		return 0;
 	}
 
 	u = ast_module_user_add(chan);
 
-	ms *= 1000;
+	ms = s*1000.0;
 	while(ms > 0) {
 		ms = ast_waitfor(chan, ms);
 		if (ms < 0) {
diff --git a/main/pbx.c b/main/pbx.c
index d3fb389dae6c248c033308c6bd39cb0abedc9ecf..d6f2ad8a28469b6247c67b43a5ae7cc02a8ac6e7 100644
--- a/main/pbx.c
+++ b/main/pbx.c
@@ -5023,12 +5023,14 @@ static void wait_for_hangup(struct ast_channel *chan, void *data)
 {
 	int res;
 	struct ast_frame *f;
+	double waitsec;
 	int waittime;
 
-	if (ast_strlen_zero(data) || (sscanf(data, "%d", &waittime) != 1) || (waittime < 0))
-		waittime = -1;
-	if (waittime > -1) {
-		ast_safe_sleep(chan, waittime * 1000);
+	if (ast_strlen_zero(data) || (sscanf(data, "%lg", &waitsec) != 1) || (waitsec < 0))
+		waitsec = -1;
+	if (waitsec > -1) {
+		waittime = waitsec * 1000.0;
+		ast_safe_sleep(chan, waittime);
 	} else do {
 		res = ast_waitfor(chan, -1);
 		if (res < 0)
@@ -5246,11 +5248,12 @@ static int pbx_builtin_execiftime(struct ast_channel *chan, void *data)
  */
 static int pbx_builtin_wait(struct ast_channel *chan, void *data)
 {
+	double s;
 	int ms;
 
 	/* Wait for "n" seconds */
-	if (data && (ms = atof(data)) > 0) {
-		ms *= 1000;
+	if (data && (s = atof(data)) > 0.0) {
+		ms = s*1000.0;
 		return ast_safe_sleep(chan, ms);
 	}
 	return 0;
@@ -5262,6 +5265,7 @@ static int pbx_builtin_wait(struct ast_channel *chan, void *data)
 static int pbx_builtin_waitexten(struct ast_channel *chan, void *data)
 {
 	int ms, res;
+	double s;
 	struct ast_flags flags = {0};
 	char *opts[1] = { NULL };
 	char *parse;
@@ -5285,12 +5289,13 @@ static int pbx_builtin_waitexten(struct ast_channel *chan, void *data)
 		ast_indicate_data(chan, AST_CONTROL_HOLD, opts[0], strlen(opts[0]));
 
 	/* Wait for "n" seconds */
-	if (args.timeout && (ms = atof(args.timeout)) > 0)
-		 ms *= 1000;
+	if (args.timeout && (s = atof(args.timeout)) > 0)
+		 ms = s * 1000.0;
 	else if (chan->pbx)
 		ms = chan->pbx->rtimeout * 1000;
 	else
 		ms = 10000;
+
 	res = ast_waitfordigit(chan, ms);
 	if (!res) {
 		if (ast_exists_extension(chan, chan->context, chan->exten, chan->priority + 1, chan->cid.cid_num)) {