private static String[] buildDependencyTree() {
    //      ensure, that the class loader has all relevant classes loaded
    BasicAromaticityTyper.instance();
    BasicArrayHelper.instance();
    AtomPairTypeHolder.instance();
    BasicAtomTypeConversionHolder.instance();
    BasicAtomTyper.instance();
    BasicBatchScriptReplacer.instance();
    BibitemHolder.instance();

    // DatabaseConnection.instance();
    DecimalFormatHelper.instance();
    BasicElementHolder.instance();
    ExternalFactory.instance();
    FeatureFactory.instance();
    FeatureHelper.instance();
    BasicBatchFileUtilities.instance();
    FilterFactory.instance();

    //        try
    //        {
    //            GhemicalInterface.instance();
    //        }
    //        catch(Exception e){
    //
    //        }
    BasicGroupContributionHolder.instance();
    BasicIOTypeHolder.instance();
    BasicIsotopeHolder.instance();
    HelperMethods.instance();
    BasicLineArrayHelper.instance();
    BasicLineMatrixHelper.instance();
    BasicMatrixHelper.instance();

    // Avoid an instance, because this will add a X-server dependency for linux systems
    // Mol2Image.instance();
    // Avoid an instance, because this will add a X-server dependency for linux systems
    // MolFileChooser.instance();

    try {
      BasicMoleculeCacheHolder.instance();
    } catch (Exception e1) {
      // TODO Auto-generated catch block
      e1.printStackTrace();
    }

    ProcessFactory.instance();
    BasicPropertyHolder.instance();
    BasicProtonationModel.instance();
    BasicResidueData.instance();
    BasicResourceLoader.instance();
    ResultFactory.instance();
    BasicRotorRulesHolder.instance();
    // Viewer.instance();

    // show all loaded classes in the class loader
    final ClassLoader[] loaders = ClassScope.getCallerClassLoaderTree();
    final Class[] classes = ClassScope.getLoadedClasses(loaders);
    String[] cnames = new String[classes.length];
    Vector<String> results = new Vector<String>(classes.length);
    StringBuffer buffer;
    dependencyVersionHash = new Hashtable<String, int[]>(classes.length);

    for (int c = 0; c < classes.length; c++) {
      buffer = new StringBuffer(300);
      cnames[c] = classes[c].getName();
      // System.out.println ("[" + classes[c].getName () + "]:");
      // System.out.println (" loaded by [" + classes[c].getClassLoader
      // ().getClass ().getName () + "]");
      // System.out.println (" from [" + ClassScope.getClassLocation
      // (classes[c])
      // + "]");

      recurseInto(classes[c], buffer, 0, results);
    }

    String[] resultsArr = new String[results.size()];

    for (int i = 0; i < resultsArr.length; i++) {
      resultsArr[i] = results.get(i);
    }

    return resultsArr;
  }
  public String[] getKernelTitles() {
    if (titles == null) {
      // guarantee that all chemistry kernels are initialized
      IdentifierSoftDefaultSystem hybTyper = BasicHybridisationTyper.instance();
      hybTyper.init();

      IdentifierSoftDefaultSystem impValTyper = BasicImplicitValenceTyper.instance();
      impValTyper.init();

      IdentifierSoftDefaultSystem aromaticTyper = BasicAromaticityTyper.instance();
      aromaticTyper.init();

      IdentifierSoftDefaultSystem atomTyper = BasicAtomTyper.instance();
      atomTyper.init();

      IdentifierSoftDefaultSystem element = BasicElementHolder.instance();
      element.init();

      IdentifierSoftDefaultSystem gc = BasicGroupContributionHolder.instance();
      gc.init();

      IdentifierSoftDefaultSystem isotope = BasicIsotopeHolder.instance();
      isotope.init();

      IdentifierSoftDefaultSystem phModel = BasicProtonationModel.instance();
      phModel.init();

      IdentifierSoftDefaultSystem residue = BasicResidueData.instance();
      residue.init();

      IdentifierSoftDefaultSystem typeTable = BasicAtomTypeConversionHolder.instance();
      typeTable.init();

      titles = new String[20];

      String kernelType = CML_SOFT_KERNEL + ":";
      titles[0] = kernelType + aromaticTyper.getClass().getName();
      titles[1] = kernelType + atomTyper.getClass().getName();
      titles[2] = kernelType + element.getClass().getName();
      titles[3] = kernelType + gc.getClass().getName();
      titles[4] = kernelType + isotope.getClass().getName();
      titles[5] = kernelType + phModel.getClass().getName();
      titles[6] = kernelType + typeTable.getClass().getName();
      titles[7] = kernelType + residue.getClass().getName();
      titles[8] = kernelType + impValTyper.getClass().getName();
      titles[9] = kernelType + hybTyper.getClass().getName();
      kernelType = CML_HARD_KERNEL + ":";
      titles[10] = kernelType + aromaticTyper.getClass().getName();
      titles[11] = kernelType + atomTyper.getClass().getName();
      titles[12] = kernelType + element.getClass().getName();
      titles[13] = kernelType + gc.getClass().getName();
      titles[14] = kernelType + isotope.getClass().getName();
      titles[15] = kernelType + phModel.getClass().getName();
      titles[16] = kernelType + typeTable.getClass().getName();
      titles[17] = kernelType + residue.getClass().getName();
      titles[18] = kernelType + impValTyper.getClass().getName();
      titles[19] = kernelType + hybTyper.getClass().getName();
    }

    return titles;
  }