diff --git a/java/src/com/tigervnc/vncviewer/Dialog.java b/java/src/com/tigervnc/vncviewer/Dialog.java
new file mode 100644
index 0000000..ba06b54
--- /dev/null
+++ b/java/src/com/tigervnc/vncviewer/Dialog.java
@@ -0,0 +1,80 @@
+/* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+ * 
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this software; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
+ * USA.
+ */
+//
+// This Dialog class implements a pop-up dialog.  This is needed because
+// apparently you can't use the standard AWT Dialog from within an applet.  The
+// dialog can be made visible by calling its showDialog() method.  Dialogs can
+// be modal or non-modal.  For a modal dialog box, the showDialog() method must
+// be called from a thread other than the GUI thread, and it only returns when
+// the dialog box has been dismissed.  For a non-modal dialog box, the
+// showDialog() method returns immediately.
+
+package com.tigervnc.vncviewer;
+
+import java.awt.*;
+
+class Dialog extends Frame {
+
+  public Dialog(boolean modal_) { modal = modal_; }
+
+  public boolean showDialog() {
+    ok = false;
+    done = false;
+    initDialog();
+    Dimension dpySize = getToolkit().getScreenSize();
+    Dimension mySize = getSize();
+    int x = (dpySize.width - mySize.width) / 2;
+    int y = (dpySize.height - mySize.height) / 2;
+    setLocation(x, y);
+    show();
+    if (!modal) return true;
+    synchronized(this) {
+      try {
+        while (!done)
+          wait();
+      } catch (InterruptedException e) {
+      }
+    }
+    return ok;
+  }
+
+  public void endDialog() {
+    done = true;
+    hide();
+    if (modal) {
+      synchronized (this) {
+        notify();
+      }
+    }
+  }
+
+  // initDialog() can be overridden in a derived class.  Typically it is used
+  // to make sure that checkboxes have the right state, etc.
+  public void initDialog() {}
+
+  public boolean handleEvent(Event event) {
+    if (event.id == Event.WINDOW_DESTROY) {
+      ok = false;
+      endDialog();
+    }   
+    return super.handleEvent(event);
+  }
+
+  protected boolean ok, done;
+  boolean modal;
+}
diff --git a/java/src/com/tigervnc/vncviewer/Makefile b/java/src/com/tigervnc/vncviewer/Makefile
index 46752ab..0dba158 100644
--- a/java/src/com/tigervnc/vncviewer/Makefile
+++ b/java/src/com/tigervnc/vncviewer/Makefile
@@ -18,7 +18,8 @@
 	  RecordingFrame.class SessionRecorder.class \
 	  SocketFactory.class HTTPConnectSocketFactory.class \
 	  HTTPConnectSocket.class ReloginPanel.class \
-	  InStream.class MemInStream.class ZlibInStream.class
+	  InStream.class MemInStream.class ZlibInStream.class \
+	  Dialog.class MessageBox.class
 
 SOURCES = VncViewer.java RfbProto.java AuthPanel.java VncCanvas.java \
 	  VncCanvas2.java \
@@ -27,7 +28,8 @@
 	  RecordingFrame.java SessionRecorder.java \
 	  SocketFactory.java HTTPConnectSocketFactory.java \
 	  HTTPConnectSocket.java ReloginPanel.java \
-	  InStream.java MemInStream.java ZlibInStream.java
+	  InStream.java MemInStream.java ZlibInStream.java \
+	  Dialog.java MessageBox.java
 
 all: $(CLASSES) $(ARCHIVE)
 
diff --git a/java/src/com/tigervnc/vncviewer/MessageBox.java b/java/src/com/tigervnc/vncviewer/MessageBox.java
new file mode 100644
index 0000000..123a970
--- /dev/null
+++ b/java/src/com/tigervnc/vncviewer/MessageBox.java
@@ -0,0 +1,82 @@
+/* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+ * 
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this software; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
+ * USA.
+ */
+
+package com.tigervnc.vncviewer;
+
+import java.awt.*;
+
+public class MessageBox extends com.tigervnc.vncviewer.Dialog {
+
+  public static final int MB_OK = 0;
+  public static final int MB_OKAYCANCEL = 1;
+  public static final int MB_YESNO = 2;
+
+  public MessageBox(String msg, int flags) {
+    super(true);
+    GridLayout g = new GridLayout(0,1);
+    setLayout(g);
+    while (true) {
+      int i = msg.indexOf('\n');
+      int j = (i==-1) ? msg.length() : i;
+      add(new Label(msg.substring(0, j)));
+      if (i==-1) break;
+      msg = msg.substring(j+1);
+    }
+    Panel p2 = new Panel();
+    switch (flags & 3) {
+    case MB_OKAYCANCEL:
+      cancelButton = new Button("Cancel");
+      // No break
+    case MB_OK:
+      okButton = new Button("OK");
+      break;
+    case MB_YESNO:
+      okButton = new Button("Yes");
+      cancelButton = new Button("No");
+      break;
+    }
+    if (okButton != null) p2.add(okButton);
+    if (cancelButton != null) p2.add(cancelButton);
+    add("South", p2);
+    pack();
+    showDialog();
+  }
+
+  public MessageBox(String msg) {
+    this(msg, MB_OK);
+  }
+
+
+  public boolean action(Event event, Object arg) {
+    if (event.target == okButton) {
+      ok = true;
+      endDialog();
+    } else if (event.target == cancelButton) {
+      ok = false;
+      endDialog();
+    }
+    return true;
+  }
+
+  Button okButton, cancelButton;
+
+  public boolean result() {
+    return ok;
+  }
+
+}
