* @param arg
	 * @param client
	 */
	private void cmd_bb(final String arg, final Client client) {
		final Player player = getPlayer(client);

		// TODO fix null pointer generation which crashes this if an incorrect argument occurs

		// exit if there are no arguments at all
		if ( "".equals(arg) ) {
			send("invalid syntax. see 'help @bb'", client);
		}
		else {
			// break up argument string into individual pieces
			final String[] args = arg.split(" ");

			debug("# of args: " + args.length);

			// initialize this to the main system board
			BulletinBoard board = null; //boards.get("board");
			Integer messageNum = -1;

			// TODO change this to get the appropriate bulletin board

			// important components of argument data
			String command = "";
			String param = "";

			// @bb <command> <params>
			// args[0]: <command>
			// args[1...?]: <params>

			if (args.length >= 2) {
				command = args[0];
				param = args[1];

				int test = param.indexOf('.');

				if ( test != -1 ) {
					board = getBoard( param.substring(0, test) );
					messageNum = Utils.toInt(param.substring(test + 1, param.length()), -1);

					System.out.println("    board: " + board.getName());
					System.out.println("message #: " + messageNum);
				}
				else {
					board = getBoard(param);

					final List<String> temp = (List<String>) Arrays.asList(args);

					param = Utils.join(temp.subList(2, temp.size()), " ");
				}
			}

			debug("command: " + command);
			debug("  param: " + param);
			
			if (command.equals("+scan") | command.equals("+s")) {
				// @bb +scan board_name
				debug("bb:scan");

				final List<String> out = new LinkedList<String>();

				for (final String s : MudUtils.scan(board)) {
					out.add(s);
				}

				send(out, client);
			}
			else if (command.equals("+delete") | command.equals("+d")) {
				// @bb +delete board_name.message_num
				debug("bb:delete");

				if (messageNum > -1) {
					if (messageNum < board.getNumMessages()) { // check for valid message number
						final List<BBEntry> entries = board.getEntries();

						final BBEntry entry = entries.get(messageNum);

						// TODO equating players and their names might be bad...
						if ( entry.getAuthor().equals( player.getName() ) ) {
							debug("Removing Message...");
							board.removeEntry(messageNum);
							debug("Renumbering entries...");
							board.renumber(messageNum);
							debug("Done.");
						}
						else send("BB: You may only delete your own posts.", client);
					}
					else send("No such message", client);
				}
				else send(gameError("@bb", ErrorCodes.INVALID_SYNTAX), client); // invalid message num
			}
			else if (command.equals("+read") | command.equals("+r")) {
				// @bb +read board_name.message_num
				debug("bb:read");

				// should this be handled elsewhere (index/bounds issue)
				if (board.getNumMessages() <= 0 || messageNum >= board.getNumMessages()) {
					System.out.println("No Such Message.");
				}

				else {
					final BBEntry entry = board.getEntry(messageNum);

					if (entry != null) {
						// TODO convert to send lists or?
						client.writeln("ID: " + entry.getId());
						client.writeln("Author: " + entry.getAuthor());
						client.writeln("Subject: " + entry.getSubject());
						client.writeln("");
						client.writeln(entry.getMessage());
					}
					else send("No such entry!", client);
				}
			}
			else if (command.equals("+write") | command.equals("+w")) {
				// @bb +write board_name subject=message
				String[] entry = param.split("=");

				if (entry.length == 2) {
					final String author = player.getName();
					final String subject = entry[0];
					final String message = entry[1];

					board.write(author, subject, message);
				}
				else send(gameError("@bb", ErrorCodes.INVALID_SYNTAX), client);
			}
		}
	}