private void initTray() throws Exception {
    tray = SystemTray.getSystemTray();

    PopupMenu m = new PopupMenu();
    Font f = new Font("Tahoma", 0, 11);
    m.setFont(f);

    MenuItem mi = new MenuItem(Language.getLocalizedString(getClass(), "menuopen"));
    mi.setFont(f);
    mi.setFont(
        new Font(
            mi.getFont().getName(), mi.getFont().getStyle() | Font.BOLD, mi.getFont().getSize()));
    mi.addActionListener(
        new ActionListener() {

          @Override
          public void actionPerformed(ActionEvent e) {
            openUI();
          }
        });
    m.add(mi);

    m.addSeparator();

    mi = new MenuItem(Language.getLocalizedString(getClass(), "menuunload"));
    mi.setFont(f);
    mi.addActionListener(
        new ActionListener() {

          @Override
          public void actionPerformed(ActionEvent e) {
            unloadUI();
          }
        });
    m.add(mi);

    m.addSeparator();

    mi = new MenuItem(Language.getLocalizedString(getClass(), "menuexit"));
    mi.setFont(f);
    mi.addActionListener(
        new ActionListener() {

          @Override
          public void actionPerformed(ActionEvent e) {
            shutdown();
          }
        });
    m.add(mi);

    Toolkit.getDefaultToolkit().getSystemEventQueue().push(new PopupFixQueue(m));

    int[] imageSizes = {16, 24, 32, 48, 64, 128};
    for (int size : imageSizes) {
      if (size - tray.getTrayIconSize().getWidth() < 0) {
        continue;
      } else {
        ti =
            new TrayIcon(
                Toolkit.getDefaultToolkit()
                    .getImage(rl.getResource("gfx/icons/alliance" + size + ".png")),
                "Alliance",
                m);
        break;
      }
    }

    ti.setImageAutoSize(true);

    ti.addActionListener(
        new ActionListener() {

          @Override
          public void actionPerformed(ActionEvent e) {
            openUI();
          }
        });

    tray.add(ti);

    ti.addActionListener(
        new ActionListener() {

          private long lastClickAt;

          @Override
          public void actionPerformed(ActionEvent e) {
            if (System.currentTimeMillis() - lastClickAt < 1000) {
              openUI();
            }
            lastClickAt = System.currentTimeMillis();
          }
        });

    // Update tooltip periodically with current transfer rates
    Thread t =
        new Thread(
            new Runnable() {

              @Override
              public void run() {
                try {
                  while (true) {
                    ti.setToolTip(
                        "Alliance v"
                            + Version.VERSION
                            + " build "
                            + Version.BUILD_NUMBER
                            + "\nDownload: "
                            + core.getNetworkManager().getBandwidthIn().getCPSHumanReadable()
                            + "\nUpload: "
                            + core.getNetworkManager().getBandwidthOut().getCPSHumanReadable()
                            + "\nOnline: "
                            + core.getFriendManager().getNFriendsConnected()
                            + "/"
                            + core.getFriendManager().getNFriends()
                            + " ("
                            + TextUtils.formatByteSize(
                                core.getFriendManager().getTotalBytesShared())
                            + ")");
                    Thread.sleep(5000);
                  }
                } catch (InterruptedException e) {
                } catch (NullPointerException e) {
                }
              }
            });
    t.setDaemon(true);
    t.start();
  }