public boolean registerCommand(final Addon addon, final AddonCommand command){
		try {
			if(this.bukkitCommandMap == null){
				final Field f = this.getServer().getClass().getDeclaredField("commandMap");
				f.setAccessible(true);
				this.bukkitCommandMap = (CommandMap) f.get(this.getServer());
			}
			if(this.knownCommands == null){
				final Field f = this.bukkitCommandMap.getClass().getDeclaredField("knownCommands");
				f.setAccessible(true);
				this.knownCommands = (Map<String, Command>) f.get(this.bukkitCommandMap);
			}
			if(this.aliases == null){
				final Field f = this.bukkitCommandMap.getClass().getDeclaredField("aliases");
				f.setAccessible(true);
				this.aliases = (Set<String>) f.get(this.bukkitCommandMap);
			}
			final String fallbackPrefix = command.getFallbackPrefix();
			if((fallbackPrefix == null) || fallbackPrefix.isEmpty())
				throw new IllegalArgumentException("Addon "+addon.getName()+" tried to register a command with a null or empty fallback prefix!");
			final ReloadableAddon reloadable = this.getByAddon(addon);
			if(reloadable == null)
				throw new InvalidAddonException("No corresponding ReloadableAddon found for "+addon.getName());
			reloadable.addCommand(command);
			return this.bukkitCommandMap.register(fallbackPrefix == null ? "":fallbackPrefix, command);
		} catch (final Exception e) {
			this.getLogger().severe("Failed to register command "+command.getName()+" for addon "+addon.getName());
			e.printStackTrace();
		}
		return true;
	}