diff --git a/unix/vncviewer/ServerDialog.h b/unix/vncviewer/ServerDialog.h
new file mode 100644
index 0000000..f6980dc
--- /dev/null
+++ b/unix/vncviewer/ServerDialog.h
@@ -0,0 +1,91 @@
+/* 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.
+ */
+//
+// ServerDialog.h
+//
+
+#ifndef __SERVERDIALOG_H__
+#define __SERVERDIALOG_H__
+
+#include "TXDialog.h"
+#include "TXLabel.h"
+#include "TXEntry.h"
+#include "TXButton.h"
+#include "OptionsDialog.h"
+#include "AboutDialog.h"
+
+class ServerDialog : public TXDialog, public TXEntryCallback,
+                     public TXButtonCallback {
+public:
+  ServerDialog(Display* dpy, OptionsDialog* options_, AboutDialog* about_)
+    : TXDialog(dpy, 355, 120, _("VNC Viewer: Connection Details"), true),
+      label(dpy, _("VNC server:"), this, 100),
+      entry(dpy, this, this, false, 180),
+      aboutButton(dpy, _("About..."), this, this, 70),
+      optionsButton(dpy, _("Options..."), this, this, 70),
+      okButton(dpy, _("OK"), this, this, 70),
+      cancelButton(dpy, _("Cancel"), this, this, 70),
+      options(options_), about(about_)
+  {
+    label.move(0, 30);
+    entry.move(label.width(), 28);
+    int x = width();
+    int y = height() - yPad*4 - cancelButton.height();
+    x -= cancelButton.width() + xPad*4;
+    cancelButton.move(x, y);
+    x -= okButton.width() + xPad*4;
+    okButton.move(x, y);
+    x -= optionsButton.width() + xPad*4;
+    optionsButton.move(x, y);
+    x -= aboutButton.width() + xPad*4;
+    aboutButton.move(x, y);
+  }
+
+  virtual void takeFocus(Time time) {
+    XSetInputFocus(dpy, entry.win(), RevertToParent, time);
+  }
+
+  virtual void entryCallback(TXEntry* e, Detail detail, Time time) {
+    if (detail == ENTER) {
+      ok = true;
+      done = true;
+    }
+  }
+
+  virtual void buttonActivate(TXButton* b) {
+    if (b == &okButton) {
+      ok = true;
+      done = true;
+    } else if (b == &cancelButton) {
+      ok = false;
+      done = true;
+    } else if (b == &optionsButton) {
+      options->show();
+    } else if (b == &aboutButton) {
+      about->show();
+    }
+  }
+
+  TXLabel label;
+  TXEntry entry;
+  TXButton aboutButton, optionsButton, okButton, cancelButton;
+  OptionsDialog* options;
+  AboutDialog* about;
+};
+
+#endif
