diff --git a/judge/manager/game.cpp b/judge/manager/game.cpp
index 0e768c5fe60333b099c4b072738f6315c29db91f..c1238f0660104b9b09326f970382badd105130cf 100644
--- a/judge/manager/game.cpp
+++ b/judge/manager/game.cpp
@@ -208,21 +208,23 @@ void Game::Wait(double wait)
 	if (wait <= 0)
 		return;
 
-	TimerThread timer(wait*1000000); //Wait in seconds
-	timer.Start();
+
+
 
 	#ifdef BUILD_GRAPHICS
+
+
 	if (!graphicsEnabled)
 	{
-		while (!timer.Finished());
-		timer.Stop();
+		usleep(1000000*wait); //Wait in seconds
 		return;
 	}
-	#endif //BUILD_GRAPHICS
 
+	TimerThread timer(wait*1000000); //Wait in seconds
+	timer.Start();
 	while (!timer.Finished())
 	{
-		#ifdef BUILD_GRAPHICS
+	
 		SDL_Event  event;
 		while (SDL_PollEvent(&event))
 		{
@@ -234,9 +236,12 @@ void Game::Wait(double wait)
 					break;
 			}
 		}
-		#endif //BUILD_GRAPHICS
 	}
 	timer.Stop();
+
+	#else
+	usleep(wait*1000000); //Wait in seconds
+	#endif //BUILD_GRAPHICS
 	
 }
 
diff --git a/judge/manager/network.cpp b/judge/manager/network.cpp
index e349fea4cabfb85749929a7918cd0951189105a3..74929a7b0f5547b851769a11a1a2838deb67c32e 100644
--- a/judge/manager/network.cpp
+++ b/judge/manager/network.cpp
@@ -150,6 +150,31 @@ bool Network::GetMessage(string & buffer, double timeout)
 		setbuf(file, NULL);
 	}
 
+	struct timeval tv;
+	fd_set readfds;
+	
+	tv.tv_sec = (int)(timeout);
+	tv.tv_usec = (timeout - (double)((int)timeout)) * 1000000;
+
+	FD_ZERO(&readfds);
+	FD_SET(sfd, &readfds);
+
+	select(sfd+1, &readfds, NULL, NULL, &tv);
+
+	if (!FD_ISSET(sfd, &readfds))
+		return false; //Timed out
+	//fprintf(stderr, "Got message!\n");
+	for (char c = fgetc(file); c != '\n' && (int)(c) != EOF; c = fgetc(file))
+	{	
+		//fprintf(stderr, "%c", c);
+		buffer += c;
+	}
+	//fprintf(stderr, "%s\n", buffer.c_str());
+	return true;
+
+
+	/* Old way, which is apparently terrible
+
 	assert(&buffer != NULL);
 	GetterThread getterThread(file, buffer);
 	assert(&(getterThread.buffer) != NULL);
@@ -180,6 +205,7 @@ bool Network::GetMessage(string & buffer, double timeout)
 	if (buffer.size() == 1 && buffer[0] == EOF)
 		return false;
 	return true;
+	*/
 
 
 }
diff --git a/judge/manager/program.cpp b/judge/manager/program.cpp
index 02c9cb86ea3f0eb86781dd4ef923467f3a936002..5ea1591611a6dbab3f631a3018c978a4e4c4ef1c 100644
--- a/judge/manager/program.cpp
+++ b/judge/manager/program.cpp
@@ -10,6 +10,12 @@
 #include <string.h>
 #include <stdio.h>
 
+#include <stdio.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+
 using namespace std;
 
 
@@ -60,7 +66,7 @@ Program::Program(const char * executablePath) : input(NULL), output(NULL), pid(0
 	char **  arguments = NULL;
         if (args.size() > 0)
 	{
-		arguments = new char*[args.size()+2];
+		arguments = new char*[args.size()];
 		for (unsigned int i=0; i < args.size(); ++i)
 			arguments[i] = args[i];
 	}
@@ -221,6 +227,31 @@ bool Program::GetMessage(string & buffer, double timeout)
 	if (!Running() || timeout == 0)
 		return false;
 
+	struct timeval tv;
+	fd_set readfds;
+	
+	tv.tv_sec = (int)(timeout);
+	tv.tv_usec = (timeout - (double)((int)timeout)) * 1000000;
+	
+	int fd = fileno(input);
+
+	FD_ZERO(&readfds);
+	FD_SET(fd, &readfds);
+
+	select(fd+1, &readfds, NULL, NULL, &tv);
+
+	if (!FD_ISSET(fd, &readfds))
+		return false; //Timed out
+	//fprintf(stderr, "Got message!\n");
+	for (char c = fgetc(input); c != '\n' && (int)(c) != EOF; c = fgetc(input))
+	{	
+		//fprintf(stderr, "%c", c);
+		buffer += c;
+	}
+	//fprintf(stderr, "%s\n", buffer.c_str());
+	return true;
+
+	/* Old way, using threads, which apparently is terrible
 	assert(&buffer != NULL);
 	GetterThread getterThread(input, buffer);
 	assert(&(getterThread.buffer) != NULL);
@@ -251,7 +282,7 @@ bool Program::GetMessage(string & buffer, double timeout)
 	if (buffer.size() == 1 && buffer[0] == EOF)
 		return false;
 	return true;
-
+	*/
 
 }