public void Start() {
		if (Running)
			return;
		Running = true;
		BanHandler.init();
		es = new EventSystem(this);
		startLogger();
		Log("Starting..");
		ch = new CommandHandler(this);
		Group.Load(this);
		p = Properties.init(this);
		loadSystemProperties();
		pm = new PacketManager(this);
		pm.StartReading();
		Log("Loading main level..");
		lm = new LevelHandler(this);
		if (!new File(getSystemProperties().getValue("MainLevel")).exists()) {
			Level l = new Level((short)64, (short)64, (short)64);
			l.name = "Main";
			l.FlatGrass(this);
			try {
				l.Save();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		MainLevel = lm.loadLevel(getSystemProperties().getValue("MainLevel"));
		lm.loadLevels();
		tick.start();
		Log("Done!");
		Log("Generating salt");
		SecureRandom sr = null;
		try {
			sr = SecureRandom.getInstance("SHA1PRNG");
		} catch (NoSuchAlgorithmException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		for (int i = 0; i < 100; i++) {
			byte[] seedb = new byte[16];
			sr.nextBytes(seedb);
			Salt = new sun.misc.BASE64Encoder().encode(seedb).replace("=", "" + ((Salt != null) ? Salt.toCharArray()[0] : "A"));
			if (new Random().nextDouble() < .3)
				break;
		}
		Salt = LetterOrNumber(Salt);
		Log("SALT: " + Salt);
		Log("Setting up SQL");
		sql.Connect(this);
		final String[] commands = new String[] {
				"CREATE TABLE if not exists " + sql.getPrefix() + "_extra (name VARCHAR(20), setting TEXT, value TEXT);",
		};
		sql.ExecuteQuery(commands);
		Log("Done!");
		Log("Create heartbeat..");
		heartbeater = new Beat(this);
		heartbeater.addHeart(new MBeat());
		heartbeater.addHeart(new WBeat());
		heartbeater.start();
		Log("Done!");
		ph = new PluginHandler();
		ph.loadplugins(this);
		try {
			addCommands();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}