diff --git a/java/com/tigervnc/network/SocketDescriptor.java b/java/com/tigervnc/network/SocketDescriptor.java
index eb2679d..3517a99 100644
--- a/java/com/tigervnc/network/SocketDescriptor.java
+++ b/java/com/tigervnc/network/SocketDescriptor.java
@@ -29,11 +29,10 @@
 
 import com.tigervnc.rdr.Exception;
 
-public class SocketDescriptor extends SocketChannel 
-                              implements FileDescriptor {
+public class SocketDescriptor implements FileDescriptor {
 
   public SocketDescriptor() throws Exception {
-    super(DefaultSelectorProvider());
+    DefaultSelectorProvider();
     try {
       channel = SocketChannel.open();
       channel.configureBlocking(false);
@@ -50,6 +49,14 @@
     }
   }
 
+  public void close() throws IOException {
+    try {
+      channel.close();
+    } catch(IOException e) {
+      throw new IOException(e.toString());
+    }
+  }
+
   private static SelectorProvider DefaultSelectorProvider() {
     // kqueue() selector provider on OS X is not working, fall back to select() for now
     String os = System.getProperty("os.name");
@@ -165,6 +172,18 @@
   public java.net.Socket socket() {
     return channel.socket();
   }
+ 
+  public SocketAddress getRemoteAddress() throws IOException {
+    if (isConnected())
+      return channel.socket().getRemoteSocketAddress();
+    return null;
+  }
+
+  public SocketAddress getLocalAddress() throws IOException {
+    if (isConnected())
+      return channel.socket().getLocalSocketAddress();
+    return null;
+  }
 
   public boolean isConnectionPending() {
     return channel.isConnectionPending();
diff --git a/java/com/tigervnc/network/TcpListener.java b/java/com/tigervnc/network/TcpListener.java
index d6e92ab..959d545 100644
--- a/java/com/tigervnc/network/TcpListener.java
+++ b/java/com/tigervnc/network/TcpListener.java
@@ -118,7 +118,11 @@
     }
 
     // Disable Nagle's algorithm, to reduce latency
-    TcpSocket.enableNagles(new_sock, false);
+    try {
+      new_sock.socket().setTcpNoDelay(true);
+    } catch (java.net.SocketException e) {
+      throw new SocketException(e.toString());
+    }
 
     // Create the socket object & check connection is allowed
     SocketDescriptor fd = null;
diff --git a/java/com/tigervnc/network/TcpSocket.java b/java/com/tigervnc/network/TcpSocket.java
index c4c1a8c..ac53aaf 100644
--- a/java/com/tigervnc/network/TcpSocket.java
+++ b/java/com/tigervnc/network/TcpSocket.java
@@ -142,23 +142,32 @@
     return address+"::"+port;
   }
 
-  public boolean sameMachine() {
-    SocketAddress peeraddr = ((SocketDescriptor)getFd()).socket().getRemoteSocketAddress();
-    SocketAddress myaddr = ((SocketDescriptor)getFd()).socket().getLocalSocketAddress();
-    return myaddr.equals(peeraddr);
+  public boolean sameMachine() throws Exception {
+    try {
+      SocketAddress peeraddr = ((SocketDescriptor)getFd()).getRemoteAddress();
+      SocketAddress myaddr = ((SocketDescriptor)getFd()).getLocalAddress();
+      return myaddr.equals(peeraddr);
+    } catch (IOException e) {
+      throw new Exception(e.toString());
+    }
   }
 
-  public void shutdown() {
-    super.shutdown();
+  public void shutdown() throws Exception {
+    try {
+      close();
+      super.shutdown();
+    } catch (IOException e) {
+      throw new Exception(e.toString());
+    }
   }
   
   public void close() throws IOException {
     ((SocketDescriptor)getFd()).close();
   }
   
-  public static boolean enableNagles(SocketChannel sock, boolean enable) {
+  public static boolean enableNagles(SocketDescriptor sock, boolean enable) {
     try {
-      sock.socket().setTcpNoDelay(!enable);
+      sock.channel.socket().setTcpNoDelay(!enable);
     } catch(java.net.SocketException e) {
       vlog.error("unable to setsockopt TCP_NODELAY: "+e.getMessage());
       return false;
diff --git a/java/com/tigervnc/vncviewer/CConn.java b/java/com/tigervnc/vncviewer/CConn.java
index 736994b..2faf787 100644
--- a/java/com/tigervnc/vncviewer/CConn.java
+++ b/java/com/tigervnc/vncviewer/CConn.java
@@ -776,9 +776,8 @@
   // close() closes the socket, thus waking up the RFB thread.
   public void close() {
     shuttingDown = true;
-    sock.shutdown();
     try {
-      sock.close();
+      sock.shutdown();
     } catch (java.lang.Exception e) {
       throw new Exception(e.toString());
     }
diff --git a/java/com/tigervnc/vncviewer/F8Menu.java b/java/com/tigervnc/vncviewer/F8Menu.java
index ca09ac2..317caf3 100644
--- a/java/com/tigervnc/vncviewer/F8Menu.java
+++ b/java/com/tigervnc/vncviewer/F8Menu.java
@@ -85,7 +85,7 @@
 
   public void actionPerformed(ActionEvent ev) {
     if (actionMatch(ev, exit)) {
-      cc.close();
+      cc.deleteWindow();
     } else if (actionMatch(ev, fullScreen)) {
       cc.toggleFullScreen();
     } else if (actionMatch(ev, restore)) {
