diff --git a/src/server/common.h b/src/server/common.h
index 004fbf877e116f4d08ab61d81cda36bcd81b2546..7ad01c5d5d786a27f41ba52c409ba6845db887bb 100644
--- a/src/server/common.h
+++ b/src/server/common.h
@@ -73,6 +73,7 @@ extern int	giNumItems;
 extern tHandler	*gaHandlers[];
 extern int	giNumHandlers;
 extern int	giDebugLevel;
+extern int	gbNoCostMode;
 
 // === FUNCTIONS ===
 extern void	Items_UpdateFile(void);
diff --git a/src/server/handler_coke.c b/src/server/handler_coke.c
index a899ad588aa93c020db782c628116b5cdfefa946..61b26491237066b6ccd1b6755f8918d4a1a87657 100644
--- a/src/server/handler_coke.c
+++ b/src/server/handler_coke.c
@@ -223,6 +223,7 @@ int Coke_int_DropSlot(int Slot)
 	if( res == 0 )
 	{
 		// Oops!, no drink
+		printf("Drink dispense failed, bit lowered too quickly\n");
 		return 1;
 	}
 	
diff --git a/src/server/itemdb.c b/src/server/itemdb.c
index 8f2cfeccd0a1cad82cb33f153b85413ea30c048f..632eb504ec19fd8b579d4b1ff0f9ad01ba2f21dd 100644
--- a/src/server/itemdb.c
+++ b/src/server/itemdb.c
@@ -207,7 +207,10 @@ void Items_ReadFromFile(void)
 		items = realloc( items, (numItems + 1)*sizeof(items[0]) );
 		items[numItems].Handler = handler;
 		items[numItems].ID = num;
-		items[numItems].Price = price;
+		if( gbNoCostMode )
+			items[numItems].Price = 0;
+		else
+			items[numItems].Price = price;
 		items[numItems].Name = strdup(desc);
 		items[numItems].bHidden = (line[0] == '-');
 		numItems ++;
diff --git a/src/server/main.c b/src/server/main.c
index c2ef55c01fd1c22bed665f3a4938910ccfde7deb..f2f66c38667256f827d17476818036e600ce2a31 100644
--- a/src/server/main.c
+++ b/src/server/main.c
@@ -36,6 +36,7 @@ void	*Periodic_Thread(void *Unused);
 
 // === GLOBALS ===
  int	giDebugLevel = 0;
+ int	gbNoCostMode = 0;
 const char	*gsCokebankPath = "cokebank.db";
 // - Functions called every 20s (or so)
 #define ciMaxPeriodics	10
@@ -121,7 +122,9 @@ int main(int argc, char *argv[])
 	gsCoke_ModbusAddress = Config_GetValue("coke_modbus_address", 0);
 	giServer_Port        = Config_GetValue_Int("server_port", 0);
 	gsItemListFile       = Config_GetValue("items_file", 0);
-	
+
+	gbNoCostMode         = Config_GetValue_Bool("test_mode", 0);
+
 	signal(SIGINT, sigint_handler);
 	signal(SIGTERM, sigint_handler);
 	
diff --git a/src/server/server.c b/src/server/server.c
index e392f738431aa51ef7ce8f23c2e81a8b3d462cfe..63b4aa79777b27a04480e65aa9cda9cb9adf7251 100644
--- a/src/server/server.c
+++ b/src/server/server.c
@@ -731,7 +731,7 @@ void Server_int_SendItem(tClient *Client, tItem *Item)
 		}
 	}
 	
-	if( Item->Price == 0 )
+	if( !gbNoCostMode && Item->Price == 0 )
 		status = "error";
 	// KNOWN HACK: Naming a slot 'dead' disables it
 	if( strcmp(Item->Name, "dead") == 0 )