private void install() {
        final ProgressMonitor monitor = new ProgressMonitor(this, "Installing", null, 0, 1);
        monitor.setMillisToPopup(0);
        monitor.setMillisToDecideToPopup(0);

        final Installer installer = new Installer(new DialogInstallAdapter(this, "Installing") {

            @Override
            public File downloadManually(final String url, final String fileName) throws IOException, InvocationTargetException, InterruptedException {
                final Out<File> result = new Out<File>();
                final Out<IOException> exceptionOut = new Out<IOException>();
                final Out<Boolean> success = new Out<Boolean>(false);
                SwingUtilities.invokeAndWait(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            while(true) {
                                Desktop.getDesktop().browse(URI.create(url));
                                JOptionPane.showMessageDialog(InstallerWindow.this, fileName + " needs to be manually downloaded. A browser window just opened, please download the file and select it afterwords in the file browser.");

                                JFileChooser c = new JFileChooser();
                                for(FileFilter f : c.getChoosableFileFilters())
                                    c.removeChoosableFileFilter(f);

                                c.addChoosableFileFilter(new FileFilter() {
                                    @Override
                                    public boolean accept(File f) {
                                        return f.isDirectory() || f.getPath().endsWith(fileName);
                                    }

                                    @Override
                                    public String getDescription() {
                                        return fileName;
                                    }
                                });

                                //c.setSelectedFile(new File(fileName));
                                c.setDialogTitle("Select downloaded file");
                                c.grabFocus();
                                int retVal = c.showOpenDialog(InstallerWindow.this);
                                if(retVal == JFileChooser.APPROVE_OPTION) {
                                    File f = c.getSelectedFile();
                                    if(f.exists()) {
                                        result.setValue(f);
                                        success.setValue(true);
                                        return;
                                    }
                                    else {
                                        JOptionPane.showMessageDialog(InstallerWindow.this, "Non-existing file selected. Retrying.");
                                    }
                                }
                            }
                        } catch (IOException e) {
                            exceptionOut.setValue(e);
                            return;
                        }
                    }
                });
                if(success.getValue())
                    return result.getValue();

                throw exceptionOut.getValue();
            }
        });

        new Thread() {
            @Override
            public void run() {
                try {
                    installer.install(_mod, false, _version, _preview);
                    monitor.close();
                    JOptionPane.showMessageDialog(InstallerWindow.this, "Installation completed successfully", "Completed", JOptionPane.INFORMATION_MESSAGE);
                } catch (IOException | ClassNotFoundException | NoSuchMethodException | InvocationTargetException | IllegalAccessException | InterruptedException e) {
                    e.printStackTrace();
                }
                monitor.close();
                InstallerWindow.this.dispose();
            }
        }.start();
    }