public static void main(final String args[]) {
		final List packagesToSkip = Arrays.asList(new String[] {
				"com.apple.crypto",
				"com.oracle",
				"com.sun.crypto",
				"com.sun.management",
				"com.sun.net.ssl",
				"com.sun.org.apache.xml.internal.security.utils",
				"com.sun.security",
				"java",
				"javax.crypto",
				"javax.net.ssl",
				"javax.swing.text",
				"oracle",
				"org.apache.xalan.extensions",
				"sun",
				"sunw"
		});

		final JFrame frame = new JFrame();

		final JMenu themeMenu = new JMenu();
		final ButtonGroup themeMenuGroup = new ButtonGroup();
		themeMenu.setText("Themes");
		themeMenu.setMnemonic('T');
		themeMenu.setEnabled(UIManager.getLookAndFeel() instanceof MetalLookAndFeel);
		for (final Iterator it = listDescendants(MetalTheme.class, false, false, true, true, packagesToSkip).iterator(); it.hasNext(); ) {
			try {
				final Class clazz = (Class) it.next();
				final MetalTheme metalTheme = (MetalTheme) clazz.newInstance();
				final JRadioButtonMenuItem menuItem = fromMetalTheme(metalTheme, frame);
				themeMenu.add(menuItem);
				themeMenuGroup.add(menuItem);
			} catch (final InstantiationException ie) {
				// ignore
			} catch (final IllegalAccessException iae) {
				// ignore
			}
		}

		final JMenu lookAndFeelMenu = new JMenu();
		final ButtonGroup lookAndFeelMenuGroup = new ButtonGroup();
		lookAndFeelMenu.setText("Look & Feel");
		lookAndFeelMenu.setMnemonic('L');
		final SortedSet descendants = listDescendants(LookAndFeel.class, false, false, true, true, packagesToSkip);
		for (final Iterator it = descendants.iterator(); it.hasNext(); ) {
			try {
				final Class clazz = (Class) it.next();
				final JRadioButtonMenuItem menuItem = fromLookAndFeel((LookAndFeel) clazz.newInstance(), themeMenu, frame);
				lookAndFeelMenu.add(menuItem);
				lookAndFeelMenuGroup.add(menuItem);
			} catch (final InstantiationException ie) {
				// ignore
			} catch (final IllegalAccessException iae) {
				// ignore
			}
		}

		final JMenuBar menuBar = new JMenuBar();
		menuBar.add(lookAndFeelMenu);
		menuBar.add(themeMenu);

		frame.setJMenuBar(menuBar);
		frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
		frame.addWindowListener(new WindowAdapter() {
			/**
			 * @see WindowAdapter#windowClosing(WindowEvent)
			 */
			public void windowClosing(final WindowEvent e) {
				System.exit(0);
			}
		});
		frame.setTitle("System Properties");
		frame.setResizable(false);

		final JPanel contentPane = (JPanel) frame.getContentPane();
		contentPane.setLayout(new BorderLayout());
		contentPane.add(newContentPane(false));

		frame.pack();
		frame.setVisible(true);

		/*-
		 * In 1.4 and earlier versions, we have no mechanism
		 * to determine currently selected metal theme.
		 *
		 * So just select the first menu item
		 * and set the appropriate theme.
		 */
		SwingUtilities.invokeLater(new Runnable() {
			/**
			 * @see Runnable#run()
			 */
			public void run() {
				final Iterator it = Collections.list(themeMenuGroup.getElements()).iterator();
				if (it.hasNext()) {
					((AbstractButton) it.next()).doClick();
				}
			}
		});
	}