diff --git a/apps/app_mp3.c b/apps/app_mp3.c
index e99415d53df602858c62f50cd3eea1cb509fbf49..b2bddb7fd67bdf56352f2287f5b24216c14e2802 100755
--- a/apps/app_mp3.c
+++ b/apps/app_mp3.c
@@ -73,20 +73,15 @@ static int mp3_exec(struct ast_channel *chan, void *data)
 	int res=0;
 	struct localuser *u;
 	int fds[2];
-	int rfds[1 + AST_MAX_FDS];
 	int ms = -1;
 	int pid = -1;
-	int us;
-	int exception;
 	int owriteformat;
-	struct timeval tv;
 	struct timeval last;
 	struct ast_frame *f;
-	int x;
 	struct myframe {
 		struct ast_frame f;
 		char offset[AST_FRIENDLY_OFFSET];
-		char frdata[160];
+		short frdata[160];
 	} myf;
 	last.tv_usec = 0;
 	last.tv_sec = 0;
@@ -109,29 +104,20 @@ static int mp3_exec(struct ast_channel *chan, void *data)
 	}
 	
 	res = mp3play((char *)data, fds[1]);
+	/* Wait 1000 ms first */
+	ms = 1000;
 	if (res >= 0) {
 		pid = res;
 		/* Order is important -- there's almost always going to be mp3...  we want to prioritize the
 		   user */
-		rfds[AST_MAX_FDS] = fds[0];
 		for (;;) {
-			CHECK_BLOCKING(chan);
-			for (x=0;x<AST_MAX_FDS;x++) 
-				rfds[x] = chan->fds[x];
-			res = ast_waitfor_n_fd(rfds, AST_MAX_FDS+1, &ms, &exception);
-			chan->blocking = 0;
-			if (res < 1) {
+			ms = ast_waitfor(chan, ms);
+			if (ms < 0) {
 				ast_log(LOG_DEBUG, "Hangup detected\n");
 				res = -1;
 				break;
 			}
-			for(x=0;x<AST_MAX_FDS;x++) 
-				if (res == chan->fds[x])
-					break;
-
-			if (x < AST_MAX_FDS) {
-				if (exception)
-					chan->exception = 1;
+			if (ms) {
 				f = ast_read(chan);
 				if (!f) {
 					ast_log(LOG_DEBUG, "Null frame == hangup() detected\n");
@@ -145,20 +131,7 @@ static int mp3_exec(struct ast_channel *chan, void *data)
 					break;
 				}
 				ast_frfree(f);
-			} else if (res == fds[0]) {
-				gettimeofday(&tv, NULL);
-				if (last.tv_sec || last.tv_usec) {
-					/* We should wait at least a frame length */
-					us = sizeof(myf.frdata) / 16 * 1000;
-					/* Subtract 1,000,000 us for each second late we've passed */
-					us -= (tv.tv_sec - last.tv_sec) * 1000000;
-					/* And one for each us late we've passed */
-					us -= (tv.tv_usec - last.tv_usec);
-					/* Sleep that long if needed */
-					if (us > 0)
-						usleep(us);
-				}
-				last = tv;
+			} else  {
 				res = read(fds[0], myf.frdata, sizeof(myf.frdata));
 				if (res > 0) {
 					myf.f.frametype = AST_FRAME_VOICE;
@@ -176,11 +149,9 @@ static int mp3_exec(struct ast_channel *chan, void *data)
 				} else {
 					ast_log(LOG_DEBUG, "No more mp3\n");
 					res = 0;
+					break;
 				}
-			} else {
-				ast_log(LOG_DEBUG, "HuhHHH?\n");
-				res = -1;
-				break;
+				ms = res / 16;
 			}
 		}
 	}