public static boolean buildInstance(String account, String name) {
        
        //Clear progress (partially redundant)
        GlobalDialogs.setProgressCaption("Initializing...");
        GlobalDialogs.setProgressValue(0);
        
        //Mark instance as incomplete
        Logger.info("Instances.buildInstance", "Updating instance status as 'incomplete'...");
        setInstanceIncomplete(account, name);
        
        String instancePath = "./users/" + account + "/" + name;
        
        //Load instance config
        Logger.info("Instances.buildInstance", "Loading instance config...");
        JSONObject instanceConfig;
        try {
            instanceConfig = Util.readJSONFile(instancePath + "/instance.json");
        } catch (IOException ex) {
            Logger.error("Instances.buildInstance", "Failed to read instance.json!", true, ex);
            GlobalDialogs.showNotification("Failed to load instance!");
            return false;
        }
        
        //Load pack config
        Logger.info("Instances.buildInstance", "Loading pack config...");
        JSONObject packConfig;
        try {
            packConfig = Util.readJSONFile("./packs/" + instanceConfig.get("pack").toString() + "/pack.json");
        } catch (IOException ex) {
            Logger.error("Instances.buildInstance", "Failed to read pack.json!", true, ex);
            GlobalDialogs.showNotification("Failed to load modpack!");
            return false;
        }
        
        //Announce installation queue build
        GlobalDialogs.setProgressCaption("Building installation queue...");
        GlobalDialogs.setProgressValue(0);
        
        //Get entries queued for installation
        Logger.info("Instances.buildInstance", "Building installation queue...");
        List<String> installationQueue = getInstallationQueue(packConfig, instanceConfig.get("version").toString());
        
        //Announce settings being loaded
        GlobalDialogs.setProgressCaption("Loading settings...");
        GlobalDialogs.setProgressValue(0);
        
        //Set mod list settings
        Logger.info("Instances.buildInstance", "Adding mods to installation queue setting...");
        for (String mod : installationQueue) {
            Variables.setSetting("mods.Installed", mod);
        }
        
        //Set APPDATA setting
        Variables.setSetting("launch.AppDataDirectory", Util.getFullPath(instancePath));
        
        //Set all other settings
        Logger.info("Instances.buildInstance", "Loading settings...");
        loadPackSettings(packConfig, installationQueue);
        
        //Create .minecraft directory
        Util.createDirectoryIfNeeded(instancePath + "/.minecraft");
        
        //Install cache entries
        for (String entry : installationQueue) {
            //Announce entry
            GlobalDialogs.setProgressCaption("Installing entry '" + entry.split("-")[0] + "'...");
            
            //Install entry
            Logger.info("Instances.buildInstance", "Installing entry '" + entry.split("-")[0] + "'...");
            installCacheEntry(entry.split("-")[0], entry.split("-")[1], "./packs/" + instanceConfig.get("pack").toString() + "/cache", "./users/" + account + "/" + name + "/.minecraft");
            
            //Update progress
            GlobalDialogs.incrementProgressValue(100 / installationQueue.size());
        }
        
        //Announce Minecraft installation
        GlobalDialogs.setProgressCaption("Obtaining Minecraft jarfile...");
        GlobalDialogs.setProgressValue(10);
        
        //Install Minecraft jarfile
        Logger.info("Instances.buildInstance", "Obtaining Minecraft jarfile...");
        String mcVersion = packConfig.get("minecraftversion").toString();
        Util.createDirectoryIfNeeded(instancePath + "/.minecraft/versions/" + mcVersion);
        Util.createDirectoryIfNeeded("./data/versions");
        if (!(new File("./data/versions/" + mcVersion + ".jar").isFile())) {
            //Download file
            Logger.info("Instances.buildInstance", "Version not found!  Will download...");
            try {
                FileUtils.copyURLToFile(new URL("http://s3.amazonaws.com/Minecraft.Download/versions/" + mcVersion + "/" + mcVersion + ".jar"), new File("./data/versions/" + mcVersion + ".jar"));
            } catch (IOException ex) {
                Logger.error("Modpack.build", "Failed to download Minecraft jarfile!", true, ex);
                GlobalDialogs.showNotification("Failed to get required Minecraft version!");
                return false;
            }
            
            //Update progress
            GlobalDialogs.setProgressValue(50);
        }
        Logger.info("Instances.buildInstance", "Copying Minecraft jarfile...");
        try {
            FileUtils.copyFile(new File("./data/versions/" + mcVersion + ".jar"), new File(instancePath + "/.minecraft/versions/" + mcVersion + "/" + mcVersion + ".jar"));
        } catch (IOException ex) {
            Logger.error("Modpack.build", "Failed to copy Minecraft jarfile!", true, ex);
            GlobalDialogs.showNotification("Failed to install Minecraft jarfile!");
            return false;
        }
        
        //Announce Minecraft asset installation
        GlobalDialogs.setProgressCaption("Obtaining Minecraft assets...");
        GlobalDialogs.setProgressIndeterminate(true);
        
        Logger.info("Instances.buildInstance", "Copying Minecraft assets...");
        try {
            FileUtils.copyDirectory(new File("./data/assets/legacy"), new File(instancePath + "/.minecraft/assets"));
        } catch (IOException ex) {
            Logger.error("Modpack.build", "Failed to copy Minecraft assets!", false, ex);
        }
        
        //Update progress
        GlobalDialogs.setProgressIndeterminate(false);
        GlobalDialogs.setProgressCaption("Finishing up...");
        GlobalDialogs.setProgressValue(100);
        
        //Set instance complete
        Logger.info("Instances.buildInstance", "Updating instance status as 'complete'...");
        setInstanceComplete(account, name);
        
        return true;
    }