diff --git a/RunServerTest b/RunServerTest
index 0029d1aad1b33d4ad74c24d1ed72e40b14bc6e3b..49bc04a8fc5eecaf50a3a55c0395f763749ddb63 100755
--- a/RunServerTest
+++ b/RunServerTest
@@ -3,8 +3,8 @@
 ARGS="--itemsfile items.cfg -p 11020"
 ARGS=$ARGS" --cokeport /dev/ttyUSB0"
 
-if [ "x$1" == "xdbg" ]; then 
-	LD_LIBRARY_PATH=. gdb --args ./dispsrv $ARGS
-else
+#if [ "x$1" == "xdbg" ]; then 
+#	LD_LIBRARY_PATH=. gdb --args ./dispsrv $ARGS
+#else
 	LD_LIBRARY_PATH=. ./dispsrv $ARGS
-fi
+#fi
diff --git a/src/client/main.c b/src/client/main.c
index 315dbd12829e500b79b6cb7f934c45c6c515d0da..bb159059d1011df5ecffe8ff64552ee08762c36f 100644
--- a/src/client/main.c
+++ b/src/client/main.c
@@ -179,6 +179,7 @@ int ShowNCursesUI(void)
 	 int	itemCount = displayMinItems;
 	 int	itemBase = 0;
 	 int	currentItem = 0;
+	 int	ret = -2;	// -2: Used for marking "no return yet"
 	 
 	 int	height, width;
 	 
@@ -186,6 +187,8 @@ int ShowNCursesUI(void)
 	initscr();
 	raw(); noecho();
 	
+	// Get item count
+	// - 6: randomly chosen (Need at least 3)
 	itemCount = LINES - 6;
 	if( itemCount > giNumItems )
 		itemCount = giNumItems;
@@ -292,7 +295,18 @@ int ShowNCursesUI(void)
 			}
 		}
 		else {
-			break;
+			switch(ch)
+			{
+			case '\n':
+				ret = currentItem;
+				break;
+			case 'q':
+				ret = -1;	// -1: Return with no dispense
+				break;
+			}
+			
+			// Check if the return value was changed
+			if( ret != -2 )	break;
 		}
 		
 	}
@@ -300,7 +314,7 @@ int ShowNCursesUI(void)
 	
 	// Leave
 	endwin();
-	return -1;
+	return ret;
 }
 
 /**
diff --git a/src/server/handler_coke.c b/src/server/handler_coke.c
index 17f73a26011fca5bf795c8185c08627908f70ed7..ad5387fdfb35f2420bd7b3f0f7b79bdb70797bb2 100644
--- a/src/server/handler_coke.c
+++ b/src/server/handler_coke.c
@@ -21,7 +21,7 @@
  int	Coke_InitHandler();
  int	Coke_CanDispense(int User, int Item);
  int	Coke_DoDispense(int User, int Item);
-void	WaitForColon();
+ int	WaitForColon();
  int	ReadLine(int len, char *output);
 
 // === GLOBALS ===
@@ -58,11 +58,14 @@ int Coke_CanDispense(int User, int Item)
 	// Sanity please
 	if( Item < 0 || Item > 6 )	return -1;	// -EYOURBAD
 	
-	write(giCoke_SerialFD, "\r\n", 2);
-	write(giCoke_SerialFD, "\r\n", 2);
-	write(giCoke_SerialFD, "\r\n", 2);
+	write(giCoke_SerialFD, "d7\r\n", 4);
+	write(giCoke_SerialFD, "d7\r\n", 4);
+	write(giCoke_SerialFD, "d7\r\n", 4);
 	
-	WaitForColon();
+	if( WaitForColon() ) {
+		fprintf(stderr, "Coke machine timed out\n");
+		return -2;	// -EMYBAD
+	}
 	
 	// Ask the coke machine
 	sprintf(tmp, "s%i\r\n", Item);
@@ -131,11 +134,16 @@ char ReadChar()
 	fd_set	readfs;
 	char	ch = 0;
 	 int	ret;
+	struct timeval	timeout;
+	
+	timeout.tv_sec = 5;	// 5 second timeout
+	timeout.tv_usec = 0;
 	
 	FD_ZERO(&readfs);
 	FD_SET(giCoke_SerialFD, &readfs);
 	
-	ret = select(giCoke_SerialFD+1, &readfs, NULL, NULL, NULL);
+	ret = select(giCoke_SerialFD+1, &readfs, NULL, NULL, &timeout);
+	if( ret == 0 )	return 0;	// Timeout
 	if( ret != 1 ) {
 		printf("readchar return %i\n", ret);
 		return 0;
@@ -150,7 +158,7 @@ char ReadChar()
 	return ch;
 }
 
-void WaitForColon()
+int WaitForColon()
 {
 	fd_set	readfs;
 	char	ch = 0;
@@ -158,6 +166,10 @@ void WaitForColon()
 	FD_SET(giCoke_SerialFD, &readfs);
 	
 	while( (ch = ReadChar()) != ':' && ch != 0);
+	
+	if( ch == 0 )	return -1;	// Timeout
+	
+	return 0;
 }
 
 int ReadLine(int len, char *output)