private void setupFreeAlgebraPanel() {
    final SmallAlgebra alg = uacalc.getCurrentAlgebra();
    if (alg == null) {
      JOptionPane.showMessageDialog(
          this,
          "<html>You must have an algebra loaded.<br>"
              + "Use the file menu or make a new one.</html>",
          "No algebra error",
          JOptionPane.ERROR_MESSAGE);
      return;
    }
    final int gens = getFreeGensDialog();
    if (!(gens > 0)) return;
    System.out.println("gens = " + gens);
    final boolean thin = getThinGens();
    final ProgressReport report = new ProgressReport(monitorPanel);
    monitorPanel.setProgressReport(report);
    final BackgroundTask<FreeAlgebra> freeAlgTask =
        new BackgroundTask<FreeAlgebra>(report) {
          public FreeAlgebra compute() {
            // monitorPanel.getProgressMonitor().reset();
            report.setDescription("F(" + gens + ") over " + alg.getName());
            FreeAlgebra freeAlg =
                new FreeAlgebra(uacalc.getCurrentAlgebra(), gens, true, thin, report);
            return freeAlg;
          }

          public void onCompletion(
              FreeAlgebra fr, Throwable exception, boolean cancelled, boolean outOfMemory) {
            // System.out.println("got to completion");
            // System.out.println("thrown = " + exception);
            // for (BackgroundTask task : monitorPanel.getTaskList()) {
            //  System.out.println("task: " + task.getStatus());
            // }
            if (outOfMemory) {
              // monitorPanel.getProgressMonitor().reset();
              report.addEndingLine("Out of memory!!!");
              // monitorPanel.getProgressModel().printlnToLog("Not enough memory");

              return;
            }
            if (!cancelled) {
              TermTablePanel ttp = new TermTablePanel(uacalc, fr.getTerms(), fr.getVariables());
              setTermTablePanel(ttp);
            } else {
              // monitorPanel.getProgressMonitor().reset();
              // monitorPanel.getProgressModel().printlnToLog("computation cancelled");
              report.addEndingLine("Computation cancelled");
            }
          }
        };
    monitorPanel.addTask(freeAlgTask);
    BackgroundExec.getBackgroundExec().execute(freeAlgTask);
  }