diff --git a/client.conf b/client.conf
new file mode 100644
index 0000000000000000000000000000000000000000..ff657ee984e38b3ecbbb46c498447d2cc7ba4eae
--- /dev/null
+++ b/client.conf
@@ -0,0 +1,5 @@
+#
+# OpenDispense2 Client config file
+#
+dispense_server merlo.ucc.asn.au
+dispense_port 11021
diff --git a/src/client/Makefile b/src/client/Makefile
index b70551eade5ee9b9a47bb8ba2ac174d9ec762ac5..5045d983fc0fd97aaccc73616516f855c6d60b75 100644
--- a/src/client/Makefile
+++ b/src/client/Makefile
@@ -8,7 +8,7 @@ LDFLAGS := -g -lncurses
 
 BIN := ../../dispense
 OBJ := main.o protocol.o menu.o
-OBJ += doregex.o
+OBJ += doregex.o config.o
 
 DEPFILES := $(OBJ:%.o=%.d)
 
diff --git a/src/client/main.c b/src/client/main.c
index ddf37799661f6091cefbcff6aaeca77ece350c4e..4dd70df90150cde1852926b354a48390e487ceca 100644
--- a/src/client/main.c
+++ b/src/client/main.c
@@ -17,6 +17,7 @@
 #include <limits.h>	// INT_MIN/INT_MAX
 #include "common.h"
 #include "../common/doregex.h"
+#include "../common/config.h"
 
 #define	USE_NCURSES_INTERFACE	0
 #define DEBUG_TRACE_SERVER	0
@@ -38,8 +39,12 @@ char	*trim(char *string);
 void	CompileRegex(regex_t *regex, const char *pattern, int flags);
 
 // === GLOBALS ===
-char	*gsDispenseServer = "merlo.ucc.gu.uwa.edu.au";
+const	char	*gsConfigFile = "/etc/opendispense/client.conf";
+
+const	char	*gsDispenseServer = "merlo.ucc.gu.uwa.edu.au";
  int	giDispensePort = 11020;
+ int	giDispenseServerSet = 0; // True if set by command line
+ int	giDispensePortSet = 0; // True if set by command line
 
 tItem	*gaItems;
  int	giNumItems;
@@ -149,6 +154,8 @@ void ShowUsage(void)
 			"    -m <min balance>\n"
 			"    -M <max balance>\n"
 			"        Set the Maximum/Minimum balances shown in `dispense acct`\n"
+			"    -f <configfile>\n"
+			"        Set the config file path (default: `/etc/opendispense/client.conf'\n"
 			"Definitions:\n"
 			"    <itemid>\n"
 			"        Item ID of the form <type>:<num> where <type> is a non-empty string of alpha-numeric characters, and <num> is a non-negative integer\n"
@@ -604,6 +611,18 @@ int main(int argc, char *argv[])
 	if( ret )
 		return ret;
 
+	// Load config file
+	Config_ParseFile(gsConfigFile);
+
+	// Parse config values
+	if (!giDispenseServerSet) {
+		gsDispenseServer	= Config_GetValue("dispense_server",0);
+	}
+	if (!giDispensePortSet) {
+		giDispensePort		= Config_GetValue_Int("dispense_port",0);
+	}
+
+
 	// Sub-commands
 	if( strcmp(gsTextArgs[0], "finger") == 0 ) {
 		return subcommand_finger();
@@ -865,6 +884,15 @@ int ParseArguments(int argc, char *argv[])
 				giMaximumBalance = atoi(argv[++i]);
 				break;
 			
+			case 'f':	// Override Config File
+				if( i + 1 >= argc ) {
+					fprintf(stderr, "%s: -f takes an argument\n", argv[0]);
+					ShowUsage();
+					return RV_ARGUMENTS;
+				}
+				gsConfigFile = argv[++i];
+				break;
+			
 			case 'u':	// Override User
 				if( i + 1 >= argc ) {
 					fprintf(stderr, "%s: -u takes an argument\n", argv[0]);
@@ -881,6 +909,7 @@ int ParseArguments(int argc, char *argv[])
 					return RV_ARGUMENTS;
 				}
 				gsDispenseServer = argv[++i];
+				giDispenseServerSet = 1;
 				break;
 			case 'P':	// Override remote port
 				if( i + 1 >= argc ) {
@@ -889,6 +918,7 @@ int ParseArguments(int argc, char *argv[])
 					return RV_ARGUMENTS;
 				}
 				giDispensePort = atoi(argv[++i]);
+				giDispensePortSet = 1;
 				break;
 			
 			// Set slot name/price