public MessagePasser(String configuration_filename, String local_name){
		//parse configuration_filename and setup sockets for communicating with all processes
		//      listed in the configuration section of the file
		//initialize buffers to hold incoming and outgoing messages to the rest of the nodes in the system
		//     (may need additional state? threads?)
		incoming_buffer = new LinkedList<TimeStampedMessage>();
		outgoing_buffer = new LinkedList<TimeStampedMessage>();
		//receivedMsgSet = new HashSet<TimeStampedMessage>();
		holdbackQueue = new ArrayList<TimeStampedMessage>();
		//mySentMsgs = new ArrayList<TimeStampedMessage>();
		
		sendRules = new ArrayList<Rule>();
		receiveRules = new ArrayList<Rule>();

		yaml = new Yaml();
		
		//get a hold on the clock type
		clock = (VectorClock) MessagePasserTester.getClock();
		clockType = MessagePasserTester.getClockType();
		
		voted = false;
		state = "RELEASED";
		sentMsgCount = 0;
		receivedMsgCount = 0;
		countLock = new ReentrantLock();
		
		try { 
			//try opening the configuration_filename
			File config_file = new File(configuration_filename);
			InputStream input = new FileInputStream(config_file);
			//the keySet is [configuration, sendRules, receiveRules] for the configuration_filename map
			config_parsing = (Map<String, Object>) yaml.load(input);
			last_modified = 0; //we don't want this to be the real time so we can update Rules initially
			config_filename = configuration_filename;
			users = new ArrayList<User>();
			nodes = new HashMap<String, Socket>();
			groups = new HashMap<String, Group>();
			
			//for each key, get a list corresponding to each '-' under the header's name + :
			//	  Just need to deal with the configuration list here though
			for(Object config_item : (ArrayList<Object>) config_parsing.get("configuration")){
				//each config_item is a mapping of name, ip, and port
				Map<String, Object> connection_info = (Map<String, Object>) config_item;
				if(((String)connection_info.get("name")).equals(local_name)){
					//this connection info is the local host, so it should be listening, not making a connection
					//      spin off a thread that will act as a server listening for incoming connections
					local_port = (Integer)connection_info.get("port");
					local_user = new User(local_name,InetAddress.getByName((String)connection_info.get("ip")),local_port );
					Thread local = new Thread(new LocalServer());
					local.start();
				}
				else{
					//Add this connection (name, ip, port) to a global list of all possible connections
					User currentUser = new User((String)connection_info.get("name"),InetAddress.getByName((String)connection_info.get("ip")), (Integer)connection_info.get("port"));
					users.add(currentUser);
					if(clockType.equals("vector")){
						if(!currentUser.getName().equals("logger")) //Don't add "logger" to our vector clock!
							((VectorClock)clock).setTimeStamp(currentUser.getName(), 0);
					}
				}
				//System.out.println(connection_info);
			}
			//update the groups
			for(Object group_item : (ArrayList<Object>) config_parsing.get("groups")){
				//each group_item is a mapping of group and a list of names
				Map<String, Object> group_info = (Map<String, Object>) group_item;
				Group currGroup = new Group((String)group_info.get("name"));
				ArrayList<String> group_names = (ArrayList<String>)group_info.get("members");
				for(String currName : group_names){
					currGroup.addToGroup(currName);
				}
				currGroup.createGroupTS();
				groups.put((String)group_info.get("name"), currGroup);
			}
			//Now that the groups have been created, we can spin off our timeout/liveness thread
			Thread liveness = new Thread(new livenessMultiCast());
			liveness.start();
			//System.out.println(users);
			updateRules(configuration_filename);
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			System.out.println("Could not open file: " + configuration_filename);
			System.exit(0);
		}  catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}