public boolean checkAndUpdate() {

        QuarterBukkit plugin = QuarterBukkit.getPlugin();

        try {
            // ----- Version Check -----

            plugin.getLogger().info("Querying server mods api ...");

            // Get latest version
            List<ProjectFile> availableFiles = new FilesQuery(PROJECT_ID, new VersionParser() {

                @Override
                public String parseVersion(ProjectFile file) {

                    return file.getName().replace("QuarterBukkit ", "");
                }

            }).execute();
            if (availableFiles.isEmpty()) {
                // No file available
                return false;
            }

            ProjectFile latestFile = availableFiles.get(availableFiles.size() - 1);
            if (latestFile.getVersion().equals(plugin.getDescription().getVersion())) {
                // No update required (latest version already installed)
                return false;
            }

            plugin.getLogger().info("Found a new version of " + plugin.getName() + ": " + latestFile.getVersion());

            // ----- Download and Installation -----

            plugin.getLogger().info("Installing " + plugin.getName() + " " + latestFile.getVersion());

            // Variables
            File pluginsDir = plugin.getDataFolder().getParentFile();
            File pluginJar = new File(pluginsDir, File.separator + plugin.getName() + ".jar");

            // Disable plugin
            Bukkit.getPluginManager().disablePlugin(plugin);

            // Download zip
            File zip = new File(pluginsDir, latestFile.getFileName());
            FileUtils.download(latestFile.getLocation().toURL(), zip);

            // Unzip zip
            File unzipDir = new File(zip.getParent(), zip.getName() + "_extract");
            FileUtils.unzip(zip, unzipDir);
            FileUtils.delete(zip);

            // Get inner directory
            File innerUnzipDir = unzipDir.listFiles()[0];

            // Overwrite current plugin jar
            FileUtils.copy(new File(innerUnzipDir, pluginJar.getName()), pluginJar);

            // Delete temporary unzip dir
            FileUtils.delete(unzipDir);

            // Load plugin from file
            try {
                Bukkit.getPluginManager().enablePlugin(Bukkit.getPluginManager().loadPlugin(pluginJar));
            } catch (Exception e) {
                ExceptionHandler.exception(new InstallException(plugin, e, "Error while reloading the plugin with the new jar"));
                return false;
            }

            plugin.getLogger().info("Successfully updated " + plugin.getName() + " to " + latestFile.getVersion() + "!");
            return true;
        } catch (QueryException e) {
            ExceptionHandler.exception(new InstallException(plugin, e, "Error while querying the server mods api: " + e.getType()));
        } catch (IOException e) {
            ExceptionHandler.exception(new InstallException(plugin, e, "Error while doing some file operations"));
        }

        return false;
    }