Remove.

(cherry-pick of 63744c884dd4b4f4307f2b021fb894af164972af.)

Change-Id: Ibf79a402e1bad98a262e380fcee3d35c127ae6d5
diff --git a/harmony-tests/src/test/java/org/apache/harmony/tests/java/net/HttpCookieTest.java b/harmony-tests/src/test/java/org/apache/harmony/tests/java/net/HttpCookieTest.java
index 306e697..d1cf18f 100644
--- a/harmony-tests/src/test/java/org/apache/harmony/tests/java/net/HttpCookieTest.java
+++ b/harmony-tests/src/test/java/org/apache/harmony/tests/java/net/HttpCookieTest.java
@@ -234,16 +234,6 @@
         assertFalse(cookie.getSecure());
     }
 
-    public void test_Is_SetHttpOnly() {
-        HttpCookie cookie = new HttpCookie("testName", "value");
-        assertFalse(cookie.isHttpOnly());
-
-        cookie.setHttpOnly(true);
-        assertTrue(cookie.isHttpOnly());
-        cookie.setHttpOnly(false);
-        assertFalse(cookie.isHttpOnly());
-    }
-
     /**
      * java.net.HttpCookie#getPath(), setPath(String)
      * @since 1.6
@@ -817,24 +807,20 @@
         // Default is !httpOnly.
         List<HttpCookie> list = HttpCookie.parse("Set-Cookie: SID=31d4d96e407aad42");
         HttpCookie cookie = list.get(0);
-        assertFalse(cookie.isHttpOnly());
 
         // Well formed, simple.
         list = HttpCookie.parse("Set-Cookie: SID=31d4d96e407aad42; HttpOnly");
         cookie = list.get(0);
-        assertTrue(cookie.isHttpOnly());
 
         // Well formed, other attributes present.
         list = HttpCookie.parse("Set-Cookie: SID=31d4d96e407aad42; Path=/; Secure; HttpOnly");
         cookie = list.get(0);
-        assertTrue(cookie.isHttpOnly());
         assertTrue(cookie.getSecure());
         assertEquals("/", cookie.getPath());
 
         // Mangled spacing, casing and attributes that have an (ignored) value.
         list = HttpCookie.parse("Set-Cookie:SID=31d4d96e407aad42;Path=/;secure=false;httponly=false");
         cookie = list.get(0);
-        assertTrue(cookie.isHttpOnly());
         assertTrue(cookie.getSecure());
         assertEquals("/", cookie.getPath());
     }
diff --git a/harmony-tests/src/test/java/org/apache/harmony/tests/java/nio/channels/DatagramChannelTest.java b/harmony-tests/src/test/java/org/apache/harmony/tests/java/nio/channels/DatagramChannelTest.java
index 731e907..4469e01 100644
--- a/harmony-tests/src/test/java/org/apache/harmony/tests/java/nio/channels/DatagramChannelTest.java
+++ b/harmony-tests/src/test/java/org/apache/harmony/tests/java/nio/channels/DatagramChannelTest.java
@@ -25,7 +25,6 @@
 import java.net.SocketAddress;
 import java.net.SocketException;
 import java.nio.ByteBuffer;
-import java.nio.channels.AlreadyBoundException;
 import java.nio.channels.AsynchronousCloseException;
 import java.nio.channels.ClosedChannelException;
 import java.nio.channels.DatagramChannel;
@@ -72,11 +71,11 @@
         channel1 = DatagramChannel.open();
         channel2 = DatagramChannel.open();
 
-        channel1.bind(new InetSocketAddress(Inet6Address.LOOPBACK, 0));
-        channel2.bind(new InetSocketAddress(Inet6Address.LOOPBACK, 0));
+        channel1.socket().bind(new InetSocketAddress(Inet6Address.LOOPBACK, 0));
+        channel2.socket().bind(new InetSocketAddress(Inet6Address.LOOPBACK, 0));
 
-        channel1Address = (InetSocketAddress) channel1.getLocalAddress();
-        channel2Address = (InetSocketAddress) channel2.getLocalAddress();
+        channel1Address = (InetSocketAddress) channel1.socket().getLocalSocketAddress();
+        channel2Address = (InetSocketAddress) channel2.socket().getLocalSocketAddress();
 
         this.datagramSocket1 = new DatagramSocket(0, Inet6Address.LOOPBACK);
         this.datagramSocket2 = new DatagramSocket(0, Inet6Address.LOOPBACK);
@@ -1943,7 +1942,7 @@
             sourceArray[i] = (byte) i;
         }
 
-        this.channel1.connect(channel1.getLocalAddress());
+        this.channel1.connect(channel1.socket().getLocalSocketAddress());
         this.channel2.connect(datagramSocket1Address); // the different addr
 
         // write
@@ -1973,7 +1972,7 @@
         assertEquals(CAPACITY_NORMAL, dc.write(sourceBuf));
 
         // Connect channel2 after data has been written.
-        channel2.connect(dc.getLocalAddress());
+        channel2.connect(dc.socket().getLocalSocketAddress());
 
         // read
         ByteBuffer targetBuf = ByteBuffer.wrap(targetArray);
@@ -2165,7 +2164,7 @@
         assertEquals(CAPACITY_NORMAL, dc.write(sourceBuf));
 
         // Connect channel2 after data has been written.
-        channel2.connect(dc.getLocalAddress());
+        channel2.connect(dc.socket().getLocalSocketAddress());
 
         // read
         ByteBuffer targetBuf = ByteBuffer.wrap(targetArray);
@@ -2383,8 +2382,8 @@
     public void test_bounded_harmony6493() throws IOException {
         DatagramChannel server = DatagramChannel.open();
         InetSocketAddress addr = new InetSocketAddress("localhost", 0);
-        server.bind(addr);
-        SocketAddress boundedAddress = server.getLocalAddress();
+        server.socket().bind(addr);
+        SocketAddress boundedAddress = server.socket().getLocalSocketAddress();
 
         DatagramChannel client = DatagramChannel.open();
         ByteBuffer sent = ByteBuffer.allocate(1024);
@@ -2400,11 +2399,11 @@
     public void test_bind_null() throws Exception {
         DatagramChannel dc = DatagramChannel.open();
         try {
-            assertNull(dc.getLocalAddress());
+            assertNull(dc.socket().getLocalSocketAddress());
 
-            dc.bind(null);
+            dc.socket().bind(null);
 
-            InetSocketAddress localAddress = (InetSocketAddress) dc.getLocalAddress();
+            InetSocketAddress localAddress = (InetSocketAddress) dc.socket().getLocalSocketAddress();
             assertTrue(localAddress.getAddress().isAnyLocalAddress());
             assertTrue(localAddress.getPort() > 0);
         } finally {
@@ -2416,7 +2415,7 @@
         DatagramChannel dc = DatagramChannel.open();
         try {
             // Bind to a local address that is in use
-            dc.bind(channel1Address);
+            dc.socket().bind(channel1Address);
             fail();
         } catch (IOException expected) {
         } finally {
@@ -2429,38 +2428,25 @@
         dc.close();
 
         try {
-            dc.bind(null);
+            dc.socket().bind(null);
             fail();
-        } catch (ClosedChannelException expected) {
-        } finally {
-            dc.close();
-        }
-    }
-
-    public void test_bind_twice() throws Exception {
-        DatagramChannel dc = DatagramChannel.open();
-        dc.bind(null);
-
-        try {
-            dc.bind(null);
-            fail();
-        } catch (AlreadyBoundException expected) {
+        } catch (IOException expected) {
         } finally {
             dc.close();
         }
     }
 
     public void test_bind_explicitPort() throws Exception {
-        InetSocketAddress address = (InetSocketAddress) channel1.getLocalAddress();
+        InetSocketAddress address = (InetSocketAddress) channel1.socket().getLocalSocketAddress();
         assertTrue(address.getPort() > 0);
 
         DatagramChannel dc = DatagramChannel.open();
         // Allow the socket to bind to a port we know is already in use.
         dc.socket().setReuseAddress(true);
         InetSocketAddress bindAddress = new InetSocketAddress("localhost", address.getPort());
-        dc.bind(bindAddress);
+        dc.socket().bind(bindAddress);
 
-        InetSocketAddress boundAddress = (InetSocketAddress) dc.getLocalAddress();
+        InetSocketAddress boundAddress = (InetSocketAddress) dc.socket().getLocalSocketAddress();
         assertEquals(bindAddress.getHostName(), boundAddress.getHostName());
         assertEquals(bindAddress.getPort(), boundAddress.getPort());
 
@@ -2471,16 +2457,16 @@
     /** Checks that the SocketChannel and associated Socket agree on the socket state. */
     public void test_bind_socketSync() throws IOException {
         DatagramChannel dc = DatagramChannel.open();
-        assertNull(dc.getLocalAddress());
+        assertNull(dc.socket().getLocalSocketAddress());
 
         DatagramSocket socket = dc.socket();
         assertNull(socket.getLocalSocketAddress());
         assertFalse(socket.isBound());
 
         InetSocketAddress bindAddr = new InetSocketAddress("localhost", 0);
-        dc.bind(bindAddr);
+        dc.socket().bind(bindAddr);
 
-        InetSocketAddress actualAddr = (InetSocketAddress) dc.getLocalAddress();
+        InetSocketAddress actualAddr = (InetSocketAddress) dc.socket().getLocalSocketAddress();
         assertEquals(actualAddr, socket.getLocalSocketAddress());
         assertEquals(bindAddr.getHostName(), actualAddr.getHostName());
         assertTrue(socket.isBound());
@@ -2499,14 +2485,14 @@
      */
     public void test_bind_socketSyncAfterBind() throws IOException {
         DatagramChannel dc = DatagramChannel.open();
-        assertNull(dc.getLocalAddress());
+        assertNull(dc.socket().getLocalSocketAddress());
 
         InetSocketAddress bindAddr = new InetSocketAddress("localhost", 0);
-        dc.bind(bindAddr);
+        dc.socket().bind(bindAddr);
 
         // Socket creation after bind().
         DatagramSocket socket = dc.socket();
-        InetSocketAddress actualAddr = (InetSocketAddress) dc.getLocalAddress();
+        InetSocketAddress actualAddr = (InetSocketAddress) dc.socket().getLocalSocketAddress();
         assertEquals(actualAddr, socket.getLocalSocketAddress());
         assertEquals(bindAddr.getHostName(), actualAddr.getHostName());
         assertTrue(socket.isBound());
@@ -2521,21 +2507,17 @@
 
     public void test_getLocalSocketAddress_afterClose() throws IOException {
         DatagramChannel dc = DatagramChannel.open();
-        assertNull(dc.getLocalAddress());
+        assertNull(dc.socket().getLocalSocketAddress());
 
         InetSocketAddress bindAddr = new InetSocketAddress("localhost", 0);
-        dc.bind(bindAddr);
+        dc.socket().bind(bindAddr);
 
-        assertNotNull(dc.getLocalAddress());
+        assertNotNull(dc.socket().getLocalSocketAddress());
 
         dc.close();
 
         assertFalse(dc.isOpen());
 
-        try {
-            dc.getLocalAddress();
-            fail();
-        } catch (ClosedChannelException expected) {
-        }
+        dc.socket().getLocalSocketAddress();
     }
 }
diff --git a/harmony-tests/src/test/java/org/apache/harmony/tests/java/nio/channels/FileChannelTest.java b/harmony-tests/src/test/java/org/apache/harmony/tests/java/nio/channels/FileChannelTest.java
index ccf5a14..990badc 100644
--- a/harmony-tests/src/test/java/org/apache/harmony/tests/java/nio/channels/FileChannelTest.java
+++ b/harmony-tests/src/test/java/org/apache/harmony/tests/java/nio/channels/FileChannelTest.java
@@ -786,7 +786,6 @@
         // shared lock, but it works on Windows & Linux.
         assertTrue(fileLock.isShared());
         assertSame(readOnlyFileChannel, fileLock.channel());
-        assertSame(readOnlyFileChannel, fileLock.acquiredBy());
         assertEquals(POSITION, fileLock.position());
         assertEquals(SIZE, fileLock.size());
     }
@@ -801,7 +800,6 @@
         assertTrue(fileLock.isValid());
         assertFalse(fileLock.isShared());
         assertSame(writeOnlyFileChannel, fileLock.channel());
-        assertSame(writeOnlyFileChannel, fileLock.acquiredBy());
         assertEquals(POSITION, fileLock.position());
         assertEquals(SIZE, fileLock.size());
     }
@@ -818,7 +816,6 @@
         assertEquals(POSITION, fileLock.position());
         assertEquals(SIZE, fileLock.size());
         assertSame(readOnlyFileChannel, fileLock.channel());
-        assertSame(readOnlyFileChannel, fileLock.acquiredBy());
     }
 
     /**
@@ -997,7 +994,6 @@
         // shared lock, but it works on Windows & Linux.
         assertTrue(fileLock.isShared());
         assertSame(readOnlyFileChannel, fileLock.channel());
-        assertSame(readOnlyFileChannel, fileLock.acquiredBy());
         assertEquals(POSITION, fileLock.position());
         assertEquals(SIZE, fileLock.size());
     }
@@ -1012,7 +1008,6 @@
         assertTrue(fileLock.isValid());
         assertFalse(fileLock.isShared());
         assertSame(writeOnlyFileChannel, fileLock.channel());
-        assertSame(writeOnlyFileChannel, fileLock.acquiredBy());
         assertEquals(POSITION, fileLock.position());
         assertEquals(SIZE, fileLock.size());
     }
@@ -1029,7 +1024,6 @@
         assertEquals(POSITION, fileLock.position());
         assertEquals(SIZE, fileLock.size());
         assertSame(readOnlyFileChannel, fileLock.channel());
-        assertSame(readOnlyFileChannel, fileLock.acquiredBy());
     }
 
     /**
diff --git a/harmony-tests/src/test/java/org/apache/harmony/tests/java/nio/channels/FileLockTest.java b/harmony-tests/src/test/java/org/apache/harmony/tests/java/nio/channels/FileLockTest.java
index c4d372b..7e3b671 100644
--- a/harmony-tests/src/test/java/org/apache/harmony/tests/java/nio/channels/FileLockTest.java
+++ b/harmony-tests/src/test/java/org/apache/harmony/tests/java/nio/channels/FileLockTest.java
@@ -75,7 +75,6 @@
 	public void test_Constructor_Ljava_nio_channels_FileChannelJJZ() {
 		FileLock fileLock1 = new MockFileLock(null, 0, 0, false);
 		assertNull(fileLock1.channel());
-		assertNull(fileLock1.acquiredBy());
 
 		try {
 			new MockFileLock(readWriteChannel, -1, 0, false);
@@ -108,15 +107,6 @@
 	}
 
 	/**
-	 * @tests java.nio.channels.FileLock#acquiredBy()
-	 */
-	public void test_acquiredBy() {
-		assertSame(readWriteChannel, mockLock.acquiredBy());
-		FileLock lock = new MockFileLock(null, 0, 10, true);
-		assertNull(lock.acquiredBy());
-	}
-
-	/**
 	 * @tests java.nio.channels.FileLock#position()
 	 */
 	public void test_position() {
diff --git a/harmony-tests/src/test/java/org/apache/harmony/tests/java/nio/channels/ServerSocketChannelTest.java b/harmony-tests/src/test/java/org/apache/harmony/tests/java/nio/channels/ServerSocketChannelTest.java
index b417adc..c1d592a 100644
--- a/harmony-tests/src/test/java/org/apache/harmony/tests/java/nio/channels/ServerSocketChannelTest.java
+++ b/harmony-tests/src/test/java/org/apache/harmony/tests/java/nio/channels/ServerSocketChannelTest.java
@@ -24,7 +24,6 @@
 import java.net.ServerSocket;
 import java.net.Socket;
 import java.nio.ByteBuffer;
-import java.nio.channels.AlreadyBoundException;
 import java.nio.channels.AsynchronousCloseException;
 import java.nio.channels.ClosedChannelException;
 import java.nio.channels.IllegalBlockingModeException;
@@ -115,11 +114,11 @@
     public void test_bind_null() throws Exception {
         ServerSocketChannel ssc = ServerSocketChannel.open();
         try {
-            assertNull(ssc.getLocalAddress());
+            assertNull(ssc.socket().getLocalSocketAddress());
 
-            ssc.bind(null);
+            ssc.socket().bind(null);
 
-            InetSocketAddress localAddress = (InetSocketAddress) ssc.getLocalAddress();
+            InetSocketAddress localAddress = (InetSocketAddress) ssc.socket().getLocalSocketAddress();
             assertTrue(localAddress.getAddress().isAnyLocalAddress());
             assertTrue(localAddress.getPort() > 0);
         } finally {
@@ -129,12 +128,12 @@
 
     public void test_bind_failure() throws Exception {
         ServerSocketChannel portHog = ServerSocketChannel.open();
-        portHog.bind(null);
+        portHog.socket().bind(null);
 
         ServerSocketChannel ssc = ServerSocketChannel.open();
         try {
             // Bind to a local address that is in use
-            ssc.bind(portHog.getLocalAddress());
+            ssc.socket().bind(portHog.socket().getLocalSocketAddress());
             fail();
         } catch (IOException expected) {
         } finally {
@@ -148,22 +147,9 @@
         ssc.close();
 
         try {
-            ssc.bind(null);
+            ssc.socket().bind(null);
             fail();
-        } catch (ClosedChannelException expected) {
-        } finally {
-            ssc.close();
-        }
-    }
-
-    public void test_bind_twice() throws Exception {
-        ServerSocketChannel ssc = ServerSocketChannel.open();
-        ssc.bind(null);
-
-        try {
-            ssc.bind(null);
-            fail();
-        } catch (AlreadyBoundException expected) {
+        } catch (IOException expected) {
         } finally {
             ssc.close();
         }
@@ -172,9 +158,9 @@
     public void test_bind_explicitPort() throws Exception {
         ServerSocketChannel portPickingChannel = ServerSocketChannel.open();
         // Have the OS find a free port.
-        portPickingChannel.bind(null);
+        portPickingChannel.socket().bind(null);
 
-        InetSocketAddress address = (InetSocketAddress) portPickingChannel.getLocalAddress();
+        InetSocketAddress address = (InetSocketAddress) portPickingChannel.socket().getLocalSocketAddress();
         assertTrue(address.getPort() > 0);
         portPickingChannel.close();
 
@@ -182,9 +168,9 @@
         // close() and bind().
         ServerSocketChannel ssc = ServerSocketChannel.open();
         InetSocketAddress bindAddress = new InetSocketAddress("localhost", address.getPort());
-        ssc.bind(bindAddress);
+        ssc.socket().bind(bindAddress);
 
-        InetSocketAddress boundAddress = (InetSocketAddress) ssc.getLocalAddress();
+        InetSocketAddress boundAddress = (InetSocketAddress) ssc.socket().getLocalSocketAddress();
         assertEquals(bindAddress.getHostName(), boundAddress.getHostName());
         assertEquals(bindAddress.getPort(), boundAddress.getPort());
 
@@ -193,16 +179,16 @@
 
     public void test_bind_socketSync() throws IOException {
         ServerSocketChannel ssc = ServerSocketChannel.open();
-        assertNull(ssc.getLocalAddress());
+        assertNull(ssc.socket().getLocalSocketAddress());
 
         ServerSocket socket = ssc.socket();
         assertNull(socket.getLocalSocketAddress());
         assertFalse(socket.isBound());
 
         InetSocketAddress bindAddr = new InetSocketAddress("localhost", 0);
-        ssc.bind(bindAddr);
+        ssc.socket().bind(bindAddr);
 
-        InetSocketAddress actualAddr = (InetSocketAddress) ssc.getLocalAddress();
+        InetSocketAddress actualAddr = (InetSocketAddress) ssc.socket().getLocalSocketAddress();
         assertEquals(actualAddr, socket.getLocalSocketAddress());
         assertEquals(bindAddr.getHostName(), actualAddr.getHostName());
         assertTrue(socket.isBound());
@@ -216,14 +202,14 @@
 
     public void test_bind_socketSyncAfterBind() throws IOException {
         ServerSocketChannel ssc = ServerSocketChannel.open();
-        assertNull(ssc.getLocalAddress());
+        assertNull(ssc.socket().getLocalSocketAddress());
 
         InetSocketAddress bindAddr = new InetSocketAddress("localhost", 0);
-        ssc.bind(bindAddr);
+        ssc.socket().bind(bindAddr);
 
         // Socket creation after bind().
         ServerSocket socket = ssc.socket();
-        InetSocketAddress actualAddr = (InetSocketAddress) ssc.getLocalAddress();
+        InetSocketAddress actualAddr = (InetSocketAddress) ssc.socket().getLocalSocketAddress();
         assertEquals(actualAddr, socket.getLocalSocketAddress());
         assertEquals(bindAddr.getHostName(), actualAddr.getHostName());
         assertTrue(socket.isBound());
@@ -241,22 +227,18 @@
 
     public void test_getLocalSocketAddress_afterClose() throws IOException {
         ServerSocketChannel ssc = ServerSocketChannel.open();
-        assertNull(ssc.getLocalAddress());
+        assertNull(ssc.socket().getLocalSocketAddress());
 
         InetSocketAddress bindAddr = new InetSocketAddress("localhost", 0);
-        ssc.bind(bindAddr);
+        ssc.socket().bind(bindAddr);
 
-        assertNotNull(ssc.getLocalAddress());
+        assertNotNull(ssc.socket().getLocalSocketAddress());
 
         ssc.close();
 
         assertFalse(ssc.isOpen());
 
-        try {
-            ssc.getLocalAddress();
-            fail();
-        } catch (ClosedChannelException expected) {
-        }
+        ssc.socket().getLocalSocketAddress();
     }
 
     // -------------------------------------------------------------------
@@ -387,7 +369,7 @@
 
     public void testAccept_Block_NoConnect() throws IOException {
         assertTrue(this.serverChannel.isBlocking());
-        serverChannel.bind(null);
+        serverChannel.socket().bind(null);
         // blocking mode , will block and wait for ever...
         // so must close the server channel with another thread.
         new Thread() {
@@ -410,7 +392,7 @@
     }
 
     public void testAccept_NonBlock_NoConnect() throws IOException {
-        this.serverChannel.bind(null);
+        this.serverChannel.socket().bind(null);
         this.serverChannel.configureBlocking(false);
         // non-blocking mode , will immediately return
         assertNull(this.serverChannel.accept());
@@ -420,13 +402,13 @@
      * @tests ServerSocketChannel#accept().socket()
      */
     public void test_read_Blocking_RealData() throws IOException {
-        serverChannel.bind(null);
+        serverChannel.socket().bind(null);
         ByteBuffer buf = ByteBuffer.allocate(CAPACITY_NORMAL);
 
         for (int i = 0; i < CAPACITY_NORMAL; i++) {
             buf.put((byte) i);
         }
-        clientChannel.connect(serverChannel.getLocalAddress());
+        clientChannel.connect(serverChannel.socket().getLocalSocketAddress());
         Socket serverSocket = serverChannel.accept().socket();
         InputStream in = serverSocket.getInputStream();
         buf.flip();
@@ -459,13 +441,13 @@
      */
     public void test_read_NonBlocking_RealData() throws Exception {
         serverChannel.configureBlocking(false);
-        serverChannel.bind(null);
+        serverChannel.socket().bind(null);
         ByteBuffer buf = ByteBuffer.allocate(CAPACITY_NORMAL);
         for (int i = 0; i < CAPACITY_NORMAL; i++) {
             buf.put((byte) i);
         }
         buf.flip();
-        clientChannel.connect(serverChannel.getLocalAddress());
+        clientChannel.connect(serverChannel.socket().getLocalSocketAddress());
         Socket serverSocket = serverChannel.accept().socket();
         InputStream in = serverSocket.getInputStream();
         clientChannel.write(buf);
@@ -478,13 +460,13 @@
      */
     public void test_write_Blocking_RealData() throws IOException {
         assertTrue(serverChannel.isBlocking());
-        serverChannel.bind(null);
+        serverChannel.socket().bind(null);
 
         byte[] writeContent = new byte[CAPACITY_NORMAL];
         for (int i = 0; i < writeContent.length; i++) {
             writeContent[i] = (byte) i;
         }
-        clientChannel.connect(serverChannel.getLocalAddress());
+        clientChannel.connect(serverChannel.socket().getLocalSocketAddress());
         Socket socket = serverChannel.accept().socket();
         OutputStream out = socket.getOutputStream();
         out.write(writeContent);
@@ -499,13 +481,13 @@
      */
     public void test_write_NonBlocking_RealData() throws Exception {
         serverChannel.configureBlocking(false);
-        serverChannel.bind(null);
+        serverChannel.socket().bind(null);
 
         byte[] writeContent = new byte[CAPACITY_NORMAL];
         for (int i = 0; i < CAPACITY_NORMAL; i++) {
             writeContent[i] = (byte) i;
         }
-        clientChannel.connect(serverChannel.getLocalAddress());
+        clientChannel.connect(serverChannel.socket().getLocalSocketAddress());
         Socket clientSocket = serverChannel.accept().socket();
         OutputStream out = clientSocket.getOutputStream();
         out.write(writeContent);
@@ -519,13 +501,13 @@
      */
     public void test_read_LByteBuffer_Blocking_ReadWriteRealLargeData()
             throws IOException, InterruptedException {
-        serverChannel.bind(null);
+        serverChannel.socket().bind(null);
         ByteBuffer buf = ByteBuffer.allocate(CAPACITY_64KB);
         for (int i = 0; i < CAPACITY_64KB; i++) {
             buf.put((byte) i);
         }
         buf.flip();
-        clientChannel.connect(serverChannel.getLocalAddress());
+        clientChannel.connect(serverChannel.socket().getLocalSocketAddress());
         WriteChannelThread writeThread = new WriteChannelThread(clientChannel, buf);
         writeThread.start();
         Socket socket = serverChannel.accept().socket();
@@ -564,13 +546,13 @@
     public void test_read_LByteBuffer_NonBlocking_ReadWriteRealLargeData()
             throws Exception {
         serverChannel.configureBlocking(false);
-        serverChannel.bind(null);
+        serverChannel.socket().bind(null);
         ByteBuffer buf = ByteBuffer.allocate(CAPACITY_64KB);
         for (int i = 0; i < CAPACITY_64KB; i++) {
             buf.put((byte) i);
         }
         buf.flip();
-        clientChannel.connect(serverChannel.getLocalAddress());
+        clientChannel.connect(serverChannel.socket().getLocalSocketAddress());
         WriteChannelThread writeThread = new WriteChannelThread(clientChannel, buf);
         writeThread.start();
         Socket socket = serverChannel.accept().socket();
@@ -589,12 +571,12 @@
     public void test_write_LByteBuffer_NonBlocking_ReadWriteRealLargeData()
             throws Exception {
         serverChannel.configureBlocking(false);
-        serverChannel.bind(null);
+        serverChannel.socket().bind(null);
         byte[] writeContent = new byte[CAPACITY_64KB];
         for (int i = 0; i < writeContent.length; i++) {
             writeContent[i] = (byte) i;
         }
-        clientChannel.connect(serverChannel.getLocalAddress());
+        clientChannel.connect(serverChannel.socket().getLocalSocketAddress());
         Socket socket = serverChannel.accept().socket();
         WriteSocketThread writeThread = new WriteSocketThread(socket, writeContent);
         writeThread.start();
@@ -632,12 +614,12 @@
      */
     public void test_write_LByteBuffer_Blocking_ReadWriteRealLargeData()
             throws Exception {
-        serverChannel.bind(null);
+        serverChannel.socket().bind(null);
         byte[] writeContent = new byte[CAPACITY_64KB];
         for (int i = 0; i < writeContent.length; i++) {
             writeContent[i] = (byte) i;
         }
-        clientChannel.connect(serverChannel.getLocalAddress());
+        clientChannel.connect(serverChannel.socket().getLocalSocketAddress());
         Socket socket = serverChannel.accept().socket();
         WriteSocketThread writeThread = new WriteSocketThread(socket, writeContent);
         writeThread.start();
@@ -679,7 +661,7 @@
         final int SO_TIMEOUT = 10;
         ServerSocketChannel sc = ServerSocketChannel.open();
         try {
-            sc.bind(null);
+            sc.socket().bind(null);
             sc.configureBlocking(false);
             ServerSocket ss = sc.socket();
             ss.setSoTimeout(SO_TIMEOUT);
@@ -740,7 +722,7 @@
     public void test_socket_accept_Nonblocking_Bound() throws IOException {
         // regression test for Harmony-748
         serverChannel.configureBlocking(false);
-        serverChannel.bind(null);
+        serverChannel.socket().bind(null);
         ServerSocket gotSocket = serverChannel.socket();
         try {
             gotSocket.accept();
@@ -761,7 +743,7 @@
     public void test_socket_accept_Blocking_Bound() throws IOException {
         // regression test for Harmony-748
         serverChannel.configureBlocking(true);
-        serverChannel.bind(null);
+        serverChannel.socket().bind(null);
         serverChannel.close();
         try {
             serverChannel.socket().accept();
@@ -773,8 +755,8 @@
      * Regression test for HARMONY-4961
      */
     public void test_socket_getLocalPort() throws IOException {
-        serverChannel.bind(null);
-        clientChannel.connect(serverChannel.getLocalAddress());
+        serverChannel.socket().bind(null);
+        clientChannel.connect(serverChannel.socket().getLocalSocketAddress());
         SocketChannel myChannel = serverChannel.accept();
         int port = myChannel.socket().getLocalPort();
         assertEquals(serverChannel.socket().getLocalPort(), port);
@@ -788,7 +770,7 @@
      */
     public void test_accept_configureBlocking() throws Exception {
         InetSocketAddress localAddr = new InetSocketAddress("localhost", 0);
-        serverChannel.bind(localAddr);
+        serverChannel.socket().bind(localAddr);
 
         // configure the channel non-blocking
         // when it is accepting in main thread
diff --git a/harmony-tests/src/test/java/org/apache/harmony/tests/java/nio/channels/SocketChannelTest.java b/harmony-tests/src/test/java/org/apache/harmony/tests/java/nio/channels/SocketChannelTest.java
index 52dff79..51a8cff 100644
--- a/harmony-tests/src/test/java/org/apache/harmony/tests/java/nio/channels/SocketChannelTest.java
+++ b/harmony-tests/src/test/java/org/apache/harmony/tests/java/nio/channels/SocketChannelTest.java
@@ -30,7 +30,6 @@
 import java.net.SocketException;
 import java.nio.Buffer;
 import java.nio.ByteBuffer;
-import java.nio.channels.AlreadyBoundException;
 import java.nio.channels.AlreadyConnectedException;
 import java.nio.channels.ClosedChannelException;
 import java.nio.channels.ConnectionPendingException;
@@ -155,21 +154,21 @@
     }
 
     public void testBind_Null() throws Exception {
-        assertNull(channel1.getLocalAddress());
+        assertNull(channel1.socket().getLocalSocketAddress());
 
-        channel1.bind(null);
+        channel1.socket().bind(null);
 
-        InetSocketAddress localAddress = (InetSocketAddress) channel1.getLocalAddress();
+        InetSocketAddress localAddress = (InetSocketAddress) channel1.socket().getLocalSocketAddress();
         assertTrue(localAddress.getAddress().isAnyLocalAddress());
         assertTrue(localAddress.getPort() > 0);
     }
 
     public void testBind_Failure() throws Exception {
-        assertNull(channel1.getLocalAddress());
+        assertNull(channel1.socket().getLocalSocketAddress());
 
         try {
             // Bind to a local address that is in use
-            channel1.bind(localAddr1);
+            channel1.socket().bind(localAddr1);
             fail();
         } catch (IOException expected) {
         }
@@ -179,27 +178,17 @@
         channel1.close();
 
         try {
-            channel1.bind(null);
+            channel1.socket().bind(null);
             fail();
-        } catch (ClosedChannelException expected) {
-        }
-    }
-
-    public void testBind_Twice() throws Exception {
-        channel1.bind(null);
-
-        try {
-            channel1.bind(null);
-            fail();
-        } catch (AlreadyBoundException expected) {
+        } catch (IOException expected) {
         }
     }
 
     public void testBind_explicitPort() throws Exception {
         ServerSocketChannel portPickingChannel = ServerSocketChannel.open();
         // Have the OS find a free port.
-        portPickingChannel.bind(null);
-        InetSocketAddress address = (InetSocketAddress) portPickingChannel.getLocalAddress();
+        portPickingChannel.socket().bind(null);
+        InetSocketAddress address = (InetSocketAddress) portPickingChannel.socket().getLocalSocketAddress();
         assertTrue(address.getPort() > 0);
         portPickingChannel.close();
 
@@ -208,31 +197,27 @@
         InetSocketAddress bindAddress = new InetSocketAddress("localhost", address.getPort());
         // Allow the socket to bind to a port we know is already in use.
         channel1.socket().setReuseAddress(true);
-        channel1.bind(bindAddress);
+        channel1.socket().bind(bindAddress);
 
-        InetSocketAddress boundAddress = (InetSocketAddress) channel1.getLocalAddress();
+        InetSocketAddress boundAddress = (InetSocketAddress) channel1.socket().getLocalSocketAddress();
         assertEquals(bindAddress.getHostName(), boundAddress.getHostName());
         assertEquals(bindAddress.getPort(), boundAddress.getPort());
     }
 
     public void test_getLocalSocketAddress_afterClose() throws IOException {
         SocketChannel sc = SocketChannel.open();
-        assertNull(sc.getLocalAddress());
+        assertNull(sc.socket().getLocalSocketAddress());
 
         InetSocketAddress bindAddr = new InetSocketAddress("localhost", 0);
-        sc.bind(bindAddr);
+        sc.socket().bind(bindAddr);
 
-        assertNotNull(sc.getLocalAddress());
+        assertNotNull(sc.socket().getLocalSocketAddress());
 
         sc.close();
 
         assertFalse(sc.isOpen());
 
-        try {
-            sc.getLocalAddress();
-            fail();
-        } catch (ClosedChannelException expected) {
-        }
+        sc.socket().getLocalSocketAddress();
     }
 
     /*
@@ -479,11 +464,10 @@
 
     public void testSocket_getLocalAddress() throws Exception {
         Socket socket = channel1.socket();
-        assertNotNull(socket.getLocalAddress());
 
         channel1.connect(localAddr1);
 
-        assertNotNull(socket.getLocalAddress());
+        assertNotNull(socket.getLocalSocketAddress());
     }
 
     public void testSocket_getLocalSocketAddress() throws Exception {
@@ -1882,7 +1866,7 @@
         ServerSocket serversocket = theServerChannel.socket();
         serversocket.setReuseAddress(true);
         // Bind the socket
-        theServerChannel.bind(address);
+        theServerChannel.socket().bind(address);
 
         boolean doneNonBlockingConnect = false;
         // Loop so that we make sure we're definitely testing finishConnect()
@@ -2203,7 +2187,7 @@
         ByteBuffer buffer = ByteBuffer.allocateDirect(128);
 
         ServerSocketChannel server = ServerSocketChannel.open();
-        server.bind(new InetSocketAddress(InetAddress.getLocalHost(), 0), 5);
+        server.socket().bind(new InetSocketAddress(InetAddress.getLocalHost(), 0), 5);
         Socket client = new Socket(InetAddress.getLocalHost(), server.socket()
                 .getLocalPort());
         client.setTcpNoDelay(false);
@@ -2821,9 +2805,9 @@
      */
     public void test_writev() throws Exception {
         ServerSocketChannel ssc = ServerSocketChannel.open();
-        ssc.bind(null);
+        ssc.socket().bind(null);
         SocketChannel sc = SocketChannel.open();
-        sc.connect(ssc.getLocalAddress());
+        sc.connect(ssc.socket().getLocalSocketAddress());
         SocketChannel sock = ssc.accept();
         ByteBuffer[] buf = { ByteBuffer.allocate(10), ByteBuffer.allocateDirect(20) };
 
@@ -2848,10 +2832,10 @@
     public void test_writev2() throws Exception {
         ServerSocketChannel ssc = ServerSocketChannel.open();
         ssc.configureBlocking(false);
-        ssc.bind(null);
+        ssc.socket().bind(null);
         SocketChannel sc = SocketChannel.open();
         sc.configureBlocking(false);
-        boolean connected = sc.connect(ssc.getLocalAddress());
+        boolean connected = sc.connect(ssc.socket().getLocalSocketAddress());
         SocketChannel sock = ssc.accept();
         if (!connected) {
             sc.finishConnect();
@@ -2886,10 +2870,10 @@
     public void test_write$NonBlockingException() throws Exception {
         ServerSocketChannel ssc = ServerSocketChannel.open();
         ssc.configureBlocking(false);
-        ssc.bind(null);
+        ssc.socket().bind(null);
         SocketChannel sc = SocketChannel.open();
         sc.configureBlocking(false);
-        boolean connected = sc.connect(ssc.getLocalAddress());
+        boolean connected = sc.connect(ssc.socket().getLocalSocketAddress());
         SocketChannel sock = ssc.accept();
         if (!connected) {
             sc.finishConnect();
@@ -2922,9 +2906,9 @@
     public void test_write$LByteBuffer2() throws IOException {
         // Set-up
         ServerSocketChannel server = ServerSocketChannel.open();
-        server.bind(null);
+        server.socket().bind(null);
         SocketChannel client = SocketChannel.open();
-        client.connect(server.getLocalAddress());
+        client.connect(server.socket().getLocalSocketAddress());
         SocketChannel worker = server.accept();
 
         // Test overlapping buffers
@@ -2954,9 +2938,9 @@
     public void test_write$LByteBuffer_buffers() throws IOException {
         // Set-up
         ServerSocketChannel server = ServerSocketChannel.open();
-        server.bind(null);
+        server.socket().bind(null);
         SocketChannel client = SocketChannel.open();
-        client.connect(server.getLocalAddress());
+        client.connect(server.socket().getLocalSocketAddress());
         SocketChannel worker = server.accept();
 
         // A variety of buffer types to write
@@ -2996,9 +2980,9 @@
     public void test_write$LByteBuffer_writes() throws IOException {
         // Set-up
         ServerSocketChannel server = ServerSocketChannel.open();
-        server.bind(null);
+        server.socket().bind(null);
         SocketChannel client = SocketChannel.open();
-        client.connect(server.getLocalAddress());
+        client.connect(server.socket().getLocalSocketAddress());
         SocketChannel worker = server.accept();
 
         // Data to write
@@ -3038,10 +3022,10 @@
     public void test_write$LByteBuffer_invalid() throws IOException {
         // Set-up
         ServerSocketChannel server = ServerSocketChannel.open();
-        server.bind(null);
+        server.socket().bind(null);
 
         SocketChannel client = SocketChannel.open();
-        client.connect(server.getLocalAddress());
+        client.connect(server.socket().getLocalSocketAddress());
 
         SocketChannel worker = server.accept();
 
@@ -3141,9 +3125,9 @@
             throws Exception {
         // regression 1 for HARMONY-549
         ServerSocketChannel ssc = ServerSocketChannel.open();
-        ssc.bind(null);
+        ssc.socket().bind(null);
         SocketChannel sc = SocketChannel.open();
-        sc.connect(ssc.getLocalAddress());
+        sc.connect(ssc.socket().getLocalSocketAddress());
         ssc.accept().close();
         ByteBuffer[] buf = { ByteBuffer.allocate(10) };
         assertEquals(-1, sc.read(buf, 0, 1));
@@ -3157,9 +3141,9 @@
     public void test_socketChannel_write_ByteBufferII() throws Exception {
         // regression 2 for HARMONY-549
         ServerSocketChannel ssc = ServerSocketChannel.open();
-        ssc.bind(null);
+        ssc.socket().bind(null);
         SocketChannel sc = SocketChannel.open();
-        sc.connect(ssc.getLocalAddress());
+        sc.connect(ssc.socket().getLocalSocketAddress());
         SocketChannel sock = ssc.accept();
         ByteBuffer[] buf = { ByteBuffer.allocate(10), null };
         try {
@@ -3179,9 +3163,9 @@
     public void test_socketChannel_read_ByteBufferII_bufNULL() throws Exception {
         // regression 3 for HARMONY-549
         ServerSocketChannel ssc = ServerSocketChannel.open();
-        ssc.bind(null);
+        ssc.socket().bind(null);
         SocketChannel sc = SocketChannel.open();
-        sc.connect(ssc.getLocalAddress());
+        sc.connect(ssc.socket().getLocalSocketAddress());
         ssc.accept();
         ByteBuffer[] buf = new ByteBuffer[2];
         buf[0] = ByteBuffer.allocate(1);
@@ -3201,9 +3185,9 @@
     public void test_socketChannel_write_close() throws Exception {
         // regression 4 for HARMONY-549
         ServerSocketChannel ssc = ServerSocketChannel.open();
-        ssc.bind(null);
+        ssc.socket().bind(null);
         SocketChannel sc = SocketChannel.open();
-        sc.connect(ssc.getLocalAddress());
+        sc.connect(ssc.socket().getLocalSocketAddress());
         SocketChannel sock = ssc.accept();
         ByteBuffer buf = null;
         ssc.close();
@@ -3226,9 +3210,9 @@
         ByteBuffer readBuf = ByteBuffer.allocate(11);
         ByteBuffer buf = ByteBuffer.wrap(testStr.getBytes());
         ServerSocketChannel ssc = ServerSocketChannel.open();
-        ssc.bind(null);
+        ssc.socket().bind(null);
         SocketChannel sc = SocketChannel.open();
-        sc.connect(ssc.getLocalAddress());
+        sc.connect(ssc.socket().getLocalSocketAddress());
         buf.position(2);
         ssc.accept().write(buf);
         assertEquals(9, sc.read(readBuf));
diff --git a/luni/src/main/java/java/lang/Character.java b/luni/src/main/java/java/lang/Character.java
index 2bf3a89..8efd6cd 100644
--- a/luni/src/main/java/java/lang/Character.java
+++ b/luni/src/main/java/java/lang/Character.java
@@ -1526,426 +1526,6 @@
 
     private static native int unicodeBlockForCodePoint(int codePoint);
 
-    /**
-     * Represents a <a href="http://www.unicode.org/reports/tr24/">Unicode script</a>.
-     * Every Unicode code point is contained by a single {@code UnicodeScript}. Code points
-     * shared between scripts will be in {@code COMMON}. Code points for combining
-     * characters that can be applied to multiple scripts will be in {@code INHERITED}
-     * because they inherit the script of their base character. Code points whose scripts
-     * don't have a corresponding {@code UnicodeScript} will be in {@code UNKNOWN}.
-     *
-     * @since 1.7
-     * @hide
-     */
-    public static enum UnicodeScript {
-        /** ISO 15924 English name "Arabic" */
-        ARABIC,
-        /** ISO 15924 English name "Armenian" */
-        ARMENIAN,
-        /** ISO 15924 English name "Avestan" */
-        AVESTAN,
-        /** ISO 15924 English name "Balinese" */
-        BALINESE,
-        /** ISO 15924 English name "Bamum" */
-        BAMUM,
-        /** ISO 15924 English name "Batak" */
-        BATAK,
-        /** ISO 15924 English name "Bengali" */
-        BENGALI,
-        /** ISO 15924 English name "Bopomofo" */
-        BOPOMOFO,
-        /** ISO 15924 English name "Brahmi" */
-        BRAHMI,
-        /** ISO 15924 English name "Braille" */
-        BRAILLE,
-        /** ISO 15924 English name "Buginese" */
-        BUGINESE,
-        /** ISO 15924 English name "Buhid" */
-        BUHID,
-        /** ISO 15924 English name "Unified Canadian Aboriginal Syllabics" */
-        CANADIAN_ABORIGINAL,
-        /** ISO 15924 English name "Carian" */
-        CARIAN,
-        /** ISO 15924 English name "Cham" */
-        CHAM,
-        /** ISO 15924 English name "Cherokee" */
-        CHEROKEE,
-        /** ISO 15924 English name "Common" */
-        COMMON,
-        /** ISO 15924 English name "Coptic" */
-        COPTIC,
-        /** ISO 15924 English name "Cuneiform" */
-        CUNEIFORM,
-        /** ISO 15924 English name "Cypriot" */
-        CYPRIOT,
-        /** ISO 15924 English name "Cyrillic" */
-        CYRILLIC,
-        /** ISO 15924 English name "Deseret" */
-        DESERET,
-        /** ISO 15924 English name "Devanagari" */
-        DEVANAGARI,
-        /** ISO 15924 English name "Egyptian hieroglyphs" */
-        EGYPTIAN_HIEROGLYPHS,
-        /** ISO 15924 English name "Ethiopic" */
-        ETHIOPIC,
-        /** ISO 15924 English name "Georgian" */
-        GEORGIAN,
-        /** ISO 15924 English name "Glagolitic" */
-        GLAGOLITIC,
-        /** ISO 15924 English name "Gothic" */
-        GOTHIC,
-        /** ISO 15924 English name "Greek" */
-        GREEK,
-        /** ISO 15924 English name "Gujarati" */
-        GUJARATI,
-        /** ISO 15924 English name "Gurmukhi" */
-        GURMUKHI,
-        /** ISO 15924 English name "Han" */
-        HAN,
-        /** ISO 15924 English name "Hangul" */
-        HANGUL,
-        /** ISO 15924 English name "Hanunoo" */
-        HANUNOO,
-        /** ISO 15924 English name "Hebrew" */
-        HEBREW,
-        /** ISO 15924 English name "Hiragana" */
-        HIRAGANA,
-        /** ISO 15924 English name "Imperial aramaic" */
-        IMPERIAL_ARAMAIC,
-        /** ISO 15924 English name "Inherited" */
-        INHERITED,
-        /** ISO 15924 English name "Inscriptional pahlavi" */
-        INSCRIPTIONAL_PAHLAVI,
-        /** ISO 15924 English name "Inscriptional parthian" */
-        INSCRIPTIONAL_PARTHIAN,
-        /** ISO 15924 English name "Javanese" */
-        JAVANESE,
-        /** ISO 15924 English name "Kaithi" */
-        KAITHI,
-        /** ISO 15924 English name "Kannada" */
-        KANNADA,
-        /** ISO 15924 English name "Katakana" */
-        KATAKANA,
-        /** ISO 15924 English name "Kayah li" */
-        KAYAH_LI,
-        /** ISO 15924 English name "Kharoshthi" */
-        KHAROSHTHI,
-        /** ISO 15924 English name "Khmer" */
-        KHMER,
-        /** ISO 15924 English name "Lao" */
-        LAO,
-        /** ISO 15924 English name "Latin" */
-        LATIN,
-        /** ISO 15924 English name "Lepcha" */
-        LEPCHA,
-        /** ISO 15924 English name "Limbu" */
-        LIMBU,
-        /** ISO 15924 English name "Linear B" */
-        LINEAR_B,
-        /** ISO 15924 English name "Lisu" */
-        LISU,
-        /** ISO 15924 English name "Lycian" */
-        LYCIAN,
-        /** ISO 15924 English name "Lydian" */
-        LYDIAN,
-        /** ISO 15924 English name "Malayalam" */
-        MALAYALAM,
-        /** ISO 15924 English name "Mandaic" */
-        MANDAIC,
-        /** ISO 15924 English name "Meetei Mayek (Meithei, Meetei)" */
-        MEETEI_MAYEK,
-        /** ISO 15924 English name "Mongolian" */
-        MONGOLIAN,
-        /** ISO 15924 English name "Myanmar" */
-        MYANMAR,
-        /** ISO 15924 English name "New Tai Lue" */
-        NEW_TAI_LUE,
-        /** ISO 15924 English name "Nko" */
-        NKO,
-        /** ISO 15924 English name "Ogham" */
-        OGHAM,
-        /** ISO 15924 English name "Ol Chiki" */
-        OL_CHIKI,
-        /** ISO 15924 English name "Old Italic" */
-        OLD_ITALIC,
-        /** ISO 15924 English name "Old Persian" */
-        OLD_PERSIAN,
-        /** ISO 15924 English name "Old South Arabian" */
-        OLD_SOUTH_ARABIAN,
-        /** ISO 15924 English name "Old Turkic, Orkhon Runic" */
-        OLD_TURKIC,
-        /** ISO 15924 English name "Oriya" */
-        ORIYA,
-        /** ISO 15924 English name "Osmanya" */
-        OSMANYA,
-        /** ISO 15924 English name "Phags-pa" */
-        PHAGS_PA,
-        /** ISO 15924 English name "Phoenician" */
-        PHOENICIAN,
-        /** ISO 15924 English name "Rejang" */
-        REJANG,
-        /** ISO 15924 English name "Runic" */
-        RUNIC,
-        /** ISO 15924 English name "Samaritan" */
-        SAMARITAN,
-        /** ISO 15924 English name "Saurashtra" */
-        SAURASHTRA,
-        /** ISO 15924 English name "Shavian" */
-        SHAVIAN,
-        /** ISO 15924 English name "Sinhala" */
-        SINHALA,
-        /** ISO 15924 English name "Sundanese" */
-        SUNDANESE,
-        /** ISO 15924 English name "Syloti Nagri" */
-        SYLOTI_NAGRI,
-        /** ISO 15924 English name "Syriac" */
-        SYRIAC,
-        /** ISO 15924 English name "Tagalog" */
-        TAGALOG,
-        /** ISO 15924 English name "Tagbanwa" */
-        TAGBANWA,
-        /** ISO 15924 English name "Tai Le" */
-        TAI_LE,
-        /** ISO 15924 English name "Tai Tham (Lanna)" */
-        TAI_THAM,
-        /** ISO 15924 English name "Tai Viet" */
-        TAI_VIET,
-        /** ISO 15924 English name "Tamil" */
-        TAMIL,
-        /** ISO 15924 English name "Telugu" */
-        TELUGU,
-        /** ISO 15924 English name "Thaana" */
-        THAANA,
-        /** ISO 15924 English name "Thai" */
-        THAI,
-        /** ISO 15924 English name "Tibetan" */
-        TIBETAN,
-        /** ISO 15924 English name "Tifinagh" */
-        TIFINAGH,
-        /** ISO 15924 English name "Ugaritic" */
-        UGARITIC,
-        /** ISO 15924 English name "Unknown" */
-        UNKNOWN,
-        /** ISO 15924 English name "Vai" */
-        VAI,
-        /** ISO 15924 English name "Yi" */
-        YI;
-
-        private static final UnicodeScript[] SCRIPTS = {
-                COMMON,
-                INHERITED,
-                ARABIC,
-                ARMENIAN,
-                BENGALI,
-                BOPOMOFO,
-                CHEROKEE,
-                COPTIC,
-                CYRILLIC,
-                DESERET,
-                DEVANAGARI,
-                ETHIOPIC,
-                GEORGIAN,
-                GOTHIC,
-                GREEK,
-                GUJARATI,
-                GURMUKHI,
-                HAN,
-                HANGUL,
-                HEBREW,
-                HIRAGANA,
-                KANNADA,
-                KATAKANA,
-                KHMER,
-                LAO,
-                LATIN,
-                MALAYALAM,
-                MONGOLIAN,
-                MYANMAR,
-                OGHAM,
-                OLD_ITALIC,
-                ORIYA,
-                RUNIC,
-                SINHALA,
-                SYRIAC,
-                TAMIL,
-                TELUGU,
-                THAANA,
-                THAI,
-                TIBETAN,
-                CANADIAN_ABORIGINAL,
-                YI,
-                TAGALOG,
-                HANUNOO,
-                BUHID,
-                TAGBANWA,
-                BRAILLE,
-                CYPRIOT,
-                LIMBU,
-                LINEAR_B,
-                OSMANYA,
-                SHAVIAN,
-                TAI_LE,
-                UGARITIC,
-                null,  // USCRIPT_KATAKANA_OR_HIRAGANA
-                BUGINESE,
-                GLAGOLITIC,
-                KHAROSHTHI,
-                SYLOTI_NAGRI,
-                NEW_TAI_LUE,
-                TIFINAGH,
-                OLD_PERSIAN,
-                BALINESE,
-                BATAK,
-                null, // USCRIPT_BLISSYMBOLS,
-                BRAHMI,
-                CHAM,
-                null,  // USCRIPT_CIRTH,
-                null,  // USCRIPT_OLD_CHURCH_SLAVONIC_CYRILLIC,
-                null,  // USCRIPT_DEMOTIC_EGYPTIAN,
-                null,  // USCRIPT_HIERATIC_EGYPTIAN,
-                EGYPTIAN_HIEROGLYPHS,
-                null,  // USCRIPT_USCRIPT_KHUTSURI,
-                null,  // USCRIPT_SIMPLIFIED_HAN,
-                null,  // USCRIPT_TRADITIONAL_HAN,
-                null,  // USCRIPT_PAHAWH_HMONG,
-                null,  // USCRIPT_OLD_HUNGARIAN,
-                null,  // USCRIPT_HARAPPAN_INDUS,
-                JAVANESE,
-                KAYAH_LI,
-                null,  // USCRIPT_LATIN_FRAKTUR,
-                null,  // USCRIPT_LATIN_GAELIC,
-                LEPCHA,
-                null,  // USCRIPT_LINEAR_A,
-                MANDAIC, // == MANDAEAN
-                null,  // USCRIPT_MAYAN_HIEROGLYPHS,
-                null,  // USCRIPT_MEROITIC_HIEROGLYPHS == USCRIPT_MEROITIC
-                null,  // USCRIPT_NKO,
-                OLD_TURKIC,  // USCRIPT_ORKHON == OLD_TURKIC,
-                null,  // USCRIPT_OLD_PERMIC,
-                PHAGS_PA,
-                PHOENICIAN,
-                null,  // USCRIPT_PHONETIC_POLLARD === MIAO,
-                null,  // USCRIPT_RONGORONGO,
-                null,  // USCRIPT_SARATI,
-                null,  // USCRIPT_ESTRANGELO_SYRIAC,
-                null,  // USCRIPT_WESTERN_SYRIAC,
-                null,  // USCRIPT_EASTERN_SYRIAC,
-                null,  // USCRIPT_TENGWAR,
-                VAI,
-                null,  // USCRIPT_VISIBLE_SPEECH,
-                CUNEIFORM,
-                null,  // USCRIPT_UNWRITTEN_LANGUAGES,
-                UNKNOWN,
-                CARIAN,
-                null,  // USCRIPT_JAPANESE,
-                TAI_THAM,  // USCRIPT_LANNA (aka TAI_THAM),
-                LYCIAN,
-                LYDIAN,
-                OL_CHIKI,
-                REJANG,
-                SAURASHTRA,
-                null,  // USCRIPT_SIGN_WRITING,
-                SUNDANESE,
-                null,  // USCRIPT_MOON,
-                MEETEI_MAYEK,  // USCRIPT_MEITEI_MAYEK (aka MEETEI, MEITHEI),
-                IMPERIAL_ARAMAIC,
-                AVESTAN,
-                null,  // USCRIPT_CHAKMA,
-                null,  // USCRIPT_KOREAN,
-                KAITHI,
-                null,  // USCRIPT_MANICHAEAN,
-                INSCRIPTIONAL_PAHLAVI,
-                null,  // USCRIPT_PSALTER_PAHLAVI,
-                null,  // USCRIPT_BOOK_PAHLAVI,
-                INSCRIPTIONAL_PARTHIAN,
-                SAMARITAN,
-                TAI_VIET,
-                null,  // USCRIPT_MATHEMATICAL_NOTATION,
-                null,  // USCRIPT_SYMBOLS,
-                BAMUM,
-                LISU,
-                null,  // USCRIPT_NAKHI_GEBA,
-                OLD_SOUTH_ARABIAN,
-                null,  // USCRIPT_BASSA_VAH,
-                null,  // USCRIPT_DUPLOYAN_SHORTAND,
-                null,  // USCRIPT_ELBASAN,
-                null,  // USCRIPT_GRANTHA,
-                null,  // USCRIPT_KPELLE,
-                null,  // USCRIPT_LOMA,
-                null,  // USCRIPT_MENDE,
-                null,  // USCRIPT_MEROITIC_CURSIVE,
-                null,  // USCRIPT_OLD_NORTH_ARABIAN,
-                null,  // USCRIPT_NABATAEAN,
-                null,  // USCRIPT_PALMYRENE,
-                null,  // USCRIPT_SINDHI,
-                null,  // USCRIPT_WARANG_CITI,
-                null,  // USCRIPT_AFAKA,
-                null,  // USCRIPT_JURCHEN,
-                null,  // USCRIPT_MRO,
-                null,  // USCRIPT_NUSHU,
-                null,  // USCRIPT_SHARADA,
-                null,  // USCRIPT_SORA_SOMPENG,
-                null,  // USCRIPT_TAKRI,
-                null,  // USCRIPT_TANGUT,
-                null,  // USCRIPT_WOLEAI,
-                null,  // USCRIPT_ANATOLIAN_HIEROGLYPHS,
-                null,  // USCRIPT_KHOJKI,
-                null,  // USCRIPT_TIRHUTA,
-        };
-
-        /**
-         * Returns the {@link UnicodeScript} value identified by {@code scriptName}.
-         * {@code scriptName} can be a ISO-15924 English script name
-         * or an alias (ISO-15924 script code) for that name.
-         * {@see http://www.unicode.org/iso15924/iso15924-codes.html}
-         * Lookups are case insensitive.
-         *
-         * @throws NullPointerException if {@code scriptName} is null.
-         * @throws IllegalAccessException if {@code scriptName} in invalid.
-         *
-         * @since 1.7
-         */
-        public static UnicodeScript forName(String scriptName) {
-            if (scriptName == null) {
-                throw new NullPointerException("scriptName == null");
-            }
-
-            final int script = unicodeScriptForName(scriptName);
-            if (script == -1 || script >= SCRIPTS.length ||
-                    SCRIPTS[script] == null) {
-                throw new IllegalArgumentException("Unknown script: " + scriptName);
-            }
-
-            return SCRIPTS[script];
-        }
-
-        /**
-         * Returns the {@link UnicodeScript} value that the given Unicode code
-         * point is assigned to.
-         *
-         * @throws IllegalArgumentException if {@code Point} is not a valid Unicode code point.
-         *
-         * @since 1.7
-         */
-        public static UnicodeScript of(int codePoint) {
-            checkValidCodePoint(codePoint);
-            int script = unicodeScriptForCodePoint(codePoint);
-            if (script == -1 || script >= SCRIPTS.length) {
-                // This signifies an ICU error. Complain loudly instead of swallowing
-                // the error up.
-                throw new IllegalArgumentException("Invalid codePoint: " + codePoint);
-            }
-
-            // This happens when ICU maps the code point to a script known to ICU but
-            // not the Java API.
-            if (SCRIPTS[script] == null) {
-                return UNKNOWN;
-            }
-
-            return SCRIPTS[script];
-        }
-    }
-
     private static native int unicodeScriptForName(String blockName);
 
     private static native int unicodeScriptForCodePoint(int codePoint);
diff --git a/luni/src/main/java/java/net/HttpCookie.java b/luni/src/main/java/java/net/HttpCookie.java
index 04121f7..dd81fd6 100644
--- a/luni/src/main/java/java/net/HttpCookie.java
+++ b/luni/src/main/java/java/net/HttpCookie.java
@@ -560,28 +560,6 @@
     }
 
     /**
-     * Returns the {@code HttpOnly} attribute. If {@code true} the cookie should not be accessible
-     * to scripts in a browser.
-     *
-     * @since 1.7
-     * @hide Until ready for an API update
-     */
-    public boolean isHttpOnly() {
-        return httpOnly;
-    }
-
-    /**
-     * Returns the {@code HttpOnly} attribute. If {@code true} the cookie should not be accessible
-     * to scripts in a browser.
-     *
-     * @since 1.7
-     * @hide Until ready for an API update
-     */
-    public void setHttpOnly(boolean httpOnly) {
-        this.httpOnly = httpOnly;
-    }
-
-    /**
      * Returns the value of this cookie.
      */
     public String getValue() {
diff --git a/luni/src/main/java/java/net/SocketOption.java b/luni/src/main/java/java/net/SocketOption.java
deleted file mode 100644
index 3f65494..0000000
--- a/luni/src/main/java/java/net/SocketOption.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package java.net;
-
-/**
- * An option associated with a socket.
- *
- * <p>See {@link java.nio.channels.NetworkChannel#setOption},
- * {@link java.nio.channels.NetworkChannel#getOption} and
- * {@link java.nio.channels.NetworkChannel#supportedOptions} for methods that use SocketOption.
- *
- * <p>See {@link StandardSocketOptions} for valid SocketOptions.
- *
- * @param <T> the type of the value
- * @since 1.7
- * @hide Until ready for a public API change
- */
-public interface SocketOption<T> {
-
-  /**
-   * Returns the name of the option.
-   */
-  String name();
-
-  /**
-   * Returns the type of the value of the option.
-   */
-  Class<T> type();
-}
diff --git a/luni/src/main/java/java/net/StandardSocketOptions.java b/luni/src/main/java/java/net/StandardSocketOptions.java
deleted file mode 100644
index 3d10caf..0000000
--- a/luni/src/main/java/java/net/StandardSocketOptions.java
+++ /dev/null
@@ -1,407 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package java.net;
-
-import java.io.FileDescriptor;
-import java.io.IOException;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-
-import libcore.io.IoBridge;
-
-/**
- * Defines the set standard of socket options that can be supported by network channels.
- *
- * <p>See {@link java.nio.channels.NetworkChannel} for more information, particularly
- * {@link java.nio.channels.NetworkChannel#supportedOptions()} for the options that are supported
- * for each type of socket.
- *
- * @since 1.7
- * @hide Until ready for a public API change
- */
-public final class StandardSocketOptions {
-
-  /**
-   * The outgoing interface for multicast packets.
-   *
-   * <p>See {@link SocketOptions#IP_MULTICAST_IF2} for further documentation.
-   */
-  public static final SocketOption<NetworkInterface> IP_MULTICAST_IF =
-      new NetworkInterfaceSocketOption("IP_MULTICAST_IF", SocketOptions.IP_MULTICAST_IF2);
-
-  /**
-   * Whether the local loopback of multicast packets is enabled (true) or disabled (false). This
-   * option is enabled by default.
-   *
-   * <p>See {@link SocketOptions#IP_MULTICAST_LOOP} for further documentation.
-   */
-  public static final SocketOption<Boolean> IP_MULTICAST_LOOP =
-      new BooleanSocketOption("IP_MULTICAST_LOOP", SocketOptions.IP_MULTICAST_LOOP);
-
-  /**
-   * The time-to-live (TTL) for multicast packets. The value must be between 0 and 255 inclusive.
-   * A 0 value restricts the packet to the originating host. See also {@link #IP_MULTICAST_LOOP}.
-   * The default value is 1.
-   *
-   * <p>See <a href="http://tools.ietf.org/rfc/rfc1112.txt">RFC 1112: Host Extensions for IP
-   * Multicasting</a> for more information about IP multicast.
-   */
-  public static final SocketOption<Integer> IP_MULTICAST_TTL =
-      new ByteRangeSocketOption("IP_MULTICAST_TTL", IoBridge.JAVA_IP_MULTICAST_TTL);
-
-  /**
-   * The value for the type-of-service field of the IPv4 header, or the traffic class field of the
-   * IPv6 header. These correspond to the IP_TOS and IPV6_TCLASS socket options. These may be
-   * ignored by the underlying OS. Values must be between 0 and 255 inclusive.
-   *
-   * <p>See {@link SocketOptions#IP_TOS} for further documentation.
-   */
-  public static final SocketOption<Integer> IP_TOS =
-      new ByteRangeSocketOption("IP_TOS", SocketOptions.IP_TOS);
-
-  /**
-   * Whether broadcasting on datagram sockets is enabled or disabled. This option must be enabled to
-   * send broadcast messages. The default value is false.
-   *
-   * <p>See {@link SocketOptions#SO_BROADCAST} for further documentation.
-   */
-  public static final SocketOption<Boolean> SO_BROADCAST =
-      new BooleanSocketOption("SO_BROADCAST", SocketOptions.SO_BROADCAST);
-
-  /**
-   * Whether the kernel sends keepalive messages on connection-oriented sockets.
-   *
-   * <p>See {@link SocketOptions#SO_KEEPALIVE} for further documentation.
-   */
-  public static final SocketOption<Boolean> SO_KEEPALIVE =
-      new BooleanSocketOption("SO_KEEPALIVE", SocketOptions.SO_KEEPALIVE);
-
-  /**
-   * Number of seconds to wait when closing a socket if there is still some buffered data to be
-   * sent.
-   *
-   * <p>If this option is negative this option is disabled. This is the default value. If the value
-   * is 0 or positive it is enabled.
-   *
-   * <p>See {@link SocketOptions#SO_LINGER} for further documentation.
-   *
-   */
-  public static final SocketOption<Integer> SO_LINGER =
-      new SocketOptionImpl<Integer>("SO_LINGER", Integer.class, SocketOptions.SO_LINGER) {
-        @Override
-        protected Object validateAndConvertValueBeforeSet(
-            FileDescriptor fd, Integer value) {
-          Object objectValue = super.validateAndConvertValueBeforeSet(fd, value);
-          if (value != null && value < 0) {
-            // IoBridge requires a "false" object to disable linger.
-            objectValue = Boolean.FALSE;
-          }
-          return objectValue;
-        }
-
-        @Override
-        protected Integer validateAndConvertValueAfterGet(FileDescriptor fd, Object value) {
-          // IoBridge returns a "false" object to indicate that linger is disabled.
-          if (value != null && value instanceof Boolean) {
-            value = -1;
-          }
-          return super.validateAndConvertValueAfterGet(fd, value);
-        }
-      };
-
-  /**
-   * The size in bytes of a socket's receive buffer. This must be an integer greater than 0.
-   * This is a hint to the kernel; the kernel may use a larger buffer.
-   *
-   * <p>See {@link SocketOptions#SO_RCVBUF} for further documentation.
-   */
-  public static final SocketOption<Integer> SO_RCVBUF =
-      new PositiveIntegerSocketOption("SO_RCVBUF", SocketOptions.SO_RCVBUF);
-
-  /**
-   * Whether a reuse of a local address is allowed when another socket has not yet been removed by
-   * the operating system.
-   *
-   * <p>See {@link SocketOptions#SO_REUSEADDR} for further documentation.
-   */
-  public static final SocketOption<Boolean> SO_REUSEADDR =
-      new BooleanSocketOption("SO_REUSEADDR", SocketOptions.SO_REUSEADDR);
-
-  /**
-   * The size in bytes of a socket's send buffer. This must be an integer greater than 0.
-   * This is a hint to the kernel; the kernel may use a larger buffer.
-   *
-   * <p>See {@link SocketOptions#SO_SNDBUF} for further documentation.
-   */
-  public static final SocketOption<Integer> SO_SNDBUF =
-      new PositiveIntegerSocketOption("SO_SNDBUF", SocketOptions.SO_SNDBUF);
-
-  /**
-   * Specifies whether data is sent immediately on this socket or buffered.
-   *
-   * <p>See {@link SocketOptions#TCP_NODELAY} for further documentation.
-   */
-  public static final SocketOption<Boolean> TCP_NODELAY =
-      new BooleanSocketOption("TCP_NODELAY", SocketOptions.TCP_NODELAY);
-
-  /**
-   * The set of supported options for UDP sockets.
-   *
-   * @hide internal use only
-   */
-  public static final Set<SocketOption<?>> DATAGRAM_SOCKET_OPTIONS;
-
-  static {
-    HashSet<SocketOption<?>> mutableSet = new HashSet<SocketOption<?>>(8);
-    mutableSet.add(IP_MULTICAST_IF);
-    mutableSet.add(IP_MULTICAST_LOOP);
-    mutableSet.add(IP_MULTICAST_TTL);
-    mutableSet.add(IP_TOS);
-    mutableSet.add(SO_BROADCAST);
-    mutableSet.add(SO_REUSEADDR);
-    mutableSet.add(SO_RCVBUF);
-    mutableSet.add(SO_SNDBUF);
-    DATAGRAM_SOCKET_OPTIONS = Collections.unmodifiableSet(mutableSet);
-  }
-
-  /**
-   * The set of supported options for TCP sockets.
-   *
-   * @hide internal use only
-   */
-  public static final Set<SocketOption<?>> SOCKET_OPTIONS;
-
-  static {
-    HashSet<SocketOption<?>> mutableSet = new HashSet<SocketOption<?>>(7);
-    mutableSet.add(IP_TOS);
-    mutableSet.add(SO_KEEPALIVE);
-    mutableSet.add(SO_LINGER);
-    mutableSet.add(TCP_NODELAY);
-    mutableSet.add(SO_RCVBUF);
-    mutableSet.add(SO_REUSEADDR);
-    mutableSet.add(SO_SNDBUF);
-    SOCKET_OPTIONS = Collections.unmodifiableSet(mutableSet);
-  }
-
-  /**
-   * The set of supported options for TCP server sockets.
-   *
-   * @hide internal use only
-   */
-  public static final Set<SocketOption<?>> SERVER_SOCKET_OPTIONS;
-
-  static {
-    HashSet<SocketOption<?>> mutableSet = new HashSet<SocketOption<?>>(2);
-    mutableSet.add(SO_RCVBUF);
-    mutableSet.add(SO_REUSEADDR);
-    SERVER_SOCKET_OPTIONS = Collections.unmodifiableSet(mutableSet);
-  }
-
-  /**
-   * A base class for SocketOption objects that passes the values to/from {@link IoBridge} as they
-   * are. For use with simple types like Integer and Boolean, and can be extended for more
-   * validation / type conversion.
-   *
-   * @hide internal use only
-   */
-  public static class SocketOptionImpl<T> implements SocketOption<T> {
-
-    protected final String name;
-
-    private final Class<T> type;
-
-    protected final int socketOption;
-
-    public SocketOptionImpl(String name, Class<T> type, int socketOption) {
-      this.name = name;
-      this.type = type;
-      this.socketOption = socketOption;
-    }
-
-    @Override
-    public String name() {
-      return name;
-    }
-
-    @Override
-    public Class<T> type() {
-      return type;
-    }
-
-    /**
-     * Sets the socket option of the file descriptor to value using IoBridge.
-     *
-     * @hide internal method
-     */
-    public final void setValue(FileDescriptor fd, T value) throws IOException {
-      // Sanity check required because of type erasure.
-      if (value != null && !type.isAssignableFrom(value.getClass())) {
-        throw new AssertionError("Invalid type " + value + " of value for " + name);
-      }
-      Object objectValue = validateAndConvertValueBeforeSet(fd, value);
-      IoBridge.setSocketOption(fd, socketOption, objectValue);
-    }
-
-    /**
-     * Throws IllegalArgumentException if the value is outside of the acceptable range.
-     * Subclasses can override to apply option-specific validate, and may also convert the value
-     * to a different type or value. The default implementation prevents null values and returns
-     * the value unchanged.
-     */
-    protected Object validateAndConvertValueBeforeSet(FileDescriptor fd, T value) {
-      if (value == null) {
-        throw new IllegalArgumentException("value for " + name + " must not be null");
-      }
-      return value;
-    }
-
-    /**
-     * Gets the value of the socket option.
-     *
-     * @hide internal method
-     */
-    public final T getValue(FileDescriptor fd) throws IOException {
-      Object value = IoBridge.getSocketOption(fd, socketOption);
-      T typedValue = validateAndConvertValueAfterGet(fd, value);
-      if (typedValue != null && !type.isAssignableFrom(typedValue.getClass())) {
-        // Sanity check required because of type erasure.
-        throw new AssertionError("Unexpected type of value returned for " + name);
-      }
-      return typedValue;
-    }
-
-    /**
-     * Throws AssertionError if the value is outside of the acceptable range.
-     * Implementations may also convert the value to a different type or
-     * value. The default implementation does nothing.
-     */
-    @SuppressWarnings("unchecked")
-    protected T validateAndConvertValueAfterGet(FileDescriptor fd, Object value) {
-      return (T) value;
-    }
-  }
-
-  /**
-   * A SocketOption capable of setting / getting an boolean value.
-   */
-  private static class BooleanSocketOption extends SocketOptionImpl<Boolean> {
-
-    public BooleanSocketOption(String name, int socketOption) {
-      super(name, Boolean.class, socketOption);
-    }
-  }
-
-  /**
-   * A SocketOption capable of setting / getting an network interface value.
-   */
-  private static class NetworkInterfaceSocketOption extends SocketOptionImpl<NetworkInterface> {
-
-    public NetworkInterfaceSocketOption(String name, int socketOption) {
-      super(name, NetworkInterface.class, socketOption);
-    }
-
-    @Override
-    public Integer validateAndConvertValueBeforeSet(FileDescriptor fd, NetworkInterface value) {
-      if (value == null) {
-        throw new IllegalArgumentException("value for " + name + " must not be null");
-      }
-      int nicIndex = value.getIndex();
-      if (nicIndex == -1) {
-        throw new IllegalArgumentException("The NetworkInterface must have a valid index");
-      }
-      return nicIndex;
-    }
-
-    @Override
-    public NetworkInterface validateAndConvertValueAfterGet(FileDescriptor fd, Object value) {
-      if (value == null) {
-        return null;
-      } else if (!(value instanceof Integer)) {
-        throw new AssertionError("Unexpected type of value returned for " + name);
-      }
-
-      int nicIndex = (Integer) value;
-      try {
-        return NetworkInterface.getByIndex(nicIndex);
-      } catch (SocketException e) {
-        throw new IllegalArgumentException(
-            "Unable to resolve NetworkInterface index: " + nicIndex, e);
-      }
-    }
-  }
-
-  /**
-   * A SocketOption capable of setting / getting an integer in the range 0-255.
-   */
-  private static class ByteRangeSocketOption extends SocketOptionImpl<Integer> {
-
-    public ByteRangeSocketOption(String name, int socketOption) {
-      super(name, Integer.class, socketOption);
-    }
-
-    @Override
-    protected Object validateAndConvertValueBeforeSet(FileDescriptor fd, Integer value) {
-      if (value == null || value < 0 || value > 255) {
-        throw new IllegalArgumentException(name + " must be >= 0 and <= 255, is " + value);
-      }
-      return value;
-    }
-
-    @Override
-    protected Integer validateAndConvertValueAfterGet(FileDescriptor fd, Object value) {
-      if (!(value instanceof Integer)) {
-        throw new AssertionError("Unexpected value for option " + name + ": " + value);
-      }
-      int intValue = (Integer) value;
-      if (intValue < 0 || intValue > 255) {
-        throw new AssertionError("Unexpected value for option " + name + ": " + value);
-      }
-      return intValue;
-    }
-  }
-
-  /**
-   * A SocketOption capable of setting / getting an integer in the range 1..
-   */
-  private static class PositiveIntegerSocketOption extends SocketOptionImpl<Integer> {
-
-    public PositiveIntegerSocketOption(String name, int socketOption) {
-      super(name, Integer.class, socketOption);
-    }
-
-    @Override
-    protected Integer validateAndConvertValueBeforeSet(FileDescriptor fd, Integer value) {
-      if (value < 1) {
-        throw new IllegalArgumentException(name + " value must be > 0");
-      }
-      return value;
-    }
-
-    @Override
-    protected Integer validateAndConvertValueAfterGet(FileDescriptor fd, Object value) {
-      if (!(value instanceof Integer)) {
-        throw new AssertionError("Unexpected value for option " + name + ": " + value);
-      }
-      int intValue = (Integer) value;
-      if (intValue < 1) {
-        throw new AssertionError("Unexpected value for option " + name + ": " + value);
-      }
-      return intValue;
-    }
-  }
-}
diff --git a/luni/src/main/java/java/nio/DatagramChannelImpl.java b/luni/src/main/java/java/nio/DatagramChannelImpl.java
index 8a5dbb6..e736c40 100644
--- a/luni/src/main/java/java/nio/DatagramChannelImpl.java
+++ b/luni/src/main/java/java/nio/DatagramChannelImpl.java
@@ -32,14 +32,10 @@
 import java.net.PlainDatagramSocketImpl;
 import java.net.SocketAddress;
 import java.net.SocketException;
-import java.net.SocketOption;
-import java.net.StandardSocketOptions;
-import java.nio.channels.AlreadyBoundException;
 import java.nio.channels.AlreadyConnectedException;
 import java.nio.channels.ClosedChannelException;
 import java.nio.channels.DatagramChannel;
 import java.nio.channels.IllegalBlockingModeException;
-import java.nio.channels.MembershipKey;
 import java.nio.channels.NotYetConnectedException;
 import java.nio.channels.spi.SelectorProvider;
 import java.nio.channels.UnresolvedAddressException;
@@ -79,9 +75,6 @@
     private final Object readLock = new Object();
     private final Object writeLock = new Object();
 
-    // A helper to manage multicast group membership. Created as required.
-    private MulticastMembershipHandler multicastMembershipHandler;
-
     /*
      * Constructor
      */
@@ -112,29 +105,6 @@
         return socket;
     }
 
-    /** @hide Until ready for a public API change */
-    @Override
-    synchronized public DatagramChannel bind(SocketAddress local) throws IOException {
-        checkOpen();
-        if (isBound) {
-            throw new AlreadyBoundException();
-        }
-
-        if (local == null) {
-            local = new InetSocketAddress(Inet4Address.ANY, 0);
-        } else if (!(local instanceof InetSocketAddress)) {
-            throw new UnsupportedAddressTypeException();
-        }
-
-        InetSocketAddress localAddress = (InetSocketAddress) local;
-        if (localAddress.isUnresolved()) {
-            throw new UnresolvedAddressException();
-        }
-        IoBridge.bind(fd, localAddress.getAddress(), localAddress.getPort());
-        onBind(true /* updateSocketState */);
-        return this;
-    }
-
     /**
      * Initialise the isBound, localAddress and localPort state from the file descriptor. Used when
      * some or all of the bound state has been left to the OS to decide, or when the Socket handled
@@ -162,34 +132,6 @@
 
     /** @hide Until ready for a public API change */
     @Override
-    synchronized public SocketAddress getLocalAddress() throws IOException {
-        checkOpen();
-        return isBound ? new InetSocketAddress(localAddress, localPort) : null;
-    }
-
-    /** @hide Until ready for a public API change */
-    @Override
-    public <T> T getOption(SocketOption<T> option) throws IOException {
-        return NioUtils.getSocketOption(
-                this, StandardSocketOptions.DATAGRAM_SOCKET_OPTIONS, option);
-    }
-
-    /** @hide Until ready for a public API change */
-    @Override
-    public <T> DatagramChannel setOption(SocketOption<T> option, T value) throws IOException {
-        checkOpen();
-        NioUtils.setSocketOption(
-                this, StandardSocketOptions.DATAGRAM_SOCKET_OPTIONS, option, value);
-        return this;
-    }
-
-    /** @hide Until ready for a public API change */
-    @Override
-    public Set<SocketOption<?>> supportedOptions() {
-        return StandardSocketOptions.DATAGRAM_SOCKET_OPTIONS;
-    }
-
-    @Override
     synchronized public boolean isConnected() {
         return connected;
     }
@@ -524,7 +466,6 @@
         // A closed channel is not connected.
         onDisconnect(true /* updateSocketState */);
         IoBridge.closeAndSignalBlockedThreads(fd);
-        multicastMembershipHandler = null;
 
         if (socket != null && !socket.isClosed()) {
             socket.onClose();
@@ -570,52 +511,6 @@
         return fd;
     }
 
-    @Override
-    synchronized public MembershipKey join(InetAddress groupAddress,
-        NetworkInterface networkInterface) throws IOException {
-
-        checkOpen();
-        ensureMembershipHandlerExists();
-        return multicastMembershipHandler.addAnySourceMembership(networkInterface, groupAddress);
-    }
-
-    @Override
-    synchronized public MembershipKey join(
-            InetAddress groupAddress, NetworkInterface networkInterface, InetAddress sourceAddress)
-            throws IOException {
-        checkOpen();
-        ensureMembershipHandlerExists();
-        return multicastMembershipHandler.addSourceSpecificMembership(
-                networkInterface, groupAddress, sourceAddress);
-    }
-
-    synchronized void multicastDrop(MembershipKeyImpl membershipKey) {
-        ensureMembershipHandlerExists();
-        multicastMembershipHandler.dropMembership(membershipKey);
-    }
-
-    synchronized void multicastBlock(MembershipKeyImpl membershipKey, InetAddress sourceAddress)
-            throws SocketException {
-
-        ensureMembershipHandlerExists();
-        multicastMembershipHandler.block(membershipKey, sourceAddress);
-    }
-
-    synchronized void multicastUnblock(MembershipKeyImpl membershipKey, InetAddress sourceAddress) {
-        ensureMembershipHandlerExists();
-        multicastMembershipHandler.unblock(membershipKey, sourceAddress);
-    }
-
-    /**
-     * Creates the {@code multicastMembershipHandler} if one doesn't already exist. Callers must
-     * handle synchronization.
-     */
-    private void ensureMembershipHandlerExists() {
-        if (multicastMembershipHandler == null) {
-            multicastMembershipHandler = new MulticastMembershipHandler(this);
-        }
-    }
-
     /*
      * The adapter class of DatagramSocket
      */
diff --git a/luni/src/main/java/java/nio/MembershipKeyImpl.java b/luni/src/main/java/java/nio/MembershipKeyImpl.java
deleted file mode 100644
index 3d7e957..0000000
--- a/luni/src/main/java/java/nio/MembershipKeyImpl.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package java.nio;
-
-import java.io.IOException;
-import java.net.InetAddress;
-import java.net.NetworkInterface;
-import java.nio.channels.MembershipKey;
-import java.nio.channels.MulticastChannel;
-
-/**
- * An implementation of {@link MembershipKey}.
- *
- * To keep this class simple and keep all mutation operations in one place and easily synchronized,
- * most socket logic is held in {@link java.nio.DatagramChannelImpl}.
- */
-final class MembershipKeyImpl extends MembershipKey {
-
-  private final DatagramChannelImpl channel;
-  private final InetAddress groupAddress;
-  private final NetworkInterface networkInterface;
-  private final InetAddress sourceAddress;
-  private volatile boolean isValid;
-
-  public MembershipKeyImpl(DatagramChannelImpl channel, NetworkInterface networkInterface,
-      InetAddress groupAddress, InetAddress sourceAddress) {
-
-    this.channel = channel;
-    this.networkInterface = networkInterface;
-    this.groupAddress = groupAddress;
-    this.sourceAddress = sourceAddress;
-    this.isValid = true;
-  }
-
-  @Override
-  public boolean isValid() {
-    // invalidate() is called if the key is dropped, but for simplicity it is not
-    // invalidated when the channel is closed. Therefore, the channel must also be checked to see
-    // if it is still open.
-    return isValid && channel.isOpen();
-  }
-
-  void invalidate() {
-    this.isValid = false;
-  }
-
-  @Override
-  public void drop() {
-    channel.multicastDrop(this);
-  }
-
-  @Override
-  public MembershipKey block(InetAddress source) throws IOException {
-    channel.multicastBlock(this, source);
-    return this;
-  }
-
-  @Override
-  synchronized public MembershipKey unblock(InetAddress source) {
-    channel.multicastUnblock(this, source);
-    return this;
-  }
-
-  @Override
-  public MulticastChannel channel() {
-    return channel;
-  }
-
-  @Override
-  public InetAddress group() {
-    return groupAddress;
-  }
-
-  @Override
-  public NetworkInterface networkInterface() {
-    return networkInterface;
-  }
-
-  @Override
-  public InetAddress sourceAddress() {
-    return sourceAddress;
-  }
-
-  @Override
-  public String toString() {
-    return "MembershipKeyImpl{" +
-      "groupAddress=" + groupAddress +
-      ", networkInterface=" + networkInterface +
-      ", sourceAddress=" + sourceAddress +
-      '}';
-    }
-}
diff --git a/luni/src/main/java/java/nio/MulticastMembershipHandler.java b/luni/src/main/java/java/nio/MulticastMembershipHandler.java
deleted file mode 100644
index 2fe8130..0000000
--- a/luni/src/main/java/java/nio/MulticastMembershipHandler.java
+++ /dev/null
@@ -1,495 +0,0 @@
-package java.nio;
-
-import android.system.StructGroupReq;
-import android.system.StructGroupSourceReq;
-import java.net.InetAddress;
-import java.net.NetworkInterface;
-import java.net.SocketException;
-import java.nio.channels.MembershipKey;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import libcore.io.IoBridge;
-
-/**
- * A helper class for {@link DatagramChannelImpl} that keeps track of multicast group
- * memberships. This class is not threadsafe, and relies on the DatagramChannelImpl to synchronize.
- *
- * <p>See <a href="http://tools.ietf.org/html/rfc3678">RFC 3678</a> for context and terminology.
- */
-final class MulticastMembershipHandler {
-
-  private final DatagramChannelImpl channel;
-  private final Map<Id, Membership> memberships = new HashMap<Id, Membership>();
-
-  MulticastMembershipHandler(DatagramChannelImpl channel) {
-    this.channel = channel;
-  }
-
-  /**
-   * The implementation for
-   * {@link java.nio.channels.MulticastChannel#join(InetAddress, NetworkInterface)}.
-   */
-  public MembershipKeyImpl addAnySourceMembership(
-      NetworkInterface networkInterface, InetAddress groupAddress) throws SocketException {
-
-    validateMulticastGroupArgs(groupAddress, networkInterface);
-    assertChannelOpen();
-
-    Id id = new Id(networkInterface, groupAddress);
-    Membership membership = memberships.get(id);
-    if (membership != null) {
-      return membership.getAnySourceMembershipKey();
-    }
-
-    // No existing membership found. Attempt to join.
-    StructGroupReq groupReq = makeGroupReq(groupAddress, networkInterface);
-    IoBridge.setSocketOption(channel.getFD(), IoBridge.JAVA_MCAST_JOIN_GROUP, groupReq);
-
-    // Record the membership and return the key.
-    membership = Membership.createAnySource(channel, networkInterface, groupAddress);
-    memberships.put(id, membership);
-    return membership.getAnySourceMembershipKey();
-  }
-
-  /**
-   * The implementation for
-   * {@link java.nio.channels.MulticastChannel#join(InetAddress, NetworkInterface, InetAddress)}.
-   */
-  public MembershipKeyImpl addSourceSpecificMembership(
-      NetworkInterface networkInterface, InetAddress groupAddress, InetAddress sourceAddress)
-      throws SocketException {
-
-    validateMulticastGroupArgs(groupAddress, networkInterface);
-    validateSourceAddress(sourceAddress);
-    validateAddressProtocolTheSame(groupAddress, sourceAddress);
-    assertChannelOpen();
-
-    Id id = new Id(networkInterface, groupAddress);
-    Membership membership = memberships.get(id);
-    if (membership != null) {
-      MembershipKeyImpl existingMembershipKey =
-          membership.getSourceSpecificMembershipKey(sourceAddress);
-      if (existingMembershipKey != null) {
-        return existingMembershipKey;
-      }
-    }
-
-    // No existing membership found. Attempt to join.
-    IoBridge.setSocketOption(channel.getFD(), IoBridge.JAVA_MCAST_JOIN_SOURCE_GROUP,
-        makeGroupSourceReq(groupAddress, networkInterface, sourceAddress));
-
-    if (membership == null) {
-      // Record the membership and return the key.
-      membership = Membership.createSourceSpecific(
-          channel, networkInterface, groupAddress, sourceAddress);
-      memberships.put(id, membership);
-      return membership.getSourceSpecificMembershipKey(sourceAddress);
-    } else {
-      // Add a new source to the existing membership.
-      return membership.addSource(sourceAddress);
-    }
-  }
-
-  /**
-   * The implementation for {@link MembershipKey#drop()}.
-   */
-  public void dropMembership(MembershipKeyImpl membershipKey) {
-    // For compatibility with the RI, this is one case where the membershipKey can no longer be
-    // valid.
-    if (!membershipKey.isValid()) {
-      return;
-    }
-    if (membershipKey.channel() != this.channel) {
-      throw new AssertionError("Bad membership key");
-    }
-    assertChannelOpen();
-
-    Id id = createId(membershipKey);
-    Membership membership = memberships.get(id);
-    if (membership == null) {
-      throw new AssertionError("Bad membership key" + membershipKey);
-    }
-
-    if (!membership.isSourceSpecific()) {
-      try {
-        StructGroupReq groupReq =
-            makeGroupReq(membershipKey.group(), membershipKey.networkInterface());
-        IoBridge.setSocketOption(channel.getFD(), IoBridge.JAVA_MCAST_LEAVE_GROUP, groupReq);
-      } catch (SocketException e) {
-        // TODO: Obtain opinion on how to report this, throw this or if it is safe to ignore.
-        throw new IllegalStateException(e);
-      }
-      memberships.remove(id);
-    } else {
-      StructGroupSourceReq groupSourceReq = makeGroupSourceReq(membershipKey.group(),
-          membershipKey.networkInterface(), membershipKey.sourceAddress());
-
-      try {
-        IoBridge.setSocketOption(
-            channel.getFD(), IoBridge.JAVA_MCAST_LEAVE_SOURCE_GROUP,
-            groupSourceReq);
-      } catch (SocketException e) {
-        // TODO: Obtain opinion on how to report this, throw this or if it is safe to ignore.
-        throw new IllegalStateException(e);
-      }
-
-      boolean isLast = membership.removeSource(membershipKey.sourceAddress());
-      if (isLast) {
-        memberships.remove(id);
-      }
-    }
-    membershipKey.invalidate();
-  }
-
-  /**
-   * The implementation for {@link MembershipKey#block(java.net.InetAddress)}.
-   */
-  public void block(MembershipKeyImpl membershipKey, InetAddress sourceAddress)
-      throws SocketException {
-    validateMembershipKey(membershipKey);
-    validateSourceAddress(sourceAddress);
-    validateAddressProtocolTheSame(membershipKey.group(), sourceAddress);
-    assertChannelOpen();
-
-    Membership membership = getMembershipForKey(membershipKey);
-    if (membership == null) {
-      throw new AssertionError("Bad membership key" + membershipKey);
-    }
-
-    if (membership.isBlocked(sourceAddress)) {
-      return;
-    }
-
-    IoBridge.setSocketOption(channel.getFD(), IoBridge.JAVA_MCAST_BLOCK_SOURCE,
-        makeGroupSourceReq(
-            membershipKey.group(), membershipKey.networkInterface(), sourceAddress));
-
-    membership.block(sourceAddress);
-  }
-
-  /**
-   * The implementation for {@link MembershipKey#unblock(java.net.InetAddress)}.
-   */
-  public void unblock(MembershipKeyImpl membershipKey, InetAddress sourceAddress) {
-    validateMembershipKey(membershipKey);
-    validateSourceAddress(sourceAddress);
-    validateAddressProtocolTheSame(membershipKey.group(), sourceAddress);
-    assertChannelOpen();
-
-    Membership membership = getMembershipForKey(membershipKey);
-    if (membership == null) {
-      throw new AssertionError("Bad membership key" + membershipKey);
-    }
-
-    if (!membership.isBlocked(sourceAddress)) {
-      throw new IllegalStateException(
-          "sourceAddress " + sourceAddress + " is not blocked for " + membership.debugId());
-    }
-
-    try {
-      IoBridge.setSocketOption(channel.getFD(), IoBridge.JAVA_MCAST_UNBLOCK_SOURCE,
-          makeGroupSourceReq(membershipKey.group(), membershipKey.networkInterface(),
-              sourceAddress));
-    } catch (SocketException e) {
-      throw new IllegalStateException(e);
-    }
-
-    membership.unblock(sourceAddress);
-  }
-
-  private Membership getMembershipForKey(MembershipKey membershipKey) {
-    Id id = createId(membershipKey);
-    Membership membership = memberships.get(id);
-    if (membership == null) {
-      throw new AssertionError("No membership found for id " + id);
-    }
-    return membership;
-  }
-
-  private void assertChannelOpen() {
-    if (!channel.isOpen()) {
-      throw new AssertionError("Channel is closed");
-    }
-  }
-
-  private void validateMembershipKey(MembershipKeyImpl membershipKey) {
-    if (membershipKey.channel() != this.channel) {
-      throw new AssertionError("Invalid or bad membership key");
-    }
-    if (!membershipKey.isValid()) {
-      throw new IllegalStateException("Membership key is no longer valid: " + membershipKey);
-    }
-  }
-
-  private static Id createId(MembershipKey membershipKey) {
-    return new Id(membershipKey.networkInterface(), membershipKey.group());
-  }
-
-  private static void validateSourceAddress(InetAddress sourceAddress) {
-    if (sourceAddress.isAnyLocalAddress()) {
-      throw new IllegalArgumentException(
-          "sourceAddress must not be a wildcard address, is " + sourceAddress);
-    }
-    if (sourceAddress.isMulticastAddress()) {
-      throw new IllegalArgumentException(
-          "sourceAddress must be a unicast address, is " + sourceAddress);
-    }
-  }
-
-  private static void validateMulticastGroupArgs(
-      InetAddress groupAddress, NetworkInterface networkInterface) throws SocketException {
-
-    if (groupAddress == null) {
-      // RI throws NullPointerException.
-      throw new NullPointerException("groupAddress == null");
-    }
-    if (networkInterface == null) {
-      // RI throws NullPointerException.
-      throw new NullPointerException("networkInterface == null");
-    }
-    if (!networkInterface.isLoopback() && !networkInterface.supportsMulticast()) {
-      throw new IllegalArgumentException(
-          "networkInterface " + networkInterface + " does not support multicast");
-    }
-    if (!groupAddress.isMulticastAddress()) {
-      throw new IllegalArgumentException("Not a multicast group: " + groupAddress);
-    }
-  }
-
-  private static void validateAddressProtocolTheSame(
-      InetAddress groupAddress, InetAddress sourceAddress) {
-
-    if (groupAddress.getClass() != sourceAddress.getClass()) {
-      throw new IllegalArgumentException("Mixed address types not permitted: groupAddress: " +
-          groupAddress + ", sourceAddress: " + sourceAddress);
-    }
-  }
-
-  private static StructGroupSourceReq makeGroupSourceReq(
-      InetAddress gsr_group, NetworkInterface networkInterface, InetAddress gsr_source) {
-    int gsr_interface = (networkInterface != null) ? networkInterface.getIndex() : 0;
-    return new StructGroupSourceReq(gsr_interface, gsr_group, gsr_source);
-  }
-
-  private static StructGroupReq makeGroupReq(InetAddress gr_group,
-      NetworkInterface networkInterface) {
-    int gr_interface = (networkInterface != null) ? networkInterface.getIndex() : 0;
-    return new StructGroupReq(gr_interface, gr_group);
-  }
-
-  /**
-   * Membership information associated with an {@link Id}. A membership can be one of two types:
-   * "source-specific" and "any-source". The two types a mutually exclusive for a given Id.
-   */
-  static final class Membership {
-
-    private final DatagramChannelImpl channel;
-    private final InetAddress groupAddress;
-    private final NetworkInterface networkInterface;
-
-    // Any-source membership key. Mutually exclusive with sourceSpecificMembershipKeys.
-    private final MembershipKeyImpl anySourceMembershipKey;
-    // Blocked source addresses for any-source memberships. Assigned when required.
-    private Set<InetAddress> blockedSourceAddresses;
-
-    // Source-specific membership keys. Mutually exclusive with anySourceMembershipKey.
-    private final Map<InetAddress, MembershipKeyImpl> sourceSpecificMembershipKeys;
-
-    /** Use {@link #createSourceSpecific} or {@link #createAnySource} to construct. */
-    private Membership(
-        DatagramChannelImpl channel,
-        InetAddress groupAddress,
-        NetworkInterface networkInterface,
-        MembershipKeyImpl anySourceMembershipKey,
-        Map<InetAddress, MembershipKeyImpl> sourceSpecificMembershipKeys) {
-
-      this.channel = channel;
-      this.groupAddress = groupAddress;
-      this.networkInterface = networkInterface;
-      this.anySourceMembershipKey = anySourceMembershipKey;
-      this.sourceSpecificMembershipKeys = sourceSpecificMembershipKeys;
-    }
-
-    /** Creates an any-source membership. */
-    public static Membership createAnySource(DatagramChannelImpl channel,
-        NetworkInterface networkInterface, InetAddress groupAddress) {
-
-      MembershipKeyImpl withoutSourceAddressKey =
-          new MembershipKeyImpl(channel, networkInterface, groupAddress, null /* sourceAddress */);
-      return new Membership(
-          channel, groupAddress, networkInterface, withoutSourceAddressKey,
-          null /* sourceSpecificMembershipKeys */);
-    }
-
-    /**
-     * Creates a source-specific membership. See {@link #addSource} to add additional source
-     * addresses.
-     */
-    public static Membership createSourceSpecific(DatagramChannelImpl channel,
-        NetworkInterface networkInterface, InetAddress groupAddress, InetAddress sourceAddress) {
-
-      Map<InetAddress, MembershipKeyImpl> withSourceKeys =
-          new HashMap<InetAddress, MembershipKeyImpl>();
-      Membership membership = new Membership(
-          channel, groupAddress, networkInterface, null /* anySourceMembershipKey */,
-          withSourceKeys);
-      membership.addSource(sourceAddress);
-      return membership;
-    }
-
-    /**
-     * Adds a new source address filter to an existing membership, returning the associated
-     * {@link MembershipKeyImpl}. Throws an {@code IllegalStateException} if this is an
-     * any-source membership.
-     */
-    public MembershipKeyImpl addSource(InetAddress sourceAddress) {
-      if (sourceSpecificMembershipKeys == null) {
-        throw new IllegalStateException(
-            "Can only add sources to source-specific memberships: " + debugId());
-      }
-
-      MembershipKeyImpl membershipKey =
-          new MembershipKeyImpl(channel, networkInterface, groupAddress, sourceAddress);
-      sourceSpecificMembershipKeys.put(sourceAddress, membershipKey);
-      return membershipKey;
-    }
-
-    /**
-     * Removes the specified {@code sourceAddress} from the set of filters. Returns {@code true} if
-     * the set of filters is now empty. Throws an {@code IllegalStateException} if this is an
-     * any-source membership.
-     */
-    public boolean removeSource(InetAddress sourceAddress) {
-      if (sourceSpecificMembershipKeys == null) {
-        throw new IllegalStateException(
-            "Can only remove sources from source-specific memberships: " + debugId());
-      }
-      sourceSpecificMembershipKeys.remove(sourceAddress);
-      return sourceSpecificMembershipKeys.isEmpty();
-    }
-
-    /**
-     * Returns {@code true} if the membership source-specific, false if it is any-source.
-     */
-    public boolean isSourceSpecific() {
-      return sourceSpecificMembershipKeys != null;
-    }
-
-    /**
-     * Returns the {@link MembershipKeyImpl} for this membership. Throws an
-     * {@code IllegalStateException} if this is not an any-source membership.
-     */
-    public MembershipKeyImpl getAnySourceMembershipKey() {
-      if (sourceSpecificMembershipKeys != null) {
-        throw new IllegalStateException(
-            "There an existing source-specific membership for " + debugId());
-      }
-      return anySourceMembershipKey;
-    }
-
-    /**
-     * Returns the {@link MembershipKeyImpl} for the specified {@code sourceAddress}. Throws an
-     * {@code IllegalStateException} if this is not a source-specific membership.
-     */
-    public MembershipKeyImpl getSourceSpecificMembershipKey(InetAddress sourceAddress) {
-      if (anySourceMembershipKey != null) {
-        throw new IllegalStateException("There an existing any-source membership for " + debugId());
-      }
-      return sourceSpecificMembershipKeys.get(sourceAddress);
-    }
-
-    /**
-     * Returns {@code true} if there is an existing block for the specified address. Throws an
-     * {@code IllegalStateException} if this is not an any-source membership.
-     */
-    public boolean isBlocked(InetAddress sourceAddress) {
-      if (anySourceMembershipKey == null) {
-        throw new IllegalStateException(
-            "block()/unblock() are only applicable for any-source memberships: " + debugId());
-      }
-      return blockedSourceAddresses != null && blockedSourceAddresses.contains(sourceAddress);
-    }
-
-    /**
-     * Adds a blocked address to this membership. Throws an {@code IllegalStateException} if
-     * the address is already blocked. Throws an {@code IllegalStateException} if this is not an
-     * any-source membership.
-     */
-    public void block(InetAddress sourceAddress) {
-      if (anySourceMembershipKey == null) {
-        throw new IllegalStateException(
-            "block() is not supported for source-specific group memberships: " + debugId());
-      }
-      if (blockedSourceAddresses == null) {
-        blockedSourceAddresses = new HashSet<InetAddress>();
-      }
-      if (!blockedSourceAddresses.add(sourceAddress)) {
-        throw new IllegalStateException(
-            "Could not block " + sourceAddress + ": it was already blocked for " + debugId());
-      }
-    }
-
-    /**
-     * Removes a blocked address from this membership. Throws an {@code IllegalStateException} if
-     * the address is not blocked. Throws an {@code IllegalStateException} if this is not an
-     * any-source membership.
-     */
-    public void unblock(InetAddress sourceAddress) {
-      if (anySourceMembershipKey == null) {
-        throw new IllegalStateException(
-            "unblock() is not supported for source-specific group memberships: " + debugId());
-      }
-      if (blockedSourceAddresses == null || !blockedSourceAddresses.remove(sourceAddress)) {
-        throw new IllegalStateException(
-            "Could not unblock " + sourceAddress + ": it was not blocked for " + debugId());
-      }
-    }
-
-    public String debugId() {
-      return "<" + networkInterface + ":" + groupAddress + ">";
-    }
-
-  }
-
-  /** An identifier for a multicast group membership, independent of membership type. */
-  private static final class Id {
-
-    private final InetAddress groupAddress;
-    private final NetworkInterface networkInterface;
-
-    public Id(NetworkInterface networkInterface, InetAddress groupAddress) {
-      this.groupAddress = groupAddress;
-      this.networkInterface = networkInterface;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-      if (this == o) {
-        return true;
-      }
-      if (!(o instanceof Id)) {
-        return false;
-      }
-
-      Id id = (Id) o;
-
-      if (!groupAddress.equals(id.groupAddress)) {
-        return false;
-      }
-      if (!networkInterface.equals(id.networkInterface)) {
-        return false;
-      }
-
-      return true;
-    }
-
-    @Override
-    public int hashCode() {
-      int result = groupAddress.hashCode();
-      result = 31 * result + networkInterface.hashCode();
-      return result;
-    }
-  }
-}
diff --git a/luni/src/main/java/java/nio/NioUtils.java b/luni/src/main/java/java/nio/NioUtils.java
index 51adddb..f2a0b10 100644
--- a/luni/src/main/java/java/nio/NioUtils.java
+++ b/luni/src/main/java/java/nio/NioUtils.java
@@ -19,8 +19,6 @@
 import java.io.Closeable;
 import java.io.FileDescriptor;
 import java.io.IOException;
-import java.net.SocketOption;
-import java.net.StandardSocketOptions;
 import java.nio.channels.ClosedChannelException;
 import java.nio.channels.FileChannel;
 import java.util.Set;
@@ -68,66 +66,4 @@
     public static int unsafeArrayOffset(ByteBuffer b) {
         return ((ByteArrayBuffer) b).arrayOffset;
     }
-
-    /**
-     * Sets the supplied option on the channel to have the value if option is a member of
-     * allowedOptions.
-     *
-     * @throws IOException
-     *          if the value could not be set due to IO errors.
-     * @throws IllegalArgumentException
-     *          if the socket option or the value is invalid.
-     * @throws UnsupportedOperationException
-     *          if the option is not a member of allowedOptions.
-     * @throws ClosedChannelException
-     *          if the channel is closed
-     */
-    public static <T> void setSocketOption(
-            FileDescriptorChannel channel, Set<SocketOption<?>> allowedOptions,
-            SocketOption<T> option, T value)
-            throws IOException {
-
-        if (!(option instanceof StandardSocketOptions.SocketOptionImpl)) {
-            throw new IllegalArgumentException("SocketOption must come from StandardSocketOptions");
-        }
-        if (!allowedOptions.contains(option)) {
-            throw new UnsupportedOperationException(
-                    option + " is not supported for this type of socket");
-        }
-        if (!channel.getFD().valid()) {
-            throw new ClosedChannelException();
-        }
-        ((StandardSocketOptions.SocketOptionImpl<T>) option).setValue(channel.getFD(), value);
-    }
-
-    /**
-     * Gets the supplied option from the channel if option is a member of allowedOptions.
-     *
-     * @throws IOException
-     *          if the value could not be read due to IO errors.
-     * @throws IllegalArgumentException
-     *          if the socket option is invalid.
-     * @throws UnsupportedOperationException
-     *          if the option is not a member of allowedOptions.
-     * @throws ClosedChannelException
-     *          if the channel is closed
-     */
-    public static <T> T getSocketOption(
-            FileDescriptorChannel channel, Set<SocketOption<?>> allowedOptions,
-            SocketOption<T> option)
-            throws IOException {
-
-        if (!(option instanceof StandardSocketOptions.SocketOptionImpl)) {
-            throw new IllegalArgumentException("SocketOption must come from StandardSocketOptions");
-        }
-        if (!allowedOptions.contains(option)) {
-            throw new UnsupportedOperationException(
-                    option + " is not supported for this type of socket");
-        }
-        if (!channel.getFD().valid()) {
-            throw new ClosedChannelException();
-        }
-        return ((StandardSocketOptions.SocketOptionImpl<T>) option).getValue(channel.getFD());
-    }
-
 }
diff --git a/luni/src/main/java/java/nio/ServerSocketChannelImpl.java b/luni/src/main/java/java/nio/ServerSocketChannelImpl.java
index d2cbf36..7185c32 100644
--- a/luni/src/main/java/java/nio/ServerSocketChannelImpl.java
+++ b/luni/src/main/java/java/nio/ServerSocketChannelImpl.java
@@ -24,10 +24,7 @@
 import java.net.ServerSocket;
 import java.net.Socket;
 import java.net.SocketAddress;
-import java.net.SocketOption;
 import java.net.SocketTimeoutException;
-import java.net.StandardSocketOptions;
-import java.nio.channels.AlreadyBoundException;
 import java.nio.channels.ClosedChannelException;
 import java.nio.channels.IllegalBlockingModeException;
 import java.nio.channels.NotYetBoundException;
@@ -60,56 +57,6 @@
 
     /** @hide Until ready for a public API change */
     @Override
-    public final ServerSocketChannel bind(SocketAddress localAddr, int backlog) throws IOException {
-        if (!isOpen()) {
-            throw new ClosedChannelException();
-        }
-        if (socket.isBound()) {
-            throw new AlreadyBoundException();
-        }
-        if (localAddr != null) {
-            if (!(localAddr instanceof InetSocketAddress)) {
-                throw new UnsupportedAddressTypeException();
-            }
-            InetSocketAddress localInetAddress = (InetSocketAddress) localAddr;
-            if (localInetAddress.isUnresolved()) {
-                throw new UnresolvedAddressException();
-            }
-        }
-
-        socket.bind(localAddr, backlog);
-        return this;
-    }
-
-    /** @hide Until ready for a public API change */
-    @Override
-    public SocketAddress getLocalAddress() throws IOException {
-        if (!isOpen()) {
-            throw new ClosedChannelException();
-        }
-        return socket.getLocalSocketAddress();
-    }
-
-    /** @hide Until ready for a public API change */
-    @Override
-    public <T> T getOption(SocketOption<T> option) throws IOException {
-        return NioUtils.getSocketOption(this, StandardSocketOptions.SERVER_SOCKET_OPTIONS, option);
-    }
-
-    /** @hide Until ready for a public API change */
-    @Override
-    public <T> ServerSocketChannel setOption(SocketOption<T> option, T value) throws IOException {
-        NioUtils.setSocketOption(this, StandardSocketOptions.SERVER_SOCKET_OPTIONS, option, value);
-        return this;
-    }
-
-    /** @hide Until ready for a public API change */
-    @Override
-    public Set<SocketOption<?>> supportedOptions() {
-        return StandardSocketOptions.SERVER_SOCKET_OPTIONS;
-    }
-
-    @Override
     public SocketChannel accept() throws IOException {
         if (!isOpen()) {
             throw new ClosedChannelException();
diff --git a/luni/src/main/java/java/nio/SocketChannelImpl.java b/luni/src/main/java/java/nio/SocketChannelImpl.java
index 7c3cd78..d5cb716c 100644
--- a/luni/src/main/java/java/nio/SocketChannelImpl.java
+++ b/luni/src/main/java/java/nio/SocketChannelImpl.java
@@ -32,10 +32,7 @@
 import java.net.Socket;
 import java.net.SocketAddress;
 import java.net.SocketException;
-import java.net.SocketOption;
 import java.net.SocketUtils;
-import java.net.StandardSocketOptions;
-import java.nio.channels.AlreadyBoundException;
 import java.nio.channels.AlreadyConnectedException;
 import java.nio.channels.ClosedChannelException;
 import java.nio.channels.ConnectionPendingException;
@@ -139,31 +136,6 @@
         return socket;
     }
 
-    /** @hide Until ready for a public API change */
-    @Override
-    synchronized public final SocketChannel bind(SocketAddress local) throws IOException {
-        if (!isOpen()) {
-            throw new ClosedChannelException();
-        }
-        if (isBound) {
-            throw new AlreadyBoundException();
-        }
-
-        if (local == null) {
-            local = new InetSocketAddress(Inet4Address.ANY, 0);
-        } else if (!(local instanceof InetSocketAddress)) {
-            throw new UnsupportedAddressTypeException();
-        }
-
-        InetSocketAddress localAddress = (InetSocketAddress) local;
-        if (localAddress.isUnresolved()) {
-            throw new UnresolvedAddressException();
-        }
-        IoBridge.bind(fd, localAddress.getAddress(), localAddress.getPort());
-        onBind(true /* updateSocketState */);
-        return this;
-    }
-
     /**
      * Initialise the isBound, localAddress and localPort state from the file descriptor. Used when
      * some or all of the bound state has been left to the OS to decide, or when the Socket handled
@@ -189,34 +161,6 @@
         }
     }
 
-    /** @hide Until ready for a public API change */
-    @Override
-    synchronized public SocketAddress getLocalAddress() throws IOException {
-        if (!isOpen()) {
-            throw new ClosedChannelException();
-        }
-        return isBound ? new InetSocketAddress(localAddress, localPort) : null;
-    }
-
-    /** @hide Until ready for a public API change */
-    @Override
-    public <T> T getOption(SocketOption<T> option) throws IOException {
-        return NioUtils.getSocketOption(this, StandardSocketOptions.SOCKET_OPTIONS, option);
-    }
-
-    /** @hide Until ready for a public API change */
-    @Override
-    public <T> SocketChannel setOption(SocketOption<T> option, T value) throws IOException {
-        NioUtils.setSocketOption(this, StandardSocketOptions.SOCKET_OPTIONS, option, value);
-        return this;
-    }
-
-    /** @hide Until ready for a public API change */
-    @Override
-    public Set<SocketOption<?>> supportedOptions() {
-        return StandardSocketOptions.SOCKET_OPTIONS;
-    }
-
     @Override
     synchronized public boolean isConnected() {
         return status == SOCKET_STATUS_CONNECTED;
diff --git a/luni/src/main/java/java/nio/channels/AlreadyBoundException.java b/luni/src/main/java/java/nio/channels/AlreadyBoundException.java
deleted file mode 100644
index 0a35fc3..0000000
--- a/luni/src/main/java/java/nio/channels/AlreadyBoundException.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package java.nio.channels;
-
-/**
- * An {@code AlreadyBoundException} is thrown when an attempt is made to bind a NetworkChannel that
- * is already bound.
- *
- * @hide Until ready for a public API change
- */
-public class AlreadyBoundException extends IllegalStateException {
-
-  private static final long serialVersionUID = 6796072983322737592L;
-
-  public AlreadyBoundException() {
-  }
-}
diff --git a/luni/src/main/java/java/nio/channels/DatagramChannel.java b/luni/src/main/java/java/nio/channels/DatagramChannel.java
index 3a5d1cc..2cff7f0 100644
--- a/luni/src/main/java/java/nio/channels/DatagramChannel.java
+++ b/luni/src/main/java/java/nio/channels/DatagramChannel.java
@@ -22,7 +22,6 @@
 import java.net.InetAddress;
 import java.net.NetworkInterface;
 import java.net.SocketAddress;
-import java.net.SocketOption;
 import java.nio.ByteBuffer;
 import java.nio.channels.spi.AbstractSelectableChannel;
 import java.nio.channels.spi.SelectorProvider;
@@ -44,7 +43,7 @@
  * same time.
  */
 public abstract class DatagramChannel extends AbstractSelectableChannel
-        implements ByteChannel, ScatteringByteChannel, GatheringByteChannel, MulticastChannel {
+        implements ByteChannel, ScatteringByteChannel, GatheringByteChannel {
 
     /**
      * Constructs a new {@code DatagramChannel}.
@@ -92,64 +91,6 @@
      */
     public abstract DatagramSocket socket();
 
-    /** @hide Until ready for a public API change */
-    @Override
-    public DatagramChannel bind(SocketAddress local) throws IOException {
-        // This method was added for interoperability with Java 7, where it is abstract. It is
-        // concrete here to avoid breaking existing Android applications that extend this class.
-        throw new UnsupportedOperationException("Subclasses must override this method");
-    }
-
-    /** @hide Until ready for a public API change */
-    @Override
-    public SocketAddress getLocalAddress() throws IOException {
-        // This method was added for interoperability with Java 7, where it is abstract. It is
-        // concrete here to avoid breaking existing Android applications that extend this class.
-        throw new UnsupportedOperationException("Subclasses must override this method");
-    }
-
-    /** @hide Until ready for a public API change */
-    @Override
-    public <T> T getOption(SocketOption<T> option) throws IOException {
-        // This method was added for interoperability with Java 7, where it is abstract. It is
-        // concrete here to avoid breaking existing Android applications that extend this class.
-        throw new UnsupportedOperationException("Subclasses must override this method");
-    }
-
-    /** @hide Until ready for a public API change */
-    @Override
-    public <T> DatagramChannel setOption(SocketOption<T> option, T value) throws IOException {
-        // This method was added for interoperability with Java 7, where it is abstract. It is
-        // concrete here to avoid breaking existing Android applications that extend this class.
-        throw new UnsupportedOperationException("Subclasses must override this method");
-    }
-
-    /** @hide Until ready for a public API change */
-    @Override
-    public Set<SocketOption<?>> supportedOptions() {
-        // This method was added for interoperability with Java 7, where it is abstract. It is
-        // concrete here to avoid breaking existing Android applications that extend this class.
-        throw new UnsupportedOperationException("Subclasses must override this method");
-    }
-
-    /** @hide Until ready for a public API change */
-    @Override
-    public MembershipKey join(InetAddress groupAddress, NetworkInterface networkInterface)
-            throws IOException {
-        // This method was added for interoperability with Java 7, where it is abstract. It is
-        // concrete here to avoid breaking existing Android applications that extend this class.
-        throw new UnsupportedOperationException("Subclasses must override this method");
-    }
-
-    /** @hide Until ready for a public API change */
-    @Override
-    public MembershipKey join(InetAddress groupAddress, NetworkInterface networkInterface,
-            InetAddress sourceAddress) throws IOException {
-        // This method was added for interoperability with Java 7, where it is abstract. It is
-        // concrete here to avoid breaking existing Android applications that extend this class.
-        throw new UnsupportedOperationException("Subclasses must override this method");
-    }
-
     /**
      * Returns whether this channel's socket is connected or not.
      *
diff --git a/luni/src/main/java/java/nio/channels/FileChannel.java b/luni/src/main/java/java/nio/channels/FileChannel.java
index e5f2862c..d6c140b 100644
--- a/luni/src/main/java/java/nio/channels/FileChannel.java
+++ b/luni/src/main/java/java/nio/channels/FileChannel.java
@@ -76,9 +76,8 @@
  * stream and vice versa; this includes modifications to the file position,
  * content, size, etc.
  */
-// TODO: Remove ByteChannel when SeekableByteChannel is unhidden.
 public abstract class FileChannel extends AbstractInterruptibleChannel
-        implements GatheringByteChannel, ScatteringByteChannel, ByteChannel, SeekableByteChannel {
+        implements ByteChannel, GatheringByteChannel, ScatteringByteChannel {
 
     /**
      * {@code MapMode} defines file mapping mode constants.
@@ -282,21 +281,65 @@
             long position, long size) throws IOException;
 
     /**
-     * {@inheritDoc}
+     * Returns the current position as a positive integer number of bytes from
+     * the start of the file.
+     *
+     * @throws ClosedChannelException
+     *             if this channel is closed.
+     * @throws IOException
+     *             if another I/O error occurs.
      */
-    @Override
     public abstract long position() throws IOException;
 
     /**
-     * {@inheritDoc}
+     * Sets the file position pointer to a new value.
+     * <p>
+     * The argument is the number of bytes counted from the start of the file.
+     * The position cannot be set to a value that is negative. The new position
+     * can be set beyond the current file size. If set beyond the current file
+     * size, attempts to read will return end of file. Write operations will
+     * succeed but they will fill the bytes between the current end of file and
+     * the new position with the required number of (unspecified) byte values.
+     *
+     * @return this.
+     * @throws IllegalArgumentException
+     *             if the new position is negative.
+     * @throws ClosedChannelException
+     *             if this channel is closed.
+     * @throws IOException
+     *             if another I/O error occurs.
      */
-    @Override
     public abstract FileChannel position(long newPosition) throws IOException;
 
     /**
-     * {@inheritDoc}
+     * Reads bytes from this file channel into the given buffer.
+     * <p>
+     * The maximum number of bytes that will be read is the remaining number of
+     * bytes in the buffer when the method is invoked. The bytes will be copied
+     * into the buffer starting at the buffer's current position.
+     * <p>
+     * The call may block if other threads are also attempting to read from this
+     * channel.
+     * <p>
+     * Upon completion, the buffer's position is set to the end of the bytes
+     * that have been read. The buffer's limit is not changed.
+     *
+     * @param buffer
+     *            the byte buffer to receive the bytes.
+     * @return the number of bytes actually read.
+     * @throws AsynchronousCloseException
+     *             if another thread closes the channel during the read.
+     * @throws ClosedByInterruptException
+     *             if another thread interrupts the calling thread during the
+     *             read.
+     * @throws ClosedChannelException
+     *             if this channel is closed.
+     * @throws IOException
+     *             if another I/O error occurs, details are in the message.
+     * @throws NonReadableChannelException
+     *             if the channel has not been opened in a mode that permits
+     *             reading.
      */
-    @Override
     public abstract int read(ByteBuffer buffer) throws IOException;
 
     /**
@@ -411,9 +454,13 @@
             throws IOException;
 
     /**
-     * {@inheritDoc}
+     * Returns the size of the file underlying this channel in bytes.
+     *
+     * @throws ClosedChannelException
+     *             if this channel is closed.
+     * @throws IOException
+     *             if an I/O error occurs while getting the size of the file.
      */
-    @Override
     public abstract long size() throws IOException;
 
     /**
@@ -491,9 +538,25 @@
             WritableByteChannel target) throws IOException;
 
     /**
-     * {@inheritDoc}
+     * Truncates the file underlying this channel to a given size. Any bytes
+     * beyond the given size are removed from the file. If there are no bytes
+     * beyond the given size then the file contents are unmodified.
+     * <p>
+     * If the file position is currently greater than the given size, then it is
+     * set to the new size.
+     *
+     * @param size
+     *            the maximum size of the underlying file.
+     * @throws IllegalArgumentException
+     *             if the requested size is negative.
+     * @throws ClosedChannelException
+     *             if this channel is closed.
+     * @throws NonWritableChannelException
+     *             if the channel cannot be written to.
+     * @throws IOException
+     *             if another I/O error occurs.
+     * @return this channel.
      */
-    @Override
     public abstract FileChannel truncate(long size) throws IOException;
 
     /**
@@ -554,9 +617,30 @@
             throws IOException;
 
     /**
-     * {@inheritDoc}
+     * Writes bytes from the given byte buffer to this file channel.
+     * <p>
+     * The bytes are written starting at the current file position, and after
+     * some number of bytes are written (up to the remaining number of bytes in
+     * the buffer) the file position is increased by the number of bytes
+     * actually written.
+     *
+     * @param src
+     *            the byte buffer containing the bytes to be written.
+     * @return the number of bytes actually written.
+     * @throws NonWritableChannelException
+     *             if the channel was not opened for writing.
+     * @throws ClosedChannelException
+     *             if the channel was already closed.
+     * @throws AsynchronousCloseException
+     *             if another thread closes the channel during the write.
+     * @throws ClosedByInterruptException
+     *             if another thread interrupts the calling thread while this
+     *             operation is in progress. The interrupt state of the calling
+     *             thread is set and the channel is closed.
+     * @throws IOException
+     *             if another I/O error occurs, details are in the message.
+     * @see java.nio.channels.WritableByteChannel#write(java.nio.ByteBuffer)
      */
-    @Override
     public abstract int write(ByteBuffer src) throws IOException;
 
     /**
diff --git a/luni/src/main/java/java/nio/channels/FileLock.java b/luni/src/main/java/java/nio/channels/FileLock.java
index 037537c..5b26475 100644
--- a/luni/src/main/java/java/nio/channels/FileLock.java
+++ b/luni/src/main/java/java/nio/channels/FileLock.java
@@ -114,17 +114,6 @@
     }
 
     /**
-     * Returns the {@link Channel} that holds this lock.
-     *
-     * @since 1.7
-     * @hide Until ready for an API update
-     */
-    // TODO: unhiding, add to channel():  This method has been superseded by {@link #acquiredBy()}.
-    public Channel acquiredBy() {
-        return channel;
-    }
-
-    /**
      * Returns the lock's starting position in the file.
      *
      * @return the lock position.
diff --git a/luni/src/main/java/java/nio/channels/MembershipKey.java b/luni/src/main/java/java/nio/channels/MembershipKey.java
deleted file mode 100644
index 18ff92d..0000000
--- a/luni/src/main/java/java/nio/channels/MembershipKey.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package java.nio.channels;
-
-import java.io.IOException;
-import java.net.InetAddress;
-import java.net.NetworkInterface;
-
-/**
- * A token produced as the result of joining a multicast group with
- * {@link DatagramChannel#join(java.net.InetAddress, java.net.NetworkInterface)} or
- * {@link DatagramChannel#join(java.net.InetAddress, java.net.NetworkInterface,
- * java.net.InetAddress)}.
- *
- * <p>A multicast group membership can be source-specific or any-source. Source-specific memberships
- * only allow datagrams from a single source address to be received. Any-source memberships
- * initially allow datagrams from any source address to be received, but may have individual unicast
- * IP addresses blocked via {@link #block(java.net.InetAddress)}. Any-source membership keys return
- * {@code null} from {@link #sourceAddress()}.
- *
- * <p>See <a href="http://tools.ietf.org/html/rfc3678">RFC 3678: Socket Interface Extensions for
- * Multicast Source Filters</a> for concepts and terminology associated with multicast membership.
- *
- * @since 1.7
- * @hide Until ready for a public API change
- */
-public abstract class MembershipKey {
-
-  protected MembershipKey() {}
-
-  /**
-   * Returns {@code true} until the membership is dropped with {@link #drop()} or the associated
-   * channel is closed.
-   */
-  public abstract boolean isValid();
-
-  /**
-   * Drops this membership from the multicast group, invalidating this key.
-   */
-  public abstract void drop();
-
-  /**
-   * Blocks datagrams from the specified source address; after this call any datagrams received from
-   * the address will be discarded. Blocking an already-blocked source address has no effect. A
-   * blocked address can be unblocked by calling {@link #unblock(java.net.InetAddress)}.
-   *
-   * <p>The block may not take effect instantaneously: datagrams that are already buffered by the
-   * underlying OS may still be delivered.
-   *
-   * <p>There is an OS-level limit on the number of source addresses that can be block for a given
-   * {@code groupAddress}, {@code networkInterface} pair. This is typically 10. Attempts to add
-   * more than this result in a {@code SocketException}.
-   *
-   * <p>If this membership key is source-specific an {@link IllegalStateException} is thrown.
-   *
-   * @throws IllegalStateException
-   *         if this membership key is no longer valid or is of the wrong type
-   * @throws IllegalArgumentException
-   *         if the source address is not unicast address of the same type as the multicast group
-   *         address supplied when the group was joined
-   * @throws IOException
-   *         if an I/O error occurs.
-   */
-  public abstract MembershipKey block(InetAddress source) throws IOException;
-
-  /**
-   * Unblocks datagrams from the specified source address that were previously blocked with a call
-   * to {@link #block(java.net.InetAddress)}; after this call any datagrams received from the
-   * address will be received. Unblocking an address that is not currently blocked throws an
-   * {@code IllegalStateException}.
-   *
-   * <p>If this membership key is source-specific an {@link IllegalStateException} is thrown.
-   *
-   * @throws IllegalStateException
-   *         if this membership key is no longer valid or is of the wrong type, or the address is
-   *         not currently blocked
-   * @throws IllegalArgumentException
-   *         if the source address is not unicast address of the same type as the multicast group
-   *         address supplied when the group was joined
-   */
-  public abstract MembershipKey unblock(InetAddress source);
-
-  /**
-   * Returns the {@code MulticastChannel} associated with this key. Continues returning the value
-   * even when the key has been invalidated.
-   */
-  public abstract MulticastChannel channel();
-
-  /**
-   * Returns the multicast group address associated with this key. Continues returning the value
-   * even when the key has been invalidated.
-   */
-  public abstract InetAddress group();
-
-  /**
-   * Returns the network interface associated with this key. Continues returning the value
-   * even when the key has been invalidated.
-   */
-  public abstract NetworkInterface networkInterface();
-
-  /**
-   * Returns the source address associated with this key if the membership is source-specific.
-   * Returns {@code null} if the membership is any-source. Continues returning the value
-   * even when the key has been invalidated.
-   */
-  public abstract InetAddress sourceAddress();
-}
diff --git a/luni/src/main/java/java/nio/channels/MulticastChannel.java b/luni/src/main/java/java/nio/channels/MulticastChannel.java
deleted file mode 100644
index 41ef501..0000000
--- a/luni/src/main/java/java/nio/channels/MulticastChannel.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package java.nio.channels;
-
-import java.io.IOException;
-import java.net.InetAddress;
-import java.net.NetworkInterface;
-
-/**
- * A type of {@link NetworkChannel} that supports IP multicasting. IP multicasting allows for
- * efficient routing of an IP datagram to multiple hosts. Hosts wishing to receive multicast
- * datagrams join a multicast group identified by a multicast IP address.
- *
- * <p>Any datagram socket can be used to <em>send</em> to a multicast group: senders <em>do not</em>
- * have to be a member of the group.
- *
- * <p>See <a href="http://www.ietf.org/rfc/rfc2236.txt">RFC 2236: Internet Group Management
- * Protocol, Version 2</a> and <a href="http://www.ietf.org/rfc/rfc3376.txt">RFC 3376: Internet
- * Group Management Protocol, Version 3</a> for network-level information regarding IPv4 group
- * membership. See <a href="http://www.ietf.org/rfc/rfc2710.txt">RFC 2710: Multicast Listener
- * Discovery (MLD) for IPv6</a> and <a href="http://www.ietf.org/rfc/rfc3810.txt">RFC 3810:
- * Multicast Listener Discovery Version 2 (MLDv2) for IPv6</a> for equivalent IPv6 information.
- *
- * <p>See <a href="http://tools.ietf.org/html/rfc3678">RFC 3678: Socket Interface Extensions for
- * Multicast Source Filters</a> for concepts and terminology associated with multicast membership.
- *
- * <p>IP multicast requires support from network infrastructure; networks may not support
- * all features of IP multicast.
- *
- * <p>A channel can be restricted to send multicast datagrams through a specific
- * {@link NetworkInterface} by using {@link #setOption(java.net.SocketOption, Object)} with
- * {@link java.net.StandardSocketOptions#IP_MULTICAST_IF}.
- *
- * <p>A channel may or may not receive multicast datagrams sent from this host, determined by the
- * {@link java.net.StandardSocketOptions#IP_MULTICAST_LOOP} option.
- *
- * <p>The time-to-live for multicast datagrams can be set using the
- * {@link java.net.StandardSocketOptions#IP_MULTICAST_TTL} option.
- *
- * <p>Usually multicast channels should have {@link java.net.StandardSocketOptions#SO_REUSEADDR}
- * set to {@code true} before binding to enable multiple sockets on this host to be members of
- * the same multicast group.
- *
- * <p>Typically multicast channels are {@link NetworkChannel#bind bound} to a wildcard address
- * such as "0.0.0.0" (IPv4) or "::" (IPv6). They may also be bound to a multicast group address.
- * Binding to a multicast group address restricts datagrams received to only those sent to the
- * multicast group. When the wildcard address is used the socket may join multiple groups and also
- * receive non-multicast datagrams sent directly to the host. The port the channel is bound to is
- * important: only datagrams sent to the group on that port will be received.
- *
- * <p>Having bound a channel, the group can be joined. Memberships are either "any-source" or
- * "source-specific". The type of membership is determined by the variant of {@code join} that is
- * used. See {@link #join(java.net.InetAddress, java.net.NetworkInterface)} and
- * {@link #join(java.net.InetAddress, java.net.NetworkInterface, java.net.InetAddress)} for more
- * information.
- *
- * @since 1.7
- * @hide Until ready for a public API change
- */
-public interface MulticastChannel extends NetworkChannel {
-
-  // @hide Until ready for a public API change
-  // /**
-  //  * {@inheritDoc}
-  //  *
-  //  * If the channel is currently part of one or more multicast groups then the memberships are
-  // * dropped and any associated {@code MembershipKey} objects are invalidated.
-  // */
-  void close() throws IOException;
-
-  /**
-   * Creates an any-source membership to the {@code groupAddress} on the specified
-   * {@code networkInterface}. Returns a {@code MembershipKey} that can be used to modify or
-   * {@link MembershipKey#drop()} the membership. See {@link MembershipKey#block(InetAddress)} and
-   * {@link MembershipKey#unblock(InetAddress)} for methods to modify source-address
-   * filtering.
-   *
-   * <p>A channel may join several groups. Each membership is network interface-specific: an
-   * application must join the group for each applicable network interface to receive datagrams.
-   *
-   * <p>Any-source and source-specific memberships cannot be mixed for a group address on a given
-   * network interface. An {@code IllegalStateException} will be thrown if joins of different types
-   * are attempted for a given {@code groupAddress}, {@code networkInterface} pair. Joining a
-   * multicast group with the same arguments as an existing, valid membership returns the same
-   * {@code MembershipKey}.
-   *
-   * <p>There is an OS-level limit on the number of multicast groups a process can join.
-   * This is typically 20. Attempts to join more than this result in a {@code SocketException}.
-   *
-   * @param groupAddress the multicast group address to join
-   * @param networkInterface the network address to join with
-   * @throws IllegalArgumentException
-   *         if the group address is not a multicast address or the network interface does not
-   *         support multicast
-   * @throws IllegalStateException
-   *         if the channel already has a source-specific membership for the group/network interface
-   * @throws ClosedChannelException
-   *         if the channel is closed
-   * @throws IOException
-   *         if some other I/O error occurs
-   * @hide Until ready for a public API change
-   */
-  MembershipKey join(InetAddress groupAddress, NetworkInterface networkInterface)
-      throws IOException;
-
-  /**
-   * Creates a source-specific membership to the {@code groupAddress} on the specified
-   * {@code networkInterface} filtered by the {@code sourceAddress}. Returns a
-   * {@code MembershipKey} that can be used to {@link MembershipKey#drop()} the membership.
-   *
-   * <p>A channel may join several groups. Each membership is network interface-specific: an
-   * application must join the group for each applicable network interface to receive datagrams.
-   *
-   * <p>Any-source and source-specific memberships cannot be mixed for a group address on a given
-   * network interface. An {@code IllegalStateException} will be thrown if joins of different types
-   * are attempted for a given {@code groupAddress}, {@code networkInterface} pair. Joining a
-   * multicast group with the same arguments as an existing, valid membership returns the same
-   * {@code MembershipKey}.
-   *
-   * <p>There is an OS-level limit on the number of multicast groups a process can join.
-   * This is typically 20. Attempts to join more than this result in a {@code SocketException}.
-   *
-   * <p>There is an OS-level limit on the number of source addresses that can be joined for a given
-   * {@code groupAddress}, {@code networkInterface} pair. This is typically 10. Attempts to add
-   * more than this result in a {@code SocketException}.
-   *
-   * @param groupAddress the multicast group address to join
-   * @param networkInterface the network address to join with
-   * @param sourceAddress the source address to restrict datagrams to
-   * @throws IllegalArgumentException
-   *         if the group address is not a multicast address, the network interface does not
-   *         support multicast, or the {@code groupAddress} and {@code sourceAddress} are not of
-   *         compatible types
-   * @throws IllegalStateException
-   *         if the channel already has a source-specific membership for the group/network interface
-   * @throws ClosedChannelException
-   *         if the channel is closed
-   * @throws IOException
-   *         if some other I/O error occurs
-   * @hide Until ready for a public API change
-   */
-  MembershipKey join(
-      InetAddress groupAddress, NetworkInterface networkInterface, InetAddress sourceAddress)
-      throws IOException;
-
-}
diff --git a/luni/src/main/java/java/nio/channels/NetworkChannel.java b/luni/src/main/java/java/nio/channels/NetworkChannel.java
deleted file mode 100644
index 9b46e30..0000000
--- a/luni/src/main/java/java/nio/channels/NetworkChannel.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package java.nio.channels;
-
-import java.io.Closeable;
-import java.io.IOException;
-import java.net.SocketAddress;
-import java.net.SocketOption;
-import java.util.Set;
-
-/**
- * A common interface for channels that are backed by network sockets.
- *
- * @since 1.7
- * @hide Until ready for a public API change
- */
-public interface NetworkChannel extends AutoCloseable, Channel, Closeable {
-
-  /**
-   * Binds this channel to the given local socket address. If the {@code localAddr} is set
-   * to {@code null} the socket will be bound to an available local address on any free port of
-   * the system.
-   *
-   * @param local
-   *     the local machine address and port to bind on.
-   * @return this channel.
-   * @throws UnsupportedAddressTypeException
-   *     if the {@code SocketAddress} is not supported.
-   * @throws ClosedChannelException
-   *     if the channel is closed.
-   * @throws AlreadyBoundException
-   *     if the channel is already bound.
-   * @throws IOException
-   *     if another I/O error occurs.
-   * @hide Until ready for a public API change
-   */
-  NetworkChannel bind(SocketAddress local) throws IOException;
-
-  /**
-   * Returns the local socket address the channel is bound to. The socket may be bound explicitly
-   * via {@link #bind(java.net.SocketAddress)} or similar methods, or as a side-effect when other
-   * methods are called, depending on the implementation. If the channel is not bound {@code null}
-   * is returned.
-   *
-   * <p>If IP is being used, the returned object will be a subclass of
-   * {@link java.net.InetSocketAddress}
-   *
-   * @return the local socket address, or {@code null} if the socket is not bound
-   * @throws ClosedChannelException
-   *     if the channel is closed.
-   * @throws IOException
-   *     if another I/O error occurs.
-   * @hide Until ready for a public API change
-   */
-  SocketAddress getLocalAddress() throws IOException;
-
-  /**
-   * Returns the value for the socket option.
-   *
-   * @throws UnsupportedOperationException
-   *     if the option is not supported by the socket.
-   * @throws java.nio.channels.ClosedChannelException
-   *     if the socket is closed
-   * @throws IOException
-   *     if the value cannot be read.
-   * @hide Until ready for a public API change
-   * @see java.net.StandardSocketOptions
-   */
-  <T> T getOption(SocketOption<T> option) throws IOException;
-
-  /**
-   * Sets the value for the socket option.
-   *
-   * @return this NetworkChannel
-   * @throws UnsupportedOperationException
-   *     if the option is not supported by the socket.
-   * @throws IllegalArgumentException
-   *     if the value is not valid for the option.
-   * @throws java.nio.channels.ClosedChannelException
-   *     if the socket is closed
-   * @throws IOException
-   *     if the value cannot be written.
-   * @hide Until ready for a public API change
-   * @see java.net.StandardSocketOptions
-   */
-  <T> NetworkChannel setOption(SocketOption<T> option, T value) throws IOException;
-
-  /**
-   * Returns the set of socket options supported by this channel.
-   *
-   * @hide Until ready for a public API change
-   */
-  Set<SocketOption<?>> supportedOptions();
-}
diff --git a/luni/src/main/java/java/nio/channels/SeekableByteChannel.java b/luni/src/main/java/java/nio/channels/SeekableByteChannel.java
deleted file mode 100644
index f4d6beb..0000000
--- a/luni/src/main/java/java/nio/channels/SeekableByteChannel.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package java.nio.channels;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-
-/**
- * An interface for channels that keep a pointer to a current position within an underlying
- * byte-based data source such as a file.
- *
- * <p>SeekableByteChannels have a pointer into the underlying data source which is referred to as a
- * <em>position</em>. The position can be manipulated by moving it within the data source, and the
- * current position can be queried.
- *
- * <p>SeekableByteChannels also have an associated <em>size</em>. The size of the channel is the
- * number of bytes that the data source currently contains. The size of the data source can be
- * manipulated by adding more bytes to the end or by removing bytes from the end. See
- * {@link #truncate}, {@link #position} and {@link #write} for details. The current size can also
- * be queried.
- *
- * @hide Until ready for a public API change
- * @since 1.7
- */
-public interface SeekableByteChannel extends ByteChannel {
-
-  /**
-   * Returns the current position as a positive number of bytes from the start of the underlying
-   * data source.
-   *
-   * @throws ClosedChannelException
-   *     if this channel is closed.
-   * @throws IOException
-   *     if another I/O error occurs.
-   */
-  long position() throws IOException;
-
-  /**
-   * Sets the channel's position to {@code newPosition}.
-   *
-   * <p>The argument is the number of bytes counted from the start of the data source. The position
-   * cannot be set to a value that is negative. The new position can be set beyond the current
-   * size. If set beyond the current size, attempts to read will return end-of-file. Write
-   * operations will succeed but they will fill the bytes between the current end of the data
-   * source
-   * and the new position with the required number of (unspecified) byte values.
-   *
-   * @return the channel.
-   * @throws IllegalArgumentException
-   *     if the new position is negative.
-   * @throws ClosedChannelException
-   *     if this channel is closed.
-   * @throws IOException
-   *     if another I/O error occurs.
-   */
-  SeekableByteChannel position(long newPosition) throws IOException;
-
-  /**
-   * Returns the size of the data source underlying this channel in bytes.
-   *
-   * @throws ClosedChannelException
-   *     if this channel is closed.
-   * @throws IOException
-   *     if an I/O error occurs.
-   */
-  long size() throws IOException;
-
-  /**
-   * Truncates the data source underlying this channel to a given size. Any bytes beyond the given
-   * size are removed. If there are no bytes beyond the given size then the contents are
-   * unmodified.
-   *
-   * <p>If the position is currently greater than the given size, then it is set to the new size.
-   *
-   * @return this channel.
-   * @throws IllegalArgumentException
-   *     if the requested size is negative.
-   * @throws ClosedChannelException
-   *     if this channel is closed.
-   * @throws NonWritableChannelException
-   *     if the channel cannot be written to.
-   * @throws IOException
-   *     if another I/O error occurs.
-   */
-  SeekableByteChannel truncate(long size) throws IOException;
-
-  /**
-   * Writes bytes from the given byte buffer to this channel.
-   *
-   * <p>The bytes are written starting at the channel's current position, and after some number of
-   * bytes are written (up to the {@link java.nio.Buffer#remaining() remaining} number of bytes in
-   * the buffer) the channel's position is increased by the number of bytes actually written.
-   *
-   * <p>If the channel's position is beyond the current end of the underlying data source, then the
-   * data source is first extended up to the given position by the required number of unspecified
-   * byte values.
-   *
-   * @param buffer
-   *     the byte buffer containing the bytes to be written.
-   * @return the number of bytes actually written.
-   * @throws NonWritableChannelException
-   *     if the channel was not opened for writing.
-   * @throws ClosedChannelException
-   *     if the channel was already closed.
-   * @throws AsynchronousCloseException
-   *     if another thread closes the channel during the write.
-   * @throws ClosedByInterruptException
-   *     if another thread interrupts the calling thread while this operation is in progress. The
-   *     interrupt state of the calling thread is set and the channel is closed.
-   * @throws IOException
-   *     if another I/O error occurs, details are in the message.
-   */
-  @Override
-  int write(ByteBuffer buffer) throws IOException;
-
-  /**
-   * Reads bytes from this channel into the given buffer.
-   *
-   * <p>If the channels position is beyond the current end of the underlying data source then
-   * end-of-file (-1) is returned.
-   *
-   * <p>The bytes are read starting at the channel's current position, and after some number of
-   * bytes are read (up to the {@link java.nio.Buffer#remaining() remaining} number of bytes in the
-   * buffer) the channel's position is increased by the number of bytes actually read. The bytes
-   * will be read into the buffer starting at the buffer's current
-   * {@link java.nio.Buffer#position() position}. The buffer's {@link java.nio.Buffer#limit()
-   * limit} is not changed.
-   *
-   * <p>The call may block if other threads are also attempting to read from the same channel.
-   *
-   * @param buffer
-   *     the byte buffer to receive the bytes.
-   * @return the number of bytes actually read, or -1 if the end of the data has been reached
-   * @throws AsynchronousCloseException
-   *     if another thread closes the channel during the read.
-   * @throws ClosedByInterruptException
-   *     if another thread interrupts the calling thread while the operation is in progress. The
-   *     interrupt state of the calling thread is set and the channel is closed.
-   * @throws ClosedChannelException
-   *     if the channel is closed.
-   * @throws IOException
-   *     another I/O error occurs, details are in the message.
-   * @throws NonReadableChannelException
-   *     if the channel was not opened for reading.
-   */
-  @Override
-  int read(ByteBuffer buffer) throws IOException;
-
-}
diff --git a/luni/src/main/java/java/nio/channels/ServerSocketChannel.java b/luni/src/main/java/java/nio/channels/ServerSocketChannel.java
index c720451..ef50155 100644
--- a/luni/src/main/java/java/nio/channels/ServerSocketChannel.java
+++ b/luni/src/main/java/java/nio/channels/ServerSocketChannel.java
@@ -20,7 +20,6 @@
 import java.io.IOException;
 import java.net.ServerSocket;
 import java.net.SocketAddress;
-import java.net.SocketOption;
 import java.nio.channels.spi.AbstractSelectableChannel;
 import java.nio.channels.spi.SelectorProvider;
 import java.util.Set;
@@ -37,9 +36,7 @@
  * {@link NotYetBoundException}. It can be bound by calling the bind method of a
  * related {@code ServerSocket} instance.
  */
-public abstract class ServerSocketChannel extends AbstractSelectableChannel
-        implements NetworkChannel {
-
+public abstract class ServerSocketChannel extends AbstractSelectableChannel {
     /**
      * Constructs a new {@link ServerSocketChannel}.
      *
@@ -86,76 +83,6 @@
     public abstract ServerSocket socket();
 
     /**
-     * {@inheritDoc}
-     *
-     * <p>This is equivalent to {@code bind(local, 0)}.
-     * @hide Until ready for a public API change
-     */
-    @Override
-    public final ServerSocketChannel bind(SocketAddress local) throws IOException {
-        return bind(local, 0);
-    }
-
-    /**
-     * Binds this server channel to the given local socket address. If the {@code localAddr} is set
-     * to {@code null} the socket will be bound to an available local address on any free port of
-     * the system.
-     *
-     * @param localAddr
-     *             the local machine address and port to bind on.
-     * @param backlog the maximum number of unaccepted connections. Passing 0 or
-     *             a negative value yields the default backlog of 50.
-     * @return this {@code ServerSocketChannel}.
-     * @throws UnsupportedAddressTypeException
-     *             if the {@code SocketAddress} is not supported.
-     * @throws ClosedChannelException
-     *             if the channel is closed.
-     * @throws AlreadyBoundException
-     *             if the channel is already bound.
-     * @throws IOException
-     *             if another I/O error occurs.
-     * @since 1.7
-     * @hide Until ready for a public API change
-     */
-    public ServerSocketChannel bind(SocketAddress localAddr, int backlog) throws IOException {
-        // This method was added for interoperability with Java 7, where it is abstract. It is
-        // concrete here to avoid breaking existing Android applications that extend this class.
-        throw new UnsupportedOperationException("Subclasses must override this method");
-    }
-
-    /** @hide Until ready for a public API change */
-     @Override
-    public SocketAddress getLocalAddress() throws IOException {
-        // This method was added for interoperability with Java 7, where it is abstract. It is
-        // concrete here to avoid breaking existing Android applications that extend this class.
-        throw new UnsupportedOperationException("Subclasses must override this method");
-    }
-
-    /** @hide Until ready for a public API change */
-    @Override
-    public <T> T getOption(SocketOption<T> option) throws IOException {
-        // This method was added for interoperability with Java 7, where it is abstract. It is
-        // concrete here to avoid breaking existing Android applications that extend this class.
-        throw new UnsupportedOperationException("Subclasses must override this method");
-    }
-
-    /** @hide Until ready for a public API change */
-    @Override
-    public <T> ServerSocketChannel setOption(SocketOption<T> option, T value) throws IOException {
-        // This method was added for interoperability with Java 7, where it is abstract. It is
-        // concrete here to avoid breaking existing Android applications that extend this class.
-        throw new UnsupportedOperationException("Subclasses must override this method");
-    }
-
-    /** @hide Until ready for a public API change */
-    @Override
-    public Set<SocketOption<?>> supportedOptions() {
-        // This method was added for interoperability with Java 7, where it is abstract. It is
-        // concrete here to avoid breaking existing Android applications that extend this class.
-        throw new UnsupportedOperationException("Subclasses must override this method");
-    }
-
-    /**
      * Accepts a connection to this server-socket channel.
      * <p>
      * This method returns {@code null} when this channel is non-blocking and no
diff --git a/luni/src/main/java/java/nio/channels/SocketChannel.java b/luni/src/main/java/java/nio/channels/SocketChannel.java
index a6d1551..a91fccd 100644
--- a/luni/src/main/java/java/nio/channels/SocketChannel.java
+++ b/luni/src/main/java/java/nio/channels/SocketChannel.java
@@ -20,7 +20,6 @@
 import java.io.IOException;
 import java.net.Socket;
 import java.net.SocketAddress;
-import java.net.SocketOption;
 import java.nio.ByteBuffer;
 import java.nio.channels.spi.AbstractSelectableChannel;
 import java.nio.channels.spi.SelectorProvider;
@@ -64,7 +63,7 @@
  * processing, calls to {@link #read} and {@link #write} will block.
  */
 public abstract class SocketChannel extends AbstractSelectableChannel implements
-        ByteChannel, ScatteringByteChannel, GatheringByteChannel, NetworkChannel {
+        ByteChannel, ScatteringByteChannel, GatheringByteChannel {
 
     /**
      * Constructs a new {@code SocketChannel}.
@@ -142,46 +141,6 @@
      */
     public abstract Socket socket();
 
-    /** @hide Until ready for a public API change */
-    @Override
-    public SocketChannel bind(SocketAddress local) throws IOException {
-        // This method was added for interoperability with Java 7, where it is abstract. It is
-        // concrete here to avoid breaking existing Android applications that extend this class.
-        throw new UnsupportedOperationException("Subclasses must override this method");
-    }
-
-    /** @hide Until ready for a public API change */
-    @Override
-    public SocketAddress getLocalAddress() throws IOException {
-        // This method was added for interoperability with Java 7, where it is abstract. It is
-        // concrete here to avoid breaking existing Android applications that extend this class.
-        throw new UnsupportedOperationException("Subclasses must override this method");
-    }
-
-    /** @hide Until ready for a public API change */
-    @Override
-    public <T> T getOption(SocketOption<T> option) throws IOException {
-        // This method was added for interoperability with Java 7, where it is abstract. It is
-        // concrete here to avoid breaking existing Android applications that extend this class.
-        throw new UnsupportedOperationException("Subclasses must override this method");
-    }
-
-    /** @hide Until ready for a public API change */
-    @Override
-    public <T> SocketChannel setOption(SocketOption<T> option, T value) throws IOException {
-        // This method was added for interoperability with Java 7, where it is abstract. It is
-        // concrete here to avoid breaking existing Android applications that extend this class.
-        throw new UnsupportedOperationException("Subclasses must override this method");
-    }
-
-    /** @hide Until ready for a public API change */
-    @Override
-    public Set<SocketOption<?>> supportedOptions() {
-        // This method was added for interoperability with Java 7, where it is abstract. It is
-        // concrete here to avoid breaking existing Android applications that extend this class.
-        throw new UnsupportedOperationException("Subclasses must override this method");
-    }
-
     /**
      * Indicates whether this channel's socket is connected.
      *
diff --git a/luni/src/main/java/java/util/Currency.java b/luni/src/main/java/java/util/Currency.java
index 11b5af1..8cfb68f 100644
--- a/luni/src/main/java/java/util/Currency.java
+++ b/luni/src/main/java/java/util/Currency.java
@@ -127,17 +127,6 @@
     }
 
     /**
-     * Returns the ISO 4217 numeric code for this currency. If there is no standard numeric code a
-     * zero is returned.
-     *
-     * @since 1.7
-     * @hide Until ready for an API update
-     */
-    public int getNumericCode() {
-        return ICU.getCurrencyNumericCode(currencyCode);
-    }
-
-    /**
      * Equivalent to {@code getSymbol(Locale.getDefault())}.
      * See "<a href="../util/Locale.html#default_locale">Be wary of the default locale</a>".
      */
diff --git a/luni/src/main/java/java/util/zip/ZipFile.java b/luni/src/main/java/java/util/zip/ZipFile.java
index 43e8567..b44156e 100644
--- a/luni/src/main/java/java/util/zip/ZipFile.java
+++ b/luni/src/main/java/java/util/zip/ZipFile.java
@@ -26,7 +26,6 @@
 import java.io.InputStream;
 import java.io.RandomAccessFile;
 import java.nio.ByteOrder;
-import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
 import java.util.Enumeration;
 import java.util.Iterator;
@@ -98,8 +97,6 @@
 
     private final String filename;
 
-    private final Charset charset;
-
     private File fileToDeleteOnClose;
 
     private RandomAccessFile raf;
@@ -119,23 +116,7 @@
      * @throws IOException if an {@code IOException} occurs.
      */
     public ZipFile(File file) throws ZipException, IOException {
-        this(file, OPEN_READ, StandardCharsets.UTF_8);
-    }
-
-    /**
-     * Constructs a new {@code ZipFile} allowing read access to the contents of the given file.
-     *
-     * <p>The {@code charset} is used to decode the file comment if one exists. If the character
-     * encoding for entry names and comments is not explicitly marked as UTF-8 by the zip file
-     * then {@code charset} is used to decode them.
-     *
-     * @throws ZipException if a zip error occurs.
-     * @throws IOException if an {@code IOException} occurs.
-     * @since 1.7
-     * @hide Until ready for an API update
-     */
-    public ZipFile(File file, Charset charset) throws ZipException, IOException {
-        this(file, OPEN_READ, charset);
+        this(file, OPEN_READ);
     }
 
     /**
@@ -146,7 +127,7 @@
      * @throws IOException if an IOException occurs.
      */
     public ZipFile(String name) throws IOException {
-        this(new File(name), OPEN_READ, StandardCharsets.UTF_8);
+        this(new File(name), OPEN_READ);
     }
 
     /**
@@ -162,31 +143,7 @@
      * @throws IOException if an {@code IOException} occurs.
      */
     public ZipFile(File file, int mode) throws IOException {
-        this(file, mode, StandardCharsets.UTF_8);
-    }
-
-    /**
-     * Constructs a new {@code ZipFile} allowing access to the given file.
-     *
-     * <p>The {@code mode} must be either {@code OPEN_READ} or {@code OPEN_READ|OPEN_DELETE}.
-     * If the {@code OPEN_DELETE} flag is supplied, the file will be deleted at or before the
-     * time that the {@code ZipFile} is closed (the contents will remain accessible until
-     * this {@code ZipFile} is closed); it also calls {@code File.deleteOnExit}.
-     *
-     * <p>The {@code charset} is used to decode the file comment if one exists. If the character
-     * encoding for entry names and comments is not explicitly marked as UTF-8 by the zip file
-     * then {@code charset} is used to decode them.
-     *
-     * @throws IOException if an {@code IOException} occurs.
-     * @since 1.7
-     * @hide Until ready for an API update
-     */
-    public ZipFile(File file, int mode, Charset charset) throws IOException {
         filename = file.getPath();
-        if (charset == null) {
-            throw new NullPointerException("charset == null");
-        }
-        this.charset = charset;
         if (mode != OPEN_READ && mode != (OPEN_READ | OPEN_DELETE)) {
             throw new IllegalArgumentException("Bad mode: " + mode);
         }
@@ -467,7 +424,7 @@
         if (commentLength > 0) {
             byte[] commentBytes = new byte[commentLength];
             raf.readFully(commentBytes);
-            comment = new String(commentBytes, 0, commentBytes.length, charset);
+            comment = new String(commentBytes, 0, commentBytes.length, StandardCharsets.UTF_8);
         }
 
         // Seek to the first CDE and read all entries.
@@ -478,7 +435,7 @@
         BufferedInputStream bufferedStream = new BufferedInputStream(rafStream, 4096);
         byte[] hdrBuf = new byte[CENHDR]; // Reuse the same buffer for each entry.
         for (int i = 0; i < numEntries; ++i) {
-            ZipEntry newEntry = new ZipEntry(hdrBuf, bufferedStream, charset);
+            ZipEntry newEntry = new ZipEntry(hdrBuf, bufferedStream, StandardCharsets.UTF_8);
             if (newEntry.localHeaderRelOffset >= centralDirOffset) {
                 throw new ZipException("Local file header offset is after central directory");
             }
diff --git a/luni/src/main/java/java/util/zip/ZipInputStream.java b/luni/src/main/java/java/util/zip/ZipInputStream.java
index 5a73619..4c0034e 100644
--- a/luni/src/main/java/java/util/zip/ZipInputStream.java
+++ b/luni/src/main/java/java/util/zip/ZipInputStream.java
@@ -21,7 +21,6 @@
 import java.io.InputStream;
 import java.io.PushbackInputStream;
 import java.nio.ByteOrder;
-import java.nio.charset.Charset;
 import java.nio.charset.ModifiedUtf8;
 import java.nio.charset.StandardCharsets;
 import java.util.Arrays;
@@ -90,35 +89,16 @@
 
     private char[] stringCharBuf = new char[256];
 
-    private final Charset charset;
-
     /**
      * Constructs a new {@code ZipInputStream} to read zip entries from the given input stream.
      *
      * <p>UTF-8 is used to decode all strings in the file.
      */
     public ZipInputStream(InputStream stream) {
-        this(stream, StandardCharsets.UTF_8);
-    }
-
-    /**
-     * Constructs a new {@code ZipInputStream} to read zip entries from the given input stream.
-     *
-     * <p>If the character encoding for entry names and comments is not explicitly marked as UTF-8
-     * by the zip file then {@code charset} is used to decode them.
-     *
-     * @since 1.7
-     * @hide Until ready for an API update
-     */
-    public ZipInputStream(InputStream stream, Charset charset) {
         super(new PushbackInputStream(stream, BUF_SIZE), new Inflater(true));
         if (stream == null) {
             throw new NullPointerException("stream == null");
         }
-        if (charset == null) {
-            throw new NullPointerException("charset == null");
-        }
-        this.charset = charset;
     }
 
     /**
@@ -272,12 +252,7 @@
         }
         int extraLength = peekShort(LOCEXT - LOCVER);
 
-        // Determine the character set to use to decode strings.
-        Charset charset = this.charset;
-        if ((flags & ZipFile.GPBF_UTF8_FLAG) != 0) {
-            charset = StandardCharsets.UTF_8;
-        }
-        String name = readString(nameLength, charset);
+        String name = readString(nameLength);
         currentEntry = createZipEntry(name);
         currentEntry.time = ceLastModifiedTime;
         currentEntry.modDate = ceLastModifiedDate;
@@ -298,21 +273,17 @@
     /**
      * Reads bytes from the current stream position returning the string representation.
      */
-    private String readString(int byteLength, Charset charset) throws IOException {
+    private String readString(int byteLength) throws IOException {
         if (byteLength > stringBytesBuf.length) {
             stringBytesBuf = new byte[byteLength];
         }
         Streams.readFully(in, stringBytesBuf, 0, byteLength);
-        if (charset == StandardCharsets.UTF_8) {
-            // The number of chars will always be less than or equal to the number of bytes. It's
-            // fine if this buffer is too long.
-            if (byteLength > stringCharBuf.length) {
-                stringCharBuf = new char[byteLength];
-            }
-            return ModifiedUtf8.decode(stringBytesBuf, stringCharBuf, 0, byteLength);
-        } else {
-            return new String(stringBytesBuf, 0, byteLength, charset);
+        // The number of chars will always be less than or equal to the number of bytes. It's
+        // fine if this buffer is too long.
+        if (byteLength > stringCharBuf.length) {
+            stringCharBuf = new char[byteLength];
         }
+        return ModifiedUtf8.decode(stringBytesBuf, stringCharBuf, 0, byteLength);
     }
 
     private int peekShort(int offset) {
diff --git a/luni/src/main/java/java/util/zip/ZipOutputStream.java b/luni/src/main/java/java/util/zip/ZipOutputStream.java
index ac6bdf2..8278355 100644
--- a/luni/src/main/java/java/util/zip/ZipOutputStream.java
+++ b/luni/src/main/java/java/util/zip/ZipOutputStream.java
@@ -20,7 +20,6 @@
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
-import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
 import java.util.Arrays;
 import java.util.HashSet;
@@ -76,8 +75,6 @@
 
     private final HashSet<String> entries = new HashSet<String>();
 
-    private final Charset charset;
-
     private int defaultCompressionMethod = DEFLATED;
 
     private int compressionLevel = Deflater.DEFAULT_COMPRESSION;
@@ -103,25 +100,7 @@
      * <p>UTF-8 will be used to encode the file comment, entry names and comments.
      */
     public ZipOutputStream(OutputStream os) {
-        this(os, StandardCharsets.UTF_8);
-    }
-
-    /**
-     * Constructs a new {@code ZipOutputStream} that writes a zip file to the given
-     * {@code OutputStream}.
-     *
-     * <p>The specified character set will be used to encode the file comment, entry names and
-     * comments.
-     *
-     * @since 1.7
-     * @hide Until ready for an API update
-     */
-    public ZipOutputStream(OutputStream os, Charset charset) {
         super(os, new Deflater(Deflater.DEFAULT_COMPRESSION, true));
-        if (charset == null) {
-            throw new NullPointerException("charset == null");
-        }
-        this.charset = charset;
     }
 
     /**
@@ -183,9 +162,7 @@
         // Since gingerbread, we always set the UTF-8 flag on individual files if appropriate.
         // Some tools insist that the central directory have the UTF-8 flag.
         // http://code.google.com/p/android/issues/detail?id=20214
-        if (charset == StandardCharsets.UTF_8) {
-            flags |= ZipFile.GPBF_UTF8_FLAG;
-        }
+        flags |= ZipFile.GPBF_UTF8_FLAG;
         writeLong(cDir, CENSIG);
         writeShort(cDir, ZIP_VERSION_2_0); // Version this file was made by.
         writeShort(cDir, ZIP_VERSION_2_0); // Minimum version needed to extract.
@@ -319,11 +296,11 @@
             // TODO: support Zip64.
             throw new ZipException("Too many entries for the zip file format's 16-bit entry count");
         }
-        nameBytes = ze.name.getBytes(charset);
+        nameBytes = ze.name.getBytes(StandardCharsets.UTF_8);
         checkSizeIsWithinShort("Name", nameBytes);
         entryCommentBytes = EmptyArray.BYTE;
         if (ze.comment != null) {
-            entryCommentBytes = ze.comment.getBytes(charset);
+            entryCommentBytes = ze.comment.getBytes(StandardCharsets.UTF_8);
             // The comment is not written out until the entry is finished, but it is validated here
             // to fail-fast.
             checkSizeIsWithinShort("Comment", entryCommentBytes);
@@ -340,9 +317,7 @@
         int flags = (method == STORED) ? 0 : ZipFile.GPBF_DATA_DESCRIPTOR_FLAG;
         // Java always outputs UTF-8 filenames. (Before Java 7, the RI didn't set this flag and used
         // modified UTF-8. From Java 7, when using UTF_8 it sets this flag and uses normal UTF-8.)
-        if (charset == StandardCharsets.UTF_8) {
-            flags |= ZipFile.GPBF_UTF8_FLAG;
-        }
+        flags |= ZipFile.GPBF_UTF8_FLAG;
         writeLong(out, LOCSIG); // Entry header
         writeShort(out, ZIP_VERSION_2_0); // Minimum version needed to extract.
         writeShort(out, flags);
@@ -384,7 +359,7 @@
             return;
         }
 
-        byte[] newCommentBytes = comment.getBytes(charset);
+        byte[] newCommentBytes = comment.getBytes(StandardCharsets.UTF_8);
         checkSizeIsWithinShort("Comment", newCommentBytes);
         this.commentBytes = newCommentBytes;
     }
@@ -455,8 +430,8 @@
 
     private void checkSizeIsWithinShort(String property, byte[] bytes) {
         if (bytes.length > 0xffff) {
-            throw new IllegalArgumentException(
-                    property + " too long in " + charset + ":" + bytes.length + " bytes");
+            throw new IllegalArgumentException(property + " too long in UTF-8:" + bytes.length +
+                                               " bytes");
         }
     }
 }
diff --git a/luni/src/test/java/libcore/java/lang/CharacterTest.java b/luni/src/test/java/libcore/java/lang/CharacterTest.java
index 0028521..94e3b96 100644
--- a/luni/src/test/java/libcore/java/lang/CharacterTest.java
+++ b/luni/src/test/java/libcore/java/lang/CharacterTest.java
@@ -277,66 +277,4 @@
       }
     }
   }
-
-  public void test_UnicodeScript_forName() throws Exception {
-    try {
-      Character.UnicodeScript.forName(null);
-      fail();
-    } catch (NullPointerException expected) {
-    }
-
-    try {
-      Character.UnicodeScript.forName("existential_dilemmas");
-      fail();
-    } catch (IllegalArgumentException expected) {
-    }
-
-    // Note that ICU is pretty lenient about block names and their abbreviations.
-    assertSame(Character.UnicodeScript.MALAYALAM, Character.UnicodeScript.forName("Malayalam"));
-    assertSame(Character.UnicodeScript.MALAYALAM, Character.UnicodeScript.forName("MalayaLAM"));
-    assertSame(Character.UnicodeScript.MALAYALAM, Character.UnicodeScript.forName("Mlym"));
-    assertSame(Character.UnicodeScript.MALAYALAM, Character.UnicodeScript.forName("MlYM"));
-
-    assertSame(Character.UnicodeScript.OLD_SOUTH_ARABIAN, Character.UnicodeScript.forName("Old_south_arabian"));
-
-    // NOTE: This test fails on the RI because they're much stricter in
-    // their matching. Strict enough that they fail on "Old south arabian", despite
-    // it being the official name AND the alias for this script.
-    assertSame(Character.UnicodeScript.OLD_SOUTH_ARABIAN, Character.UnicodeScript.forName("Old south arabian"));
-    assertSame(Character.UnicodeScript.OLD_SOUTH_ARABIAN, Character.UnicodeScript.forName("SARB"));
-
-    // A script that's recognized by ICU but not a part of the standard
-    // java script values.
-    try {
-      Character.UnicodeScript.forName("Old north arabian");
-      fail();
-    } catch (IllegalArgumentException expected) {
-    }
-  }
-
-  public void test_UnicodeScript_of() throws Exception {
-    try {
-      Character.UnicodeScript.of(-1);
-      fail();
-    } catch (IllegalArgumentException expected) {
-    }
-
-    try {
-      Character.UnicodeScript.of(0xffffff);
-      fail();
-    } catch (IllegalArgumentException expected) {
-    }
-
-    // The example from the ICU4C unit tests.
-    assertSame(Character.UnicodeScript.MALAYALAM, Character.UnicodeScript.of(0x0D02));
-
-    // Special cases:
-    //
-    // 0640 is the ARABIC_TATWEEL, used by both Mandiac & Syriac
-    assertSame(Character.UnicodeScript.COMMON, Character.UnicodeScript.of(0x0640));
-    // 0300 is the COMBINING GRAVE ACCENT, which should be INHERITED because it's
-    // a nonspacing mark.
-    assertSame(Character.UnicodeScript.INHERITED, Character.UnicodeScript.of(0x0300));
-    assertSame(Character.UnicodeScript.COMMON, Character.UnicodeScript.of(0x0640));
-  }
 }
diff --git a/luni/src/test/java/libcore/java/net/SocketTest.java b/luni/src/test/java/libcore/java/net/SocketTest.java
index b9ed99c..fb09be0 100644
--- a/luni/src/test/java/libcore/java/net/SocketTest.java
+++ b/luni/src/test/java/libcore/java/net/SocketTest.java
@@ -90,7 +90,7 @@
         // Open a local server port.
         ServerSocketChannel ssc = ServerSocketChannel.open();
         InetSocketAddress listenAddr = new InetSocketAddress(host, 0);
-        ssc.bind(listenAddr, 0);
+        ssc.socket().bind(listenAddr, 0);
         ServerSocket ss = ssc.socket();
 
         // Open a socket to the local port.
@@ -110,7 +110,7 @@
             in.socket().setTcpNoDelay(false);
         }
 
-        InetSocketAddress listenAddress = (InetSocketAddress) in.getLocalAddress();
+        InetSocketAddress listenAddress = (InetSocketAddress) in.socket().getLocalSocketAddress();
         InetSocketAddress outRemoteAddress = (InetSocketAddress) out.socket().getRemoteSocketAddress();
         InetSocketAddress outLocalAddress = (InetSocketAddress) out.socket().getLocalSocketAddress();
         InetSocketAddress inLocalAddress = (InetSocketAddress) in.socket().getLocalSocketAddress();
diff --git a/luni/src/test/java/libcore/java/nio/channels/DatagramChannelMulticastTest.java b/luni/src/test/java/libcore/java/nio/channels/DatagramChannelMulticastTest.java
deleted file mode 100644
index f0db3ba..0000000
--- a/luni/src/test/java/libcore/java/nio/channels/DatagramChannelMulticastTest.java
+++ /dev/null
@@ -1,1120 +0,0 @@
-package libcore.java.nio.channels;
-
-import junit.framework.AssertionFailedError;
-import junit.framework.TestCase;
-
-import java.io.IOException;
-import java.net.Inet4Address;
-import java.net.Inet6Address;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.net.InterfaceAddress;
-import java.net.NetworkInterface;
-import java.net.SocketAddress;
-import java.net.SocketException;
-import java.net.StandardSocketOptions;
-import java.nio.ByteBuffer;
-import java.nio.channels.ClosedChannelException;
-import java.nio.channels.DatagramChannel;
-import java.nio.channels.MembershipKey;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.List;
-
-/**
- * Tests associated with multicast behavior of DatagramChannel.
- */
-public class DatagramChannelMulticastTest extends TestCase {
-
-  private static InetAddress lookup(String s) {
-    try {
-      return InetAddress.getByName(s);
-    } catch (IOException ex) {
-      throw new RuntimeException(ex);
-    }
-  }
-
-  // These IP addresses aren't inherently "good" or "bad"; they're just used like that.
-  // We use the "good" addresses for our actual group, and the "bad" addresses are for a group that
-  // we won't actually set up.
-  private static final InetAddress GOOD_MULTICAST_IPv4 = lookup("239.255.0.1");
-  private static final InetAddress BAD_MULTICAST_IPv4 = lookup("239.255.0.2");
-  private static final InetAddress GOOD_MULTICAST_IPv6 = lookup("ff05::7:7");
-  private static final InetAddress BAD_MULTICAST_IPv6 = lookup("ff05::7:8");
-
-  // Special addresses.
-  private static final InetAddress WILDCARD_IPv4 = lookup("0.0.0.0");
-  private static final InetAddress WILDCARD_IPv6 = lookup("::");
-
-  // Arbitrary unicast addresses. Used when the value doesn't actually matter. e.g. for source
-  // filters.
-  private static final InetAddress UNICAST_IPv4_1 = lookup("192.168.1.1");
-  private static final InetAddress UNICAST_IPv4_2 = lookup("192.168.1.2");
-  private static final InetAddress UNICAST_IPv6_1 = lookup("2001:db8::1");
-  private static final InetAddress UNICAST_IPv6_2 = lookup("2001:db8::2");
-
-  private List<NetworkInterface> ipv4networkInterfaces = new ArrayList<NetworkInterface>();
-  private List<NetworkInterface> ipv6networkInterfaces = new ArrayList<NetworkInterface>();
-  private NetworkInterface ipv4networkInterface;
-  private NetworkInterface ipv6networkInterface;
-  private NetworkInterface loopbackInterface;
-
-  @Override
-  protected void setUp() throws Exception {
-    // The loopback interface isn't actually useful for sending/receiving multicast messages but it
-    // can be used as a dummy for tests where that does not matter.
-    loopbackInterface = NetworkInterface.getByInetAddress(InetAddress.getLoopbackAddress());
-    assertNotNull(loopbackInterface);
-    assertTrue(loopbackInterface.isLoopback());
-    assertFalse(loopbackInterface.supportsMulticast());
-
-    Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
-    assertNotNull(interfaces);
-    // Only consider interfaces that have addresses associated with them. Otherwise tests don't work
-    // so well.
-    while (interfaces.hasMoreElements()) {
-      NetworkInterface networkInterface = interfaces.nextElement();
-      if (willWorkForMulticast(networkInterface)) {
-        Enumeration<InetAddress> addresses = networkInterface.getInetAddresses();
-        while (addresses.hasMoreElements()) {
-          final InetAddress nextAddress = addresses.nextElement();
-          if (nextAddress instanceof Inet4Address) {
-            ipv4networkInterfaces.add(networkInterface);
-          } else if (nextAddress instanceof Inet6Address) {
-            ipv6networkInterfaces.add(networkInterface);
-          }
-        }
-      }
-    }
-    assertTrue(
-        "Test environment must have network interfaces capable of both IPv4 and IPv6 multicast",
-        ipv4networkInterfaces.size() > 0 && ipv6networkInterfaces.size() > 0);
-    ipv4networkInterface = ipv4networkInterfaces.get(0);
-    ipv6networkInterface = ipv6networkInterfaces.get(0);
-  }
-
-  public void test_open() throws IOException {
-    DatagramChannel dc = DatagramChannel.open();
-
-    // Unlike MulticastSocket, DatagramChannel has SO_REUSEADDR set to false by default.
-    assertFalse(dc.getOption(StandardSocketOptions.SO_REUSEADDR));
-
-    // Confirm multicast loop is on by default as specified in the docs. Many tests in this class
-    // depend on this being true.
-    assertTrue(dc.getOption(StandardSocketOptions.IP_MULTICAST_LOOP));
-
-    assertNull(dc.getLocalAddress());
-    assertTrue(dc.isOpen());
-    assertFalse(dc.isConnected());
-
-    dc.close();
-  }
-
-  public void test_bind_null() throws Exception {
-    DatagramChannel dc = createReceiverChannel();
-    assertNotNull(dc.getLocalAddress());
-    assertTrue(dc.isOpen());
-    assertFalse(dc.isConnected());
-
-    dc.close();
-    try {
-      dc.getLocalAddress();
-      fail();
-    } catch (ClosedChannelException expected) {
-    }
-    assertFalse(dc.isOpen());
-    assertFalse(dc.isConnected());
-  }
-
-  public void test_joinAnySource_afterClose() throws Exception {
-    DatagramChannel dc = createReceiverChannel();
-    dc.close();
-    try {
-      dc.join(GOOD_MULTICAST_IPv4, ipv4networkInterface);
-      fail();
-    } catch (ClosedChannelException expected) {
-    }
-  }
-
-  public void test_joinAnySource_nullGroupAddress() throws Exception {
-    DatagramChannel dc = createReceiverChannel();
-    try {
-      dc.join(null, ipv4networkInterface);
-      fail();
-    } catch (NullPointerException expected) {
-    }
-    dc.close();
-  }
-
-  public void test_joinAnySource_nullNetworkInterface() throws Exception {
-    DatagramChannel dc = createReceiverChannel();
-    try {
-      dc.join(GOOD_MULTICAST_IPv4, null);
-      fail();
-    } catch (NullPointerException expected) {
-    }
-    dc.close();
-  }
-
-  public void test_joinAnySource_nonMulticastGroupAddress_IPv4() throws Exception {
-    for (NetworkInterface networkInterface : ipv4networkInterfaces) {
-      test_joinAnySource_illegalArgumentExpected(networkInterface, UNICAST_IPv4_1);
-    }
-  }
-
-  public void test_joinAnySource_nonMulticastGroupAddress_IPv6() throws Exception {
-    for (NetworkInterface networkInterface : ipv6networkInterfaces) {
-      test_joinAnySource_illegalArgumentExpected(networkInterface, UNICAST_IPv6_1);
-    }
-  }
-
-  private void test_joinAnySource_illegalArgumentExpected(NetworkInterface networkInterface,
-      InetAddress group) throws Exception {
-    DatagramChannel dc = createReceiverChannel();
-    try {
-      dc.join(group, networkInterface);
-      fail();
-    } catch (IllegalArgumentException expected) {
-    }
-    dc.close();
-  }
-
-  public void test_joinAnySource_IPv4() throws Exception {
-    test_joinAnySource(ipv4networkInterfaces, GOOD_MULTICAST_IPv4, BAD_MULTICAST_IPv4);
-  }
-
-  public void test_joinAnySource_IPv6() throws Exception {
-    test_joinAnySource(ipv6networkInterfaces, GOOD_MULTICAST_IPv6, BAD_MULTICAST_IPv6);
-  }
-
-  private void test_joinAnySource(
-      Iterable<NetworkInterface> networkInterfaces, InetAddress group, InetAddress group2)
-      throws Exception {
-    for (NetworkInterface networkInterface : networkInterfaces) {
-      // Set up a receiver join the group on networkInterface.
-      DatagramChannel receiverChannel = createReceiverChannel();
-      InetSocketAddress localAddress = (InetSocketAddress) receiverChannel.getLocalAddress();
-      receiverChannel.join(group, networkInterface);
-
-      // Send a message to the group we joined.
-      String msg = "Hello World";
-      sendMessage(group, localAddress.getPort(), msg, networkInterface);
-
-      // Now verify that we received the data as expected.
-      ByteBuffer recvBuffer = ByteBuffer.allocate(100);
-      SocketAddress sourceAddress = receiverChannel.receive(recvBuffer);
-      assertNotNull(sourceAddress);
-      assertEquals(msg, new String(recvBuffer.array(), 0, recvBuffer.position()));
-
-      // Send a message to the group we did not join.
-      String msg2 = "Hello World - Different Group";
-      sendMessage(group2, localAddress.getPort(), msg2, networkInterface);
-      recvBuffer.position(0);
-      // Now verify that we didn't receive the second message.
-      SocketAddress sourceAddress2 = receiverChannel.receive(recvBuffer);
-      assertNull(sourceAddress2);
-
-      receiverChannel.close();
-    }
-  }
-
-  public void test_joinAnySource_processLimit() throws Exception {
-    DatagramChannel dc = createReceiverChannel();
-    for (byte i = 1; i <= 25; i++) {
-      InetAddress groupAddress = Inet4Address.getByName("239.255.0." + i);
-      try {
-        dc.join(groupAddress, ipv4networkInterface);
-      } catch (SocketException e) {
-        // There is a limit, that's ok according to the RI docs. For this test a lower bound of 20
-        // is used, which appears to be the default linux limit.
-        // See /proc/sys/net/ipv4/igmp_max_memberships.
-        assertTrue(i > 20);
-        break;
-      }
-    }
-
-    dc.close();
-  }
-
-  public void test_joinAnySource_blockLimit() throws Exception {
-    DatagramChannel dc = createReceiverChannel();
-    MembershipKey key = dc.join(GOOD_MULTICAST_IPv4, ipv4networkInterface);
-    for (byte i = 1; i <= 15; i++) {
-      InetAddress sourceAddress = Inet4Address.getByName("10.0.0." + i);
-      try {
-        key.block(sourceAddress);
-      } catch (SocketException e) {
-        // There is a limit, that's ok according to the RI docs. For this test a lower bound of 10
-        // is used, which appears to be the default linux limit.
-        // See /proc/sys/net/ipv4/igmp_max_msf.
-        assertTrue(i > 10);
-        break;
-      }
-    }
-
-    dc.close();
-  }
-
-  /** Confirms that calling join() does not cause an implicit bind() to take place. */
-  public void test_joinAnySource_doesNotCauseBind_IPv4() throws Exception {
-    test_joinAnySource_doesNotCauseBind(ipv4networkInterfaces, GOOD_MULTICAST_IPv4);
-  }
-
-  public void test_joinAnySource_doesNotCauseBind_IPv6() throws Exception {
-    test_joinAnySource_doesNotCauseBind(ipv6networkInterfaces, GOOD_MULTICAST_IPv6);
-  }
-
-  private void test_joinAnySource_doesNotCauseBind(
-      Iterable<NetworkInterface> networkInterfaces, InetAddress group) throws IOException {
-    for (NetworkInterface networkInterface : networkInterfaces) {
-      DatagramChannel dc = DatagramChannel.open();
-      dc.join(group, networkInterface);
-      assertNull(dc.getLocalAddress());
-      dc.close();
-    }
-  }
-
-  public void test_joinAnySource_networkInterfaces() throws Exception {
-    // Check that we can join on specific interfaces and that we only receive if data is
-    // received on that interface. This test is only really useful on devices with multiple
-    // non-loopback interfaces.
-
-    ArrayList<NetworkInterface> realInterfaces = new ArrayList<NetworkInterface>();
-    Enumeration<NetworkInterface> theInterfaces = NetworkInterface.getNetworkInterfaces();
-    while (theInterfaces.hasMoreElements()) {
-      NetworkInterface thisInterface = theInterfaces.nextElement();
-      // Skip interfaces that do not support multicast - there's no point in proving they cannot
-      // send / receive multicast messages.
-      if (willWorkForMulticast(thisInterface)) {
-        realInterfaces.add(thisInterface);
-      }
-    }
-
-    for (NetworkInterface thisInterface : realInterfaces) {
-      // Get the first address on the interface.
-      Enumeration<InetAddress> addresses = thisInterface.getInetAddresses();
-
-      while (addresses.hasMoreElements()) {
-        InetAddress listenAddress = addresses.nextElement();
-
-        // Start a server which is joined to the group and has only asked for packets on this
-        // interface.
-        NetworkInterface sendingInterface;
-        InetAddress group;
-        if (listenAddress instanceof Inet4Address) {
-          group = GOOD_MULTICAST_IPv4;
-          sendingInterface = ipv4networkInterface;
-        } else {
-          group = GOOD_MULTICAST_IPv6;
-          sendingInterface = ipv6networkInterface;
-        }
-        DatagramChannel dc = createReceiverChannel();
-        InetSocketAddress localAddress = (InetSocketAddress) dc.getLocalAddress();
-        dc.join(group, thisInterface);
-
-        // Now send out a packet on sendingInterface. We should only see the packet if we send
-        // it on the same interface we are listening on (thisInterface).
-        String msg = "Hello World - Again " + thisInterface.getName();
-        sendMessage(group, localAddress.getPort(), msg, sendingInterface);
-
-        ByteBuffer recvBuffer = ByteBuffer.allocate(100);
-        SocketAddress sourceAddress = dc.receive(recvBuffer);
-        if (thisInterface.equals(sendingInterface)) {
-          assertEquals(msg, new String(recvBuffer.array(), 0, recvBuffer.position()));
-        } else {
-          assertNull(sourceAddress);
-        }
-
-        dc.close();
-      }
-    }
-  }
-
-  /** Confirms that the scope of each membership is network interface-level. */
-  public void test_join_canMixJoinTypesOnDifferentInterfaces() throws Exception {
-    DatagramChannel dc = DatagramChannel.open();
-    MembershipKey membershipKey1 = dc.join(GOOD_MULTICAST_IPv4, ipv4networkInterface);
-    MembershipKey membershipKey2 = dc.join(GOOD_MULTICAST_IPv4, loopbackInterface, UNICAST_IPv4_1);
-    assertNotSame(membershipKey1, membershipKey2);
-
-    dc.close();
-  }
-
-  public void test_joinAnySource_multiple_joins_IPv4()
-      throws Exception {
-    test_joinAnySource_multiple_joins(ipv4networkInterfaces, GOOD_MULTICAST_IPv4);
-  }
-
-  public void test_joinAnySource_multiple_joins_IPv6()
-      throws Exception {
-    test_joinAnySource_multiple_joins(ipv6networkInterfaces, GOOD_MULTICAST_IPv6);
-  }
-
-  private void test_joinAnySource_multiple_joins(
-      Iterable<NetworkInterface> networkInterfaces, InetAddress group) throws Exception {
-    for (NetworkInterface networkInterface : networkInterfaces) {
-      DatagramChannel dc = createReceiverChannel();
-
-      MembershipKey membershipKey1 = dc.join(group, networkInterface);
-
-      MembershipKey membershipKey2 = dc.join(group, loopbackInterface);
-      assertFalse(membershipKey1.equals(membershipKey2));
-
-      MembershipKey membershipKey1_2 = dc.join(group, networkInterface);
-      assertEquals(membershipKey1, membershipKey1_2);
-
-      dc.close();
-    }
-  }
-
-  public void test_joinAnySource_multicastLoopOption_IPv4() throws Exception {
-    test_joinAnySource_multicastLoopOption(ipv4networkInterfaces, GOOD_MULTICAST_IPv4);
-  }
-
-  public void test_joinAnySource_multicastLoopOption_IPv6() throws Exception {
-    test_joinAnySource_multicastLoopOption(ipv6networkInterfaces, GOOD_MULTICAST_IPv6);
-  }
-
-  private void test_joinAnySource_multicastLoopOption(
-      Iterable<NetworkInterface> networkInterfaces, InetAddress group) throws Exception {
-    final String message = "Hello, world!";
-
-    for (NetworkInterface networkInterface : networkInterfaces) {
-      DatagramChannel dc = DatagramChannel.open();
-      configureChannelForReceiving(dc);
-      dc.bind(null /* leave the OS to determine the port, and use the wildcard address */);
-
-      // Make sure that the sent packets will be sent via the interface we will be joining with.
-      dc.setOption(StandardSocketOptions.IP_MULTICAST_IF, networkInterface);
-      dc.join(group, networkInterface);
-
-      // Test with loop on.
-      dc.setOption(StandardSocketOptions.IP_MULTICAST_LOOP, true /* enable loop */);
-
-      InetSocketAddress localAddress = (InetSocketAddress) dc.getLocalAddress();
-
-      // Send the datagram.
-      sendMessage(dc, message, new InetSocketAddress(group, localAddress.getPort()));
-
-      // Receive the datagram.
-      ByteBuffer recvBuffer = ByteBuffer.allocate(100);
-      SocketAddress sourceAddress = dc.receive(recvBuffer);
-      assertNotNull(sourceAddress);
-
-      String recvMessage = new String(recvBuffer.array(), 0, recvBuffer.position());
-      assertEquals(message, recvMessage);
-
-      // Turn off loop.
-      dc.setOption(StandardSocketOptions.IP_MULTICAST_LOOP, false /* enable loopback */);
-
-      // Send another datagram.
-      recvBuffer.position(0);
-      sendMessage(dc, message, new InetSocketAddress(group, localAddress.getPort()));
-
-      SocketAddress sourceAddress2 = dc.receive(recvBuffer);
-      assertNull(sourceAddress2);
-
-      dc.close();
-    }
-  }
-
-  public void testMembershipKeyAccessors_IPv4() throws Exception {
-    testMembershipKeyAccessors(ipv4networkInterfaces, GOOD_MULTICAST_IPv4);
-  }
-
-  public void testMembershipKeyAccessors_IPv6() throws Exception {
-    testMembershipKeyAccessors(ipv6networkInterfaces, GOOD_MULTICAST_IPv6);
-  }
-
-  private void testMembershipKeyAccessors(
-      Iterable<NetworkInterface> networkInterfaces, InetAddress group) throws Exception {
-    for (NetworkInterface networkInterface : networkInterfaces) {
-      DatagramChannel dc = createReceiverChannel();
-
-      MembershipKey key = dc.join(group, networkInterface);
-      assertSame(dc, key.channel());
-      assertSame(group, key.group());
-      assertTrue(key.isValid());
-      assertSame(networkInterface, key.networkInterface());
-      assertNull(key.sourceAddress());
-    }
-  }
-
-  public void test_dropAnySource_twice_IPv4() throws Exception {
-    test_dropAnySource_twice(ipv4networkInterfaces, GOOD_MULTICAST_IPv4);
-  }
-
-  public void test_dropAnySource_twice_IPv6() throws Exception {
-    test_dropAnySource_twice(ipv6networkInterfaces, GOOD_MULTICAST_IPv6);
-  }
-
-  private void test_dropAnySource_twice(
-      Iterable<NetworkInterface> networkInterfaces, InetAddress group)
-      throws Exception {
-    for (NetworkInterface networkInterface : networkInterfaces) {
-      DatagramChannel dc = createReceiverChannel();
-      MembershipKey membershipKey = dc.join(group, networkInterface);
-
-      assertTrue(membershipKey.isValid());
-      membershipKey.drop();
-      assertFalse(membershipKey.isValid());
-
-      // Try to leave a group we are no longer a member of. It should do nothing.
-      membershipKey.drop();
-
-      dc.close();
-    }
-  }
-
-  public void test_close_invalidatesMembershipKey() throws Exception {
-    DatagramChannel dc = createReceiverChannel();
-    MembershipKey membershipKey = dc.join(GOOD_MULTICAST_IPv4, ipv4networkInterface);
-
-    assertTrue(membershipKey.isValid());
-
-    dc.close();
-
-    assertFalse(membershipKey.isValid());
-  }
-
-  public void test_block_null() throws Exception {
-    DatagramChannel dc = createReceiverChannel();
-    MembershipKey membershipKey = dc.join(GOOD_MULTICAST_IPv4, ipv4networkInterface);
-    try {
-      membershipKey.block(null);
-      fail();
-    } catch (NullPointerException expected) {
-    }
-
-    dc.close();
-  }
-
-  public void test_block_mixedAddressTypes_IPv4() throws Exception {
-    test_block_illegalArgument(ipv4networkInterfaces, GOOD_MULTICAST_IPv4, UNICAST_IPv6_1);
-  }
-
-  public void test_block_mixedAddressTypes_IPv6() throws Exception {
-    test_block_illegalArgument(ipv6networkInterfaces, GOOD_MULTICAST_IPv6, UNICAST_IPv4_1);
-  }
-
-  private void test_block_illegalArgument(
-      Iterable<NetworkInterface> networkInterfaces, InetAddress groupAddress,
-      InetAddress badBlockAddress) throws Exception {
-
-    for (NetworkInterface networkInterface : networkInterfaces) {
-      DatagramChannel dc = createReceiverChannel();
-      MembershipKey membershipKey = dc.join(groupAddress, networkInterface);
-      try {
-        membershipKey.block(badBlockAddress);
-        fail();
-      } catch (IllegalArgumentException expected) {
-      }
-
-      dc.close();
-    }
-  }
-
-  public void test_block_cannotBlockWithSourceSpecificMembership() throws Exception {
-    DatagramChannel dc = createReceiverChannel();
-    MembershipKey membershipKey =
-        dc.join(GOOD_MULTICAST_IPv4, ipv4networkInterface, UNICAST_IPv4_1);
-    try {
-      membershipKey.block(UNICAST_IPv4_2);
-      fail();
-    } catch (IllegalStateException expected) {
-    }
-
-    dc.close();
-  }
-
-  public void test_block_multipleBlocksIgnored() throws Exception {
-    DatagramChannel dc = createReceiverChannel();
-    MembershipKey membershipKey = dc.join(GOOD_MULTICAST_IPv4, ipv4networkInterface);
-    membershipKey.block(UNICAST_IPv4_1);
-
-    MembershipKey membershipKey2 = membershipKey.block(UNICAST_IPv4_1);
-    assertSame(membershipKey2, membershipKey);
-
-    dc.close();
-  }
-
-  public void test_block_wildcardAddress() throws Exception {
-    DatagramChannel dc = createReceiverChannel();
-    MembershipKey membershipKey = dc.join(GOOD_MULTICAST_IPv4, ipv4networkInterface);
-    try {
-      membershipKey.block(WILDCARD_IPv4);
-      fail();
-    } catch (IllegalArgumentException expected) {
-    }
-
-    dc.close();
-  }
-
-  public void test_unblock_multipleUnblocksFail() throws Exception {
-    DatagramChannel dc = createReceiverChannel();
-    MembershipKey membershipKey = dc.join(GOOD_MULTICAST_IPv4, ipv4networkInterface);
-
-    try {
-      membershipKey.unblock(UNICAST_IPv4_1);
-      fail();
-    } catch (IllegalStateException expected) {
-    }
-
-    assertTrue(membershipKey.isValid());
-
-    membershipKey.block(UNICAST_IPv4_1);
-    membershipKey.unblock(UNICAST_IPv4_1);
-
-    try {
-      membershipKey.unblock(UNICAST_IPv4_1);
-      fail();
-    } catch (IllegalStateException expected) {
-    }
-
-    dc.close();
-  }
-
-  public void test_unblock_null() throws Exception {
-    DatagramChannel dc = createReceiverChannel();
-    MembershipKey membershipKey = dc.join(GOOD_MULTICAST_IPv4, ipv4networkInterface);
-    membershipKey.block(UNICAST_IPv4_1);
-
-    try {
-      membershipKey.unblock(null);
-      fail();
-    } catch (IllegalStateException expected) {
-      // Either of these exceptions are fine.
-    } catch (NullPointerException expected) {
-      // Either of these exception are fine.
-    }
-
-    dc.close();
-  }
-
-  public void test_unblock_mixedAddressTypes_IPv4() throws Exception {
-    DatagramChannel dc = createReceiverChannel();
-    MembershipKey membershipKey = dc.join(GOOD_MULTICAST_IPv4, ipv4networkInterface);
-    try {
-      membershipKey.unblock(UNICAST_IPv6_1);
-      fail();
-    } catch (IllegalStateException expected) {
-      // Either of these exceptions are fine.
-    } catch (IllegalArgumentException expected) {
-      // Either of these exceptions are fine.
-    }
-
-    dc.close();
-  }
-
-  public void test_unblock_mixedAddressTypes_IPv6() throws Exception {
-    DatagramChannel dc = createReceiverChannel();
-    MembershipKey membershipKey = dc.join(GOOD_MULTICAST_IPv6, ipv6networkInterface);
-    try {
-      membershipKey.unblock(UNICAST_IPv4_1);
-      fail();
-    } catch (IllegalStateException expected) {
-      // Either of these exceptions are fine.
-    } catch (IllegalArgumentException expected) {
-      // Either of these exceptions are fine.
-    }
-
-    dc.close();
-  }
-
-  /** Checks that block() works when the receiver is bound to the multicast group address */
-  public void test_block_filtersAsExpected_groupBind_IPv4() throws Exception {
-    for (NetworkInterface networkInterface : ipv4networkInterfaces) {
-      InetAddress ipv4LocalAddress = getLocalIpv4Address(networkInterface);
-      test_block_filtersAsExpected(
-          networkInterface,
-          ipv4LocalAddress /* senderBindAddress */,
-          GOOD_MULTICAST_IPv4 /* receiverBindAddress */,
-          GOOD_MULTICAST_IPv4 /* groupAddress */);
-    }
-  }
-
-  /** Checks that block() works when the receiver is bound to the multicast group address */
-  public void test_block_filtersAsExpected_groupBind_IPv6() throws Exception {
-    for (NetworkInterface networkInterface : ipv6networkInterfaces) {
-      InetAddress ipv6LocalAddress = getLocalIpv6Address(networkInterface);
-      test_block_filtersAsExpected(
-          networkInterface,
-          ipv6LocalAddress /* senderBindAddress */,
-          GOOD_MULTICAST_IPv6 /* receiverBindAddress */,
-          GOOD_MULTICAST_IPv6 /* groupAddress */);
-    }
-  }
-
-  /** Checks that block() works when the receiver is bound to the "any" address */
-  public void test_block_filtersAsExpected_anyBind_IPv4() throws Exception {
-    for (NetworkInterface networkInterface : ipv4networkInterfaces) {
-      InetAddress ipv4LocalAddress = getLocalIpv4Address(networkInterface);
-      test_block_filtersAsExpected(
-          networkInterface,
-          ipv4LocalAddress /* senderBindAddress */,
-          WILDCARD_IPv4 /* receiverBindAddress */,
-          GOOD_MULTICAST_IPv4 /* groupAddress */);
-    }
-  }
-
-  /** Checks that block() works when the receiver is bound to the "any" address */
-  public void test_block_filtersAsExpected_anyBind_IPv6() throws Exception {
-    for (NetworkInterface networkInterface : ipv6networkInterfaces) {
-      InetAddress ipv6LocalAddress = getLocalIpv6Address(networkInterface);
-      test_block_filtersAsExpected(
-          networkInterface,
-          ipv6LocalAddress /* senderBindAddress */,
-          WILDCARD_IPv6 /* receiverBindAddress */,
-          GOOD_MULTICAST_IPv6 /* groupAddress */);
-    }
-  }
-
-  private void test_block_filtersAsExpected(
-      NetworkInterface networkInterface, InetAddress senderBindAddress,
-      InetAddress receiverBindAddress, InetAddress groupAddress) throws Exception {
-
-    DatagramChannel sendingChannel = DatagramChannel.open();
-    // In order to block a sender the sender's address must be known. The sendingChannel is
-    // explicitly bound to a known, non-loopback address.
-    sendingChannel.bind(new InetSocketAddress(senderBindAddress, 0));
-    InetSocketAddress sendingAddress = (InetSocketAddress) sendingChannel.getLocalAddress();
-
-    DatagramChannel receivingChannel = DatagramChannel.open();
-    configureChannelForReceiving(receivingChannel);
-    receivingChannel.bind(
-        new InetSocketAddress(receiverBindAddress, 0) /* local port left to the OS to determine */);
-    InetSocketAddress localReceivingAddress =
-        (InetSocketAddress) receivingChannel.getLocalAddress();
-    InetSocketAddress groupSocketAddress =
-        new InetSocketAddress(groupAddress, localReceivingAddress.getPort());
-    MembershipKey membershipKey =
-        receivingChannel.join(groupSocketAddress.getAddress(), networkInterface);
-
-    ByteBuffer receiveBuffer = ByteBuffer.allocate(10);
-
-    // Send a message. It should be received.
-    String msg1 = "Hello1";
-    sendMessage(sendingChannel, msg1, groupSocketAddress);
-    InetSocketAddress sourceAddress1 = (InetSocketAddress) receivingChannel.receive(receiveBuffer);
-    assertEquals(sendingAddress, sourceAddress1);
-    assertEquals(msg1, new String(receiveBuffer.array(), 0, receiveBuffer.position()));
-
-    // Now block the sender.
-    membershipKey.block(sendingAddress.getAddress());
-
-    // Send a message. It should be filtered.
-    String msg2 = "Hello2";
-    sendMessage(sendingChannel, msg2, groupSocketAddress);
-    receiveBuffer.position(0);
-    InetSocketAddress sourceAddress2 = (InetSocketAddress) receivingChannel.receive(receiveBuffer);
-    assertNull(sourceAddress2);
-
-    // Now unblock the sender.
-    membershipKey.unblock(sendingAddress.getAddress());
-
-    // Send a message. It should be received.
-    String msg3 = "Hello3";
-    sendMessage(sendingChannel, msg3, groupSocketAddress);
-    receiveBuffer.position(0);
-    InetSocketAddress sourceAddress3 = (InetSocketAddress) receivingChannel.receive(receiveBuffer);
-    assertEquals(sourceAddress3, sendingAddress);
-    assertEquals(msg3, new String(receiveBuffer.array(), 0, receiveBuffer.position()));
-
-    sendingChannel.close();
-    receivingChannel.close();
-  }
-
-  public void test_joinSourceSpecific_nullGroupAddress() throws Exception {
-    DatagramChannel dc = createReceiverChannel();
-    try {
-      dc.join(null, ipv4networkInterface, UNICAST_IPv4_1);
-      fail();
-    } catch (NullPointerException expected) {
-    }
-    dc.close();
-  }
-
-  public void test_joinSourceSpecific_afterClose() throws Exception {
-    DatagramChannel dc = createReceiverChannel();
-    dc.close();
-    try {
-      dc.join(GOOD_MULTICAST_IPv4, ipv4networkInterface, UNICAST_IPv4_1);
-      fail();
-    } catch (ClosedChannelException expected) {
-    }
-  }
-
-  public void test_joinSourceSpecific_nullNetworkInterface() throws Exception {
-    DatagramChannel dc = createReceiverChannel();
-    try {
-      dc.join(GOOD_MULTICAST_IPv4, null, UNICAST_IPv4_1);
-      fail();
-    } catch (NullPointerException expected) {
-    }
-    dc.close();
-  }
-
-  public void test_joinSourceSpecific_nonMulticastGroupAddress_IPv4() throws Exception {
-    DatagramChannel dc = createReceiverChannel();
-    try {
-      dc.join(UNICAST_IPv4_1, ipv4networkInterface, UNICAST_IPv4_1);
-      fail();
-    } catch (IllegalArgumentException expected) {
-    }
-    dc.close();
-  }
-
-  public void test_joinSourceSpecific_nonMulticastGroupAddress_IPv6() throws Exception {
-    DatagramChannel dc = createReceiverChannel();
-    try {
-      dc.join(UNICAST_IPv6_1, ipv6networkInterface, UNICAST_IPv6_1);
-      fail();
-    } catch (IllegalArgumentException expected) {
-    }
-    dc.close();
-  }
-
-  public void test_joinSourceSpecific_nullSourceAddress_IPv4() throws Exception {
-    DatagramChannel dc = createReceiverChannel();
-    try {
-      dc.join(GOOD_MULTICAST_IPv4, ipv4networkInterface, null);
-      fail();
-    } catch (NullPointerException expected) {
-    }
-    dc.close();
-  }
-
-  public void test_joinSourceSpecific_nullSourceAddress_IPv6() throws Exception {
-    DatagramChannel dc = createReceiverChannel();
-    try {
-      dc.join(GOOD_MULTICAST_IPv6, ipv6networkInterface, null);
-      fail();
-    } catch (NullPointerException expected) {
-    }
-    dc.close();
-  }
-
-  public void test_joinSourceSpecific_mixedAddressTypes() throws Exception {
-    DatagramChannel dc = createReceiverChannel();
-    try {
-      dc.join(GOOD_MULTICAST_IPv4, ipv4networkInterface, UNICAST_IPv6_1);
-      fail();
-    } catch (IllegalArgumentException expected) {
-    }
-    try {
-      dc.join(GOOD_MULTICAST_IPv6, ipv6networkInterface, UNICAST_IPv4_1);
-      fail();
-    } catch (IllegalArgumentException expected) {
-    }
-    dc.close();
-  }
-
-  public void test_joinSourceSpecific_nonUnicastSourceAddress_IPv4() throws Exception {
-    DatagramChannel dc = createReceiverChannel();
-    try {
-      dc.join(GOOD_MULTICAST_IPv4, ipv4networkInterface, BAD_MULTICAST_IPv4);
-      fail();
-    } catch (IllegalArgumentException expected) {
-    }
-    dc.close();
-  }
-
-  public void test_joinSourceSpecific_nonUnicastSourceAddress_IPv6() throws Exception {
-    DatagramChannel dc = createReceiverChannel();
-    try {
-      dc.join(GOOD_MULTICAST_IPv6, ipv6networkInterface, BAD_MULTICAST_IPv6);
-      fail();
-    } catch (IllegalArgumentException expected) {
-    }
-    dc.close();
-  }
-
-  public void test_joinSourceSpecific_multipleSourceAddressLimit() throws Exception {
-    DatagramChannel dc = createReceiverChannel();
-    for (byte i = 1; i <= 20; i++) {
-      InetAddress sourceAddress = Inet4Address.getByAddress(new byte[] { 10, 0, 0, i});
-      try {
-        dc.join(GOOD_MULTICAST_IPv4, ipv4networkInterface, sourceAddress);
-      } catch (SocketException e) {
-        // There is a limit, that's ok according to the RI docs. For this test a lower bound of 10
-        // is used, which appears to be the default linux limit. See /proc/sys/net/ipv4/igmp_max_msf
-        assertTrue(i > 10);
-        break;
-      }
-    }
-
-    dc.close();
-  }
-
-  /**
-   * Checks that a source-specific join() works when the receiver is bound to the multicast group
-   * address
-   */
-  public void test_joinSourceSpecific_groupBind_IPv4() throws Exception {
-    for (NetworkInterface networkInterface : ipv4networkInterfaces) {
-      InetAddress ipv4LocalAddress = getLocalIpv4Address(networkInterface);
-      test_joinSourceSpecific(
-          networkInterface,
-          ipv4LocalAddress /* senderBindAddress */,
-          GOOD_MULTICAST_IPv4 /* receiverBindAddress */,
-          GOOD_MULTICAST_IPv4 /* groupAddress */,
-          UNICAST_IPv4_1 /* badSenderAddress */);
-    }
-  }
-
-  /**
-   * Checks that a source-specific join() works when the receiver is bound to the multicast group
-   * address
-   */
-  public void test_joinSourceSpecific_groupBind_IPv6() throws Exception {
-    for (NetworkInterface networkInterface : ipv6networkInterfaces) {
-      InetAddress ipv6LocalAddress = getLocalIpv6Address(networkInterface);
-      test_joinSourceSpecific(
-          networkInterface,
-          ipv6LocalAddress /* senderBindAddress */,
-          GOOD_MULTICAST_IPv6 /* receiverBindAddress */,
-          GOOD_MULTICAST_IPv6 /* groupAddress */,
-          UNICAST_IPv6_1 /* badSenderAddress */);
-    }
-  }
-
-  /** Checks that a source-specific join() works when the receiver is bound to the "any" address */
-  public void test_joinSourceSpecific_anyBind_IPv4() throws Exception {
-    for (NetworkInterface networkInterface : ipv4networkInterfaces) {
-      InetAddress ipv4LocalAddress = getLocalIpv4Address(networkInterface);
-      test_joinSourceSpecific(
-          networkInterface,
-          ipv4LocalAddress /* senderBindAddress */,
-          WILDCARD_IPv4 /* receiverBindAddress */,
-          GOOD_MULTICAST_IPv4 /* groupAddress */,
-          UNICAST_IPv4_1 /* badSenderAddress */);
-    }
-  }
-
-  /** Checks that a source-specific join() works when the receiver is bound to the "any" address */
-  public void test_joinSourceSpecific_anyBind_IPv6() throws Exception {
-    for (NetworkInterface networkInterface : ipv6networkInterfaces) {
-      InetAddress ipv6LocalAddress = getLocalIpv6Address(networkInterface);
-      test_joinSourceSpecific(
-          networkInterface,
-          ipv6LocalAddress /* senderBindAddress */,
-          WILDCARD_IPv6 /* receiverBindAddress */,
-          GOOD_MULTICAST_IPv6 /* groupAddress */,
-          UNICAST_IPv6_1 /* badSenderAddress */);
-    }
-  }
-
-  /**
-   * Checks that the source-specific membership is correctly source-filtered.
-   *
-   * @param networkInterface the network interface to use when joining
-   * @param senderBindAddress the address to bind the sender socket to
-   * @param receiverBindAddress the address to bind the receiver socket to
-   * @param groupAddress the group address to join
-   * @param badSenderAddress a unicast address to join to perform a negative test
-   */
-  private void test_joinSourceSpecific(
-      NetworkInterface networkInterface, InetAddress senderBindAddress,
-      InetAddress receiverBindAddress, InetAddress groupAddress, InetAddress badSenderAddress)
-      throws Exception {
-    DatagramChannel sendingChannel = DatagramChannel.open();
-    // In order to be source-specific the sender's address must be known. The sendingChannel is
-    // explicitly bound to a known, non-loopback address.
-    sendingChannel.bind(new InetSocketAddress(senderBindAddress, 0));
-    InetSocketAddress sendingAddress = (InetSocketAddress) sendingChannel.getLocalAddress();
-
-    DatagramChannel receivingChannel = DatagramChannel.open();
-    configureChannelForReceiving(receivingChannel);
-    receivingChannel.bind(
-        new InetSocketAddress(receiverBindAddress, 0) /* local port left to the OS to determine */);
-
-    InetSocketAddress localReceivingAddress =
-        (InetSocketAddress) receivingChannel.getLocalAddress();
-    InetSocketAddress groupSocketAddress =
-        new InetSocketAddress(groupAddress, localReceivingAddress.getPort());
-    MembershipKey membershipKey1 = receivingChannel
-        .join(groupSocketAddress.getAddress(), networkInterface, senderBindAddress);
-
-    ByteBuffer receiveBuffer = ByteBuffer.allocate(10);
-
-    // Send a message. It should be received.
-    String msg1 = "Hello1";
-    sendMessage(sendingChannel, msg1, groupSocketAddress);
-    InetSocketAddress sourceAddress1 = (InetSocketAddress) receivingChannel.receive(receiveBuffer);
-    assertEquals(sourceAddress1, sendingAddress);
-    assertEquals(msg1, new String(receiveBuffer.array(), 0, receiveBuffer.position()));
-
-    membershipKey1.drop();
-
-    receivingChannel.join(groupSocketAddress.getAddress(), networkInterface, badSenderAddress);
-
-    // Send a message. It should not be received.
-    String msg2 = "Hello2";
-    sendMessage(sendingChannel, msg2, groupSocketAddress);
-    InetSocketAddress sourceAddress2 = (InetSocketAddress) receivingChannel.receive(receiveBuffer);
-    assertNull(sourceAddress2);
-
-    receivingChannel.close();
-    sendingChannel.close();
-  }
-
-  public void test_dropSourceSpecific_twice_IPv4() throws Exception {
-    for (NetworkInterface networkInterface : ipv4networkInterfaces) {
-      test_dropSourceSpecific_twice(
-          networkInterface,
-          GOOD_MULTICAST_IPv4 /* groupAddress */,
-          UNICAST_IPv4_1 /* sourceAddress */);
-    }
-  }
-
-  public void test_dropSourceSpecific_twice_IPv6() throws Exception {
-    for (NetworkInterface networkInterface : ipv6networkInterfaces) {
-      test_dropSourceSpecific_twice(
-          networkInterface,
-          GOOD_MULTICAST_IPv6 /* groupAddress */,
-          UNICAST_IPv6_1 /* sourceAddress */);
-    }
-  }
-
-  private void test_dropSourceSpecific_twice(
-      NetworkInterface networkInterface, InetAddress groupAddress, InetAddress sourceAddress)
-      throws Exception {
-    DatagramChannel dc = createReceiverChannel();
-    MembershipKey membershipKey = dc.join(groupAddress, networkInterface, sourceAddress);
-
-    assertTrue(membershipKey.isValid());
-    membershipKey.drop();
-    assertFalse(membershipKey.isValid());
-
-    // Try to leave a group we are no longer a member of. It should do nothing.
-    membershipKey.drop();
-
-    dc.close();
-  }
-
-  public void test_dropSourceSpecific_sourceKeysAreIndependent_IPv4() throws Exception {
-    for (NetworkInterface networkInterface : ipv4networkInterfaces) {
-      test_dropSourceSpecific_sourceKeysAreIndependent(
-          networkInterface,
-          GOOD_MULTICAST_IPv4 /* groupAddress */,
-          UNICAST_IPv4_1 /* sourceAddress1 */,
-          UNICAST_IPv4_2 /* sourceAddress2 */);
-    }
-  }
-
-  public void test_dropSourceSpecific_sourceKeysAreIndependent_IPv6() throws Exception {
-    for (NetworkInterface networkInterface : ipv6networkInterfaces) {
-      test_dropSourceSpecific_sourceKeysAreIndependent(
-          networkInterface,
-          GOOD_MULTICAST_IPv6 /* groupAddress */,
-          UNICAST_IPv6_1 /* sourceAddress1 */,
-          UNICAST_IPv6_2 /* sourceAddress2 */);
-    }
-  }
-
-  private void test_dropSourceSpecific_sourceKeysAreIndependent(
-      NetworkInterface networkInterface, InetAddress groupAddress, InetAddress sourceAddress1,
-      InetAddress sourceAddress2)
-      throws Exception {
-    DatagramChannel dc = createReceiverChannel();
-    MembershipKey membershipKey1 = dc.join(groupAddress, networkInterface, sourceAddress1);
-    MembershipKey membershipKey2 = dc.join(groupAddress, networkInterface, sourceAddress2);
-    assertFalse(membershipKey1.equals(membershipKey2));
-    assertTrue(membershipKey1.isValid());
-    assertTrue(membershipKey2.isValid());
-
-    membershipKey1.drop();
-
-    assertFalse(membershipKey1.isValid());
-    assertTrue(membershipKey2.isValid());
-
-    dc.close();
-  }
-
-  public void test_drop_keyBehaviorAfterDrop() throws Exception {
-    DatagramChannel dc = createReceiverChannel();
-    MembershipKey membershipKey =
-        dc.join(GOOD_MULTICAST_IPv4, ipv4networkInterface, UNICAST_IPv4_1);
-    membershipKey.drop();
-    assertFalse(membershipKey.isValid());
-
-    try {
-      membershipKey.block(UNICAST_IPv4_1);
-    } catch (IllegalStateException expected) {
-    }
-
-    try {
-      membershipKey.unblock(UNICAST_IPv4_1);
-    } catch (IllegalStateException expected) {
-    }
-
-    assertSame(dc, membershipKey.channel());
-    assertSame(GOOD_MULTICAST_IPv4, membershipKey.group());
-    assertSame(UNICAST_IPv4_1, membershipKey.sourceAddress());
-    assertSame(ipv4networkInterface, membershipKey.networkInterface());
-  }
-
-  private static DatagramChannel createReceiverChannel() throws Exception {
-    DatagramChannel dc = DatagramChannel.open();
-    configureChannelForReceiving(dc);
-    dc.bind(null /* leave the OS to determine the port, and use the wildcard address */);
-    return dc;
-  }
-
-  private static void configureChannelForReceiving(DatagramChannel receivingChannel)
-      throws Exception {
-
-    // NOTE: At the time of writing setSoTimeout() has no effect in the RI, making these tests hang
-    // if the channel is in blocking mode.
-    receivingChannel.socket().setSoTimeout(200);
-    receivingChannel.configureBlocking(true);
-    // configureBlocking(false) can be used instead in the RI and we rely on the network to the
-    // local host being instantaneous.
-    // receivingChannel.configureBlocking(false);
-  }
-
-  private static boolean willWorkForMulticast(NetworkInterface iface) throws IOException {
-    return iface.isUp()
-        // Typically loopback interfaces do not support multicast, but they are ruled out
-        // explicitly here anyway.
-        && !iface.isLoopback() && iface.supportsMulticast()
-        && iface.getInetAddresses().hasMoreElements();
-  }
-
-  private static void sendMessage(
-      InetAddress targetGroup, int targetPort, String msg, NetworkInterface sendingInterface)
-      throws IOException {
-    // Any datagram socket can send to a group. It does not need to have joined the group.
-    DatagramChannel dc = DatagramChannel.open();
-    dc.setOption(StandardSocketOptions.IP_MULTICAST_IF, sendingInterface);
-    sendMessage(dc, msg, new InetSocketAddress(targetGroup, targetPort));
-    dc.close();
-  }
-
-  private static void sendMessage(
-      DatagramChannel sendingChannel, String msg, InetSocketAddress targetAddress)
-      throws IOException {
-
-    ByteBuffer sendBuffer = ByteBuffer.wrap(msg.getBytes());
-    sendingChannel.send(sendBuffer, targetAddress);
-  }
-
-  private static InetAddress getLocalIpv4Address(NetworkInterface networkInterface) {
-    for (InterfaceAddress interfaceAddress : networkInterface.getInterfaceAddresses()) {
-      if (interfaceAddress.getAddress() instanceof Inet4Address) {
-        return interfaceAddress.getAddress();
-      }
-    }
-    throw new AssertionFailedError("Unable to find local IPv4 address for " + networkInterface);
-  }
-
-  private static InetAddress getLocalIpv6Address(NetworkInterface networkInterface) {
-    for (InterfaceAddress interfaceAddress : networkInterface.getInterfaceAddresses()) {
-      if (interfaceAddress.getAddress() instanceof Inet6Address) {
-        return interfaceAddress.getAddress();
-      }
-    }
-    throw new AssertionFailedError("Unable to find local IPv6 address for " + networkInterface);
-  }
-
-}
diff --git a/luni/src/test/java/libcore/java/nio/channels/DatagramChannelTest.java b/luni/src/test/java/libcore/java/nio/channels/DatagramChannelTest.java
index cd4bb22..efcfece 100644
--- a/luni/src/test/java/libcore/java/nio/channels/DatagramChannelTest.java
+++ b/luni/src/test/java/libcore/java/nio/channels/DatagramChannelTest.java
@@ -23,9 +23,6 @@
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
 import java.net.NetworkInterface;
-import java.net.SocketException;
-import java.net.SocketOption;
-import java.net.StandardSocketOptions;
 import java.nio.ByteBuffer;
 import java.nio.channels.ClosedChannelException;
 import java.nio.channels.DatagramChannel;
@@ -61,7 +58,7 @@
         DatagramChannel dc = DatagramChannel.open();
         try {
             dc.configureBlocking(false);
-            dc.bind(null);
+            dc.socket().bind(null);
             // Should return immediately, since we're non-blocking.
             assertNull(dc.receive(ByteBuffer.allocate(2048)));
         } finally {
@@ -72,8 +69,6 @@
     public void testInitialState() throws Exception {
         DatagramChannel dc = DatagramChannel.open();
         try {
-            assertNull(dc.getLocalAddress());
-
             DatagramSocket socket = dc.socket();
             assertFalse(socket.isBound());
             assertFalse(socket.getBroadcast());
@@ -93,408 +88,20 @@
         }
     }
 
-    public void test_supportedOptions() throws Exception {
-        DatagramChannel dc = DatagramChannel.open();
-        Set<SocketOption<?>> options = dc.supportedOptions();
-
-        // Probe some values. This is not intended to be complete.
-        assertTrue(options.contains(StandardSocketOptions.SO_REUSEADDR));
-        assertFalse(options.contains(StandardSocketOptions.TCP_NODELAY));
-    }
-
-    public void test_getOption_unsupportedOption() throws Exception {
-        DatagramChannel dc = DatagramChannel.open();
-        try {
-            dc.getOption(StandardSocketOptions.TCP_NODELAY);
-            fail();
-        } catch (UnsupportedOperationException expected) {}
-
-        dc.close();
-    }
-
-    public void test_getOption_afterClose() throws Exception {
-        DatagramChannel dc = DatagramChannel.open();
-        dc.close();
-
-        try {
-            dc.getOption(StandardSocketOptions.SO_RCVBUF);
-            fail();
-        } catch (ClosedChannelException expected) {}
-    }
-
-    public void test_setOption_afterClose() throws Exception {
-        DatagramChannel dc = DatagramChannel.open();
-        dc.close();
-
-        try {
-            dc.setOption(StandardSocketOptions.SO_RCVBUF, 1234);
-            fail();
-        } catch (ClosedChannelException expected) {}
-    }
-
-    public void test_getOption_SO_RCVBUF_defaults() throws Exception {
-        DatagramChannel dc = DatagramChannel.open();
-
-        int value = dc.getOption(StandardSocketOptions.SO_RCVBUF);
-        assertTrue(value > 0);
-        assertEquals(value, dc.socket().getReceiveBufferSize());
-
-        dc.close();
-    }
-
-    public void test_setOption_SO_RCVBUF_afterOpen() throws Exception {
-        DatagramChannel dc = DatagramChannel.open();
-
-        trySetReceiveBufferSizeOption(dc);
-
-        dc.close();
-    }
-
-    private static void trySetReceiveBufferSizeOption(DatagramChannel dc) throws IOException {
-        int initialValue = dc.getOption(StandardSocketOptions.SO_RCVBUF);
-        try {
-            dc.setOption(StandardSocketOptions.SO_RCVBUF, -1);
-            fail();
-        } catch (IllegalArgumentException expected) {}
-        int actualValue = dc.getOption(StandardSocketOptions.SO_RCVBUF);
-        assertEquals(initialValue, actualValue);
-        assertEquals(initialValue, dc.socket().getReceiveBufferSize());
-
-        int newBufferSize = initialValue - 1;
-        dc.setOption(StandardSocketOptions.SO_RCVBUF, newBufferSize);
-        actualValue = dc.getOption(StandardSocketOptions.SO_RCVBUF);
-        // The Linux Kernel actually doubles the value it is given and may choose to ignore it.
-        // This assertion may be brittle.
-        assertTrue(actualValue != initialValue);
-        assertEquals(actualValue, dc.socket().getReceiveBufferSize());
-    }
-
-    public void test_getOption_SO_SNDBUF_defaults() throws Exception {
-        DatagramChannel dc = DatagramChannel.open();
-
-        int value = dc.getOption(StandardSocketOptions.SO_SNDBUF);
-        assertTrue(value > 0);
-        assertEquals(value, dc.socket().getSendBufferSize());
-
-        dc.close();
-    }
-
-    public void test_setOption_SO_SNDBUF_afterOpen() throws Exception {
-        DatagramChannel dc = DatagramChannel.open();
-
-        trySetSendBufferSizeOption(dc);
-
-        dc.close();
-    }
-
-    private static void trySetSendBufferSizeOption(DatagramChannel dc) throws IOException {
-        int initialValue = dc.getOption(StandardSocketOptions.SO_SNDBUF);
-        try {
-            dc.setOption(StandardSocketOptions.SO_SNDBUF, -1);
-            fail();
-        } catch (IllegalArgumentException expected) {}
-        int actualValue = dc.getOption(StandardSocketOptions.SO_SNDBUF);
-        assertEquals(initialValue, actualValue);
-        assertEquals(initialValue, dc.socket().getSendBufferSize());
-
-        int newBufferSize = initialValue - 1;
-        dc.setOption(StandardSocketOptions.SO_SNDBUF, newBufferSize);
-        actualValue = dc.getOption(StandardSocketOptions.SO_SNDBUF);
-        // The Linux Kernel actually doubles the value it is given and may choose to ignore it.
-        // This assertion may be brittle.
-        assertTrue(actualValue != initialValue);
-        assertEquals(actualValue, dc.socket().getSendBufferSize());
-    }
-
-    public void test_getOption_IP_MULTICAST_IF_defaults() throws Exception {
-        DatagramChannel dc = DatagramChannel.open();
-
-        NetworkInterface networkInterface = dc.getOption(StandardSocketOptions.IP_MULTICAST_IF);
-        assertNull(networkInterface);
-
-        dc.close();
-    }
-
-    public void test_getOption_IP_MULTICAST_IF_nullCheck() throws Exception {
-        DatagramChannel dc = DatagramChannel.open();
-        try {
-            dc.setOption(StandardSocketOptions.IP_MULTICAST_IF, null);
-            fail();
-        } catch (IllegalArgumentException expected) {}
-
-        dc.close();
-    }
-
-    public void test_setOption_IP_MULTICAST_IF_afterOpen() throws Exception {
-        DatagramChannel dc = DatagramChannel.open();
-
-        Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
-        assertTrue(networkInterfaces.hasMoreElements());
-        while (networkInterfaces.hasMoreElements()) {
-            trySetNetworkInterfaceOption(dc, networkInterfaces.nextElement());
-        }
-
-        dc.close();
-    }
-
-    public void test_setOption_IP_MULTICAST_IF_afterBind() throws Exception {
-        DatagramChannel dc = DatagramChannel.open();
-        dc.bind(new InetSocketAddress(Inet4Address.getLoopbackAddress(), 0));
-
-        Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
-        assertTrue(networkInterfaces.hasMoreElements());
-        while (networkInterfaces.hasMoreElements()) {
-            trySetNetworkInterfaceOption(dc, networkInterfaces.nextElement());
-        }
-
-        dc.close();
-    }
-
-    private static void trySetNetworkInterfaceOption(
-            DatagramChannel dc, NetworkInterface networkInterface) throws IOException {
-
-        NetworkInterface initialValue = dc.getOption(StandardSocketOptions.IP_MULTICAST_IF);
-        try {
-            dc.setOption(StandardSocketOptions.IP_MULTICAST_IF, null);
-            fail();
-        } catch (IllegalArgumentException expected) {}
-        assertEquals(initialValue, dc.getOption(StandardSocketOptions.IP_MULTICAST_IF));
-
-        dc.setOption(StandardSocketOptions.IP_MULTICAST_IF, networkInterface);
-        NetworkInterface actualValue =
-                dc.getOption(StandardSocketOptions.IP_MULTICAST_IF);
-        assertEquals(networkInterface, actualValue);
-    }
-
-    public void test_getOption_IP_MULTICAST_LOOP_defaults() throws Exception {
-        DatagramChannel dc = DatagramChannel.open();
-
-        assertTrue(dc.getOption(StandardSocketOptions.IP_MULTICAST_LOOP));
-
-        dc.close();
-    }
-
-    public void test_getOption_IP_MULTICAST_LOOP_nullCheck() throws Exception {
-        DatagramChannel dc = DatagramChannel.open();
-        try {
-            dc.setOption(StandardSocketOptions.IP_MULTICAST_LOOP, null);
-            fail();
-        } catch (IllegalArgumentException expected) {}
-
-        dc.close();
-    }
-
-    public void test_setOption_IP_MULTICAST_LOOP_afterOpen() throws Exception {
-        DatagramChannel dc = DatagramChannel.open();
-        assertTrue(dc.getOption(StandardSocketOptions.IP_MULTICAST_LOOP));
-
-        dc.setOption(StandardSocketOptions.IP_MULTICAST_LOOP, false);
-        assertFalse(dc.getOption(StandardSocketOptions.IP_MULTICAST_LOOP));
-
-        dc.close();
-    }
-
-    public void test_setOption_IP_MULTICAST_LOOP_afterBind() throws Exception {
-        DatagramChannel dc = DatagramChannel.open();
-        dc.bind(new InetSocketAddress(Inet4Address.getLoopbackAddress(), 0));
-
-        assertTrue(dc.getOption(StandardSocketOptions.IP_MULTICAST_LOOP));
-
-        dc.setOption(StandardSocketOptions.IP_MULTICAST_LOOP, false);
-        assertFalse(dc.getOption(StandardSocketOptions.IP_MULTICAST_LOOP));
-
-        dc.close();
-    }
-
-    public void test_getOption_IP_MULTICAST_TTL_defaults() throws Exception {
-        DatagramChannel dc = DatagramChannel.open();
-
-        int value = dc.getOption(StandardSocketOptions.IP_MULTICAST_TTL);
-        assertEquals(1, value);
-
-        dc.close();
-    }
-
-    public void test_setOption_IP_MULTICAST_TTL_afterOpen() throws Exception {
-        DatagramChannel dc = DatagramChannel.open();
-
-        trySetMulticastTtlOption(dc);
-
-        dc.close();
-    }
-
-    private static void trySetMulticastTtlOption(DatagramChannel dc) throws IOException {
-        int initialValue = dc.getOption(StandardSocketOptions.IP_MULTICAST_TTL);
-        try {
-            dc.setOption(StandardSocketOptions.IP_MULTICAST_TTL, -1);
-            fail();
-        } catch (IllegalArgumentException expected) {}
-        int actualValue = dc.getOption(StandardSocketOptions.IP_MULTICAST_TTL);
-        assertEquals(initialValue, actualValue);
-
-        int newTtl = initialValue + 1;
-        dc.setOption(StandardSocketOptions.IP_MULTICAST_TTL, newTtl);
-        actualValue = dc.getOption(StandardSocketOptions.IP_MULTICAST_TTL);
-        assertEquals(newTtl, actualValue);
-    }
-
-    public void test_setOption_IP_MULTICAST_TTL_afterBind() throws Exception {
-        DatagramChannel dc = DatagramChannel.open();
-        dc.bind(null);
-
-        trySetMulticastTtlOption(dc);
-
-        dc.close();
-    }
-
-    public void test_getOption_SO_BROADCAST_defaults() throws Exception {
-        DatagramChannel dc = DatagramChannel.open();
-
-        assertFalse(dc.getOption(StandardSocketOptions.SO_BROADCAST));
-
-        dc.close();
-    }
-
-    public void test_setOption_SO_BROADCAST_afterOpen() throws Exception {
-        DatagramChannel dc = DatagramChannel.open();
-
-        trySetSoBroadcastOption(dc);
-
-        dc.close();
-    }
-
-    private static void trySetSoBroadcastOption(DatagramChannel dc) throws IOException {
-        boolean initialValue = dc.getOption(StandardSocketOptions.SO_BROADCAST);
-
-        dc.setOption(StandardSocketOptions.SO_BROADCAST, !initialValue);
-        boolean actualValue = dc.getOption(StandardSocketOptions.SO_BROADCAST);
-        assertEquals(!initialValue, actualValue);
-    }
-
-    public void test_setOption_SO_BROADCAST_afterBind() throws Exception {
-        DatagramChannel dc = DatagramChannel.open();
-        dc.bind(null);
-
-        trySetSoBroadcastOption(dc);
-
-        dc.close();
-    }
-
-    public void test_getOption_IP_TOS_defaults() throws Exception {
-        DatagramChannel dc = DatagramChannel.open();
-
-        int value = dc.getOption(StandardSocketOptions.IP_TOS);
-        assertEquals(0, value);
-        assertEquals(value, dc.socket().getTrafficClass());
-
-        dc.close();
-    }
-
-    public void test_setOption_IP_TOS_afterOpen() throws Exception {
-        DatagramChannel dc = DatagramChannel.open();
-
-        trySetTosOption(dc);
-
-        dc.close();
-    }
-
-    private static void trySetTosOption(DatagramChannel dc) throws IOException {
-        int initialValue = dc.getOption(StandardSocketOptions.IP_TOS);
-        try {
-            dc.setOption(StandardSocketOptions.IP_TOS, -1);
-            fail();
-        } catch (IllegalArgumentException expected) {}
-        assertEquals(initialValue, (int) dc.getOption(StandardSocketOptions.IP_TOS));
-        assertEquals(initialValue, dc.socket().getTrafficClass());
-
-        try {
-            dc.setOption(StandardSocketOptions.IP_TOS, 256);
-            fail();
-        } catch (IllegalArgumentException expected) {}
-        assertEquals(initialValue, (int) dc.getOption(StandardSocketOptions.IP_TOS));
-        assertEquals(initialValue, dc.socket().getTrafficClass());
-
-        int newValue = (initialValue + 1) % 255;
-        dc.setOption(StandardSocketOptions.IP_TOS, newValue);
-        assertEquals(newValue, (int) dc.getOption(StandardSocketOptions.IP_TOS));
-        assertEquals(newValue, dc.socket().getTrafficClass());
-    }
-
-    public void test_setOption_IP_TOS_afterBind() throws Exception {
-        DatagramChannel dc = DatagramChannel.open();
-        dc.bind(null);
-
-        trySetTosOption(dc);
-
-        dc.close();
-    }
-
-    public void test_getOption_SO_REUSEADDR_defaults() throws Exception {
-        DatagramChannel dc = DatagramChannel.open();
-
-        boolean value = dc.getOption(StandardSocketOptions.SO_REUSEADDR);
-        assertFalse(value);
-        assertFalse(dc.socket().getReuseAddress());
-
-        dc.close();
-    }
-
-    public void test_setOption_SO_REUSEADDR_afterOpen() throws Exception {
-        DatagramChannel dc = DatagramChannel.open();
-
-        boolean initialValue = dc.getOption(StandardSocketOptions.SO_REUSEADDR);
-        dc.setOption(StandardSocketOptions.SO_REUSEADDR, !initialValue);
-        assertEquals(!initialValue, (boolean) dc.getOption(StandardSocketOptions.SO_REUSEADDR));
-        assertEquals(!initialValue, dc.socket().getReuseAddress());
-
-        dc.close();
-    }
-
     public void test_bind_unresolvedAddress() throws IOException {
         DatagramChannel dc = DatagramChannel.open();
         try {
-            dc.bind(new InetSocketAddress("unresolvedname", 31415));
+            dc.socket().bind(new InetSocketAddress("unresolvedname", 31415));
             fail();
-        } catch (UnresolvedAddressException expected) {
+        } catch (IOException expected) {
         }
 
-        assertNull(dc.getLocalAddress());
         assertTrue(dc.isOpen());
         assertFalse(dc.isConnected());
 
         dc.close();
     }
 
-    public void test_bind_noReuseAddress() throws Exception {
-        DatagramChannel dc1 = DatagramChannel.open();
-        dc1.setOption(StandardSocketOptions.SO_REUSEADDR, false);
-        DatagramChannel dc2 = DatagramChannel.open();
-        dc1.setOption(StandardSocketOptions.SO_REUSEADDR, false);
-
-        dc1.bind(null);
-
-        try {
-            dc2.bind(dc1.getLocalAddress());
-            fail();
-        } catch (IOException expected) {}
-
-        dc1.close();
-        dc2.close();
-    }
-
-    public void test_bind_withReuseAddress() throws Exception {
-        DatagramChannel dc1 = DatagramChannel.open();
-        dc1.setOption(StandardSocketOptions.SO_REUSEADDR, true);
-        DatagramChannel dc2 = DatagramChannel.open();
-        dc2.setOption(StandardSocketOptions.SO_REUSEADDR, true);
-
-        dc1.bind(null);
-        dc2.bind(dc1.getLocalAddress());
-
-        dc1.close();
-        dc2.close();
-    }
-
     public void test_bind_any_IPv4() throws Exception {
         test_bind_any(InetAddress.getByName("0.0.0.0"));
     }
@@ -505,12 +112,12 @@
 
     private void test_bind_any(InetAddress bindAddress) throws Exception {
         DatagramChannel dc = DatagramChannel.open();
-        dc.bind(new InetSocketAddress(bindAddress, 0));
+        dc.socket().bind(new InetSocketAddress(bindAddress, 0));
 
         assertTrue(dc.isOpen());
         assertFalse(dc.isConnected());
 
-        InetSocketAddress actualAddress = (InetSocketAddress) dc.getLocalAddress();
+        InetSocketAddress actualAddress = (InetSocketAddress) dc.socket().getLocalSocketAddress();
         assertTrue(actualAddress.getAddress().isAnyLocalAddress());
         assertTrue(actualAddress.getPort() > 0);
 
@@ -537,18 +144,16 @@
 
     private void test_bind(InetAddress bindAddress) throws IOException {
         DatagramChannel dc = DatagramChannel.open();
-        dc.bind(new InetSocketAddress(bindAddress, 0));
+        dc.socket().bind(new InetSocketAddress(bindAddress, 0));
 
-        InetSocketAddress actualAddress = (InetSocketAddress) dc.getLocalAddress();
+        InetSocketAddress actualAddress = (InetSocketAddress) dc.socket().getLocalSocketAddress();
         assertEquals(bindAddress, actualAddress.getAddress());
         assertTrue(actualAddress.getPort() > 0);
 
         dc.close();
     }
 
-    private static InetAddress getNonLoopbackNetworkInterfaceAddress(boolean ipv4)
-            throws SocketException {
-
+    private static InetAddress getNonLoopbackNetworkInterfaceAddress(boolean ipv4) throws IOException {
         Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
         while (networkInterfaces.hasMoreElements()) {
             NetworkInterface networkInterface = networkInterfaces.nextElement();
diff --git a/luni/src/test/java/libcore/java/nio/channels/ServerSocketChannelTest.java b/luni/src/test/java/libcore/java/nio/channels/ServerSocketChannelTest.java
index e819d82..1178b70 100644
--- a/luni/src/test/java/libcore/java/nio/channels/ServerSocketChannelTest.java
+++ b/luni/src/test/java/libcore/java/nio/channels/ServerSocketChannelTest.java
@@ -21,8 +21,7 @@
 import java.net.InetSocketAddress;
 import java.net.NetworkInterface;
 import java.net.ServerSocket;
-import java.net.SocketOption;
-import java.net.StandardSocketOptions;
+import java.net.SocketException;
 import java.nio.channels.ClosedChannelException;
 import java.nio.channels.ServerSocketChannel;
 import java.nio.channels.SocketChannel;
@@ -36,7 +35,7 @@
         ServerSocketChannel ssc = ServerSocketChannel.open();
         try {
             ssc.configureBlocking(false);
-            ssc.bind(null);
+            ssc.socket().bind(null);
             // Should return immediately, since we're non-blocking.
             assertNull(ssc.accept());
         } finally {
@@ -48,7 +47,7 @@
     public void test_open_initialState() throws Exception {
         ServerSocketChannel ssc = ServerSocketChannel.open();
         try {
-            assertNull(ssc.getLocalAddress());
+            assertNull(ssc.socket().getLocalSocketAddress());
 
             ServerSocket socket = ssc.socket();
             assertFalse(socket.isBound());
@@ -67,12 +66,12 @@
     public void test_bind_unresolvedAddress() throws IOException {
         ServerSocketChannel ssc = ServerSocketChannel.open();
         try {
-            ssc.bind(new InetSocketAddress("unresolvedname", 31415));
+            ssc.socket().bind(new InetSocketAddress("unresolvedname", 31415));
             fail();
-        } catch (UnresolvedAddressException expected) {
+        } catch (SocketException expected) {
         }
 
-        assertNull(ssc.getLocalAddress());
+        assertNull(ssc.socket().getLocalSocketAddress());
         assertTrue(ssc.isOpen());
 
         ssc.close();
@@ -80,8 +79,8 @@
 
     public void test_bind_nullBindsToAll() throws Exception {
         ServerSocketChannel ssc = ServerSocketChannel.open();
-        ssc.bind(null);
-        InetSocketAddress boundAddress = (InetSocketAddress) ssc.getLocalAddress();
+        ssc.socket().bind(null);
+        InetSocketAddress boundAddress = (InetSocketAddress) ssc.socket().getLocalSocketAddress();
         assertTrue(boundAddress.getAddress().isAnyLocalAddress());
         assertFalse(boundAddress.getAddress().isLinkLocalAddress());
         assertFalse(boundAddress.getAddress().isLoopbackAddress());
@@ -106,8 +105,8 @@
 
     public void test_bind_loopback() throws Exception {
         ServerSocketChannel ssc = ServerSocketChannel.open();
-        ssc.bind(new InetSocketAddress(InetAddress.getLoopbackAddress(), 0));
-        InetSocketAddress boundAddress = (InetSocketAddress) ssc.getLocalAddress();
+        ssc.socket().bind(new InetSocketAddress(InetAddress.getLoopbackAddress(), 0));
+        InetSocketAddress boundAddress = (InetSocketAddress) ssc.socket().getLocalSocketAddress();
         assertFalse(boundAddress.getAddress().isAnyLocalAddress());
         assertFalse(boundAddress.getAddress().isLinkLocalAddress());
         assertTrue(boundAddress.getAddress().isLoopbackAddress());
@@ -146,102 +145,4 @@
             return false;
         }
     }
-
-    public void test_supportedOptions() throws Exception {
-        ServerSocketChannel ssc = ServerSocketChannel.open();
-        Set<SocketOption<?>> options = ssc.supportedOptions();
-
-        // Probe some values. This is not intended to be complete.
-        assertTrue(options.contains(StandardSocketOptions.SO_REUSEADDR));
-        assertFalse(options.contains(StandardSocketOptions.IP_MULTICAST_TTL));
-    }
-
-    public void test_getOption_unsupportedOption() throws Exception {
-        ServerSocketChannel ssc = ServerSocketChannel.open();
-        try {
-            ssc.getOption(StandardSocketOptions.IP_MULTICAST_TTL);
-            fail();
-        } catch (UnsupportedOperationException expected) {}
-
-        ssc.close();
-    }
-
-    public void test_getOption_afterClose() throws Exception {
-        ServerSocketChannel ssc = ServerSocketChannel.open();
-        ssc.close();
-
-        try {
-            ssc.getOption(StandardSocketOptions.SO_RCVBUF);
-            fail();
-        } catch (ClosedChannelException expected) {}
-    }
-
-    public void test_setOption_afterClose() throws Exception {
-        ServerSocketChannel ssc = ServerSocketChannel.open();
-        ssc.close();
-
-        try {
-            ssc.setOption(StandardSocketOptions.SO_RCVBUF, 1234);
-            fail();
-        } catch (ClosedChannelException expected) {}
-    }
-
-    public void test_getOption_SO_RCVBUF_defaults() throws Exception {
-        ServerSocketChannel ssc = ServerSocketChannel.open();
-
-        int value = ssc.getOption(StandardSocketOptions.SO_RCVBUF);
-        assertTrue(value > 0);
-        assertEquals(value, ssc.socket().getReceiveBufferSize());
-
-        ssc.close();
-    }
-
-    public void test_setOption_SO_RCVBUF_afterOpen() throws Exception {
-        ServerSocketChannel ssc = ServerSocketChannel.open();
-
-        trySetReceiveBufferSizeOption(ssc);
-
-        ssc.close();
-    }
-
-    private static void trySetReceiveBufferSizeOption(ServerSocketChannel ssc) throws IOException {
-        int initialValue = ssc.getOption(StandardSocketOptions.SO_RCVBUF);
-        try {
-            ssc.setOption(StandardSocketOptions.SO_RCVBUF, -1);
-            fail();
-        } catch (IllegalArgumentException expected) {}
-        int actualValue = ssc.getOption(StandardSocketOptions.SO_RCVBUF);
-        assertEquals(initialValue, actualValue);
-        assertEquals(initialValue, ssc.socket().getReceiveBufferSize());
-
-        int newBufferSize = initialValue - 1;
-        ssc.setOption(StandardSocketOptions.SO_RCVBUF, newBufferSize);
-        actualValue = ssc.getOption(StandardSocketOptions.SO_RCVBUF);
-        // The Linux Kernel actually doubles the value it is given and may choose to ignore it.
-        // This assertion may be brittle.
-        assertTrue(actualValue != initialValue);
-        assertEquals(actualValue, ssc.socket().getReceiveBufferSize());
-    }
-
-    public void test_getOption_SO_REUSEADDR_defaults() throws Exception {
-        ServerSocketChannel ssc = ServerSocketChannel.open();
-
-        boolean value = ssc.getOption(StandardSocketOptions.SO_REUSEADDR);
-        assertTrue(value);
-        assertTrue(ssc.socket().getReuseAddress());
-
-        ssc.close();
-    }
-
-    public void test_setOption_SO_REUSEADDR_afterOpen() throws Exception {
-        ServerSocketChannel ssc = ServerSocketChannel.open();
-
-        boolean initialValue = ssc.getOption(StandardSocketOptions.SO_REUSEADDR);
-        ssc.setOption(StandardSocketOptions.SO_REUSEADDR, !initialValue);
-        assertEquals(!initialValue, (boolean) ssc.getOption(StandardSocketOptions.SO_REUSEADDR));
-        assertEquals(!initialValue, ssc.socket().getReuseAddress());
-
-        ssc.close();
-    }
-
 }
diff --git a/luni/src/test/java/libcore/java/nio/channels/SocketChannelTest.java b/luni/src/test/java/libcore/java/nio/channels/SocketChannelTest.java
index 6bba862..a54b30a 100644
--- a/luni/src/test/java/libcore/java/nio/channels/SocketChannelTest.java
+++ b/luni/src/test/java/libcore/java/nio/channels/SocketChannelTest.java
@@ -24,8 +24,6 @@
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
 import java.net.ServerSocket;
-import java.net.SocketOption;
-import java.net.StandardSocketOptions;
 import java.nio.ByteBuffer;
 import java.nio.channels.ClosedChannelException;
 import java.nio.channels.SocketChannel;
@@ -143,7 +141,7 @@
   public void test_open_initialState() throws Exception {
     SocketChannel sc = SocketChannel.open();
     try {
-      assertNull(sc.getLocalAddress());
+      assertNull(sc.socket().getLocalSocketAddress());
 
       Socket socket = sc.socket();
       assertFalse(socket.isBound());
@@ -166,12 +164,12 @@
   public void test_bind_unresolvedAddress() throws IOException {
     SocketChannel sc = SocketChannel.open();
     try {
-      sc.bind(new InetSocketAddress("unresolvedname", 31415));
+      sc.socket().bind(new InetSocketAddress("unresolvedname", 31415));
       fail();
-    } catch (UnresolvedAddressException expected) {
+    } catch (IOException expected) {
     }
 
-    assertNull(sc.getLocalAddress());
+    assertNull(sc.socket().getLocalSocketAddress());
     assertTrue(sc.isOpen());
     assertFalse(sc.isConnected());
 
@@ -181,16 +179,16 @@
   /** Checks that the SocketChannel and associated Socket agree on the socket state. */
   public void test_bind_socketStateSync() throws IOException {
     SocketChannel sc = SocketChannel.open();
-    assertNull(sc.getLocalAddress());
+    assertNull(sc.socket().getLocalSocketAddress());
 
     Socket socket = sc.socket();
     assertNull(socket.getLocalSocketAddress());
     assertFalse(socket.isBound());
 
     InetSocketAddress bindAddr = new InetSocketAddress("localhost", 0);
-    sc.bind(bindAddr);
+    sc.socket().bind(bindAddr);
 
-    InetSocketAddress actualAddr = (InetSocketAddress) sc.getLocalAddress();
+    InetSocketAddress actualAddr = (InetSocketAddress) sc.socket().getLocalSocketAddress();
     assertEquals(actualAddr, socket.getLocalSocketAddress());
     assertEquals(bindAddr.getHostName(), actualAddr.getHostName());
     assertTrue(socket.isBound());
@@ -209,14 +207,14 @@
    */
   public void test_bind_socketObjectCreationAfterBind() throws IOException {
     SocketChannel sc = SocketChannel.open();
-    assertNull(sc.getLocalAddress());
+    assertNull(sc.socket().getLocalSocketAddress());
 
     InetSocketAddress bindAddr = new InetSocketAddress("localhost", 0);
-    sc.bind(bindAddr);
+    sc.socket().bind(bindAddr);
 
     // Socket object creation after bind().
     Socket socket = sc.socket();
-    InetSocketAddress actualAddr = (InetSocketAddress) sc.getLocalAddress();
+    InetSocketAddress actualAddr = (InetSocketAddress) sc.socket().getLocalSocketAddress();
     assertEquals(actualAddr, socket.getLocalSocketAddress());
     assertEquals(bindAddr.getHostName(), actualAddr.getHostName());
     assertTrue(socket.isBound());
@@ -276,307 +274,4 @@
     ss.close();
     sc.close();
   }
-
-  public void test_supportedOptions() throws Exception {
-    SocketChannel sc = SocketChannel.open();
-    Set<SocketOption<?>> options = sc.supportedOptions();
-
-    // Probe some values. This is not intended to be complete.
-    assertTrue(options.contains(StandardSocketOptions.SO_REUSEADDR));
-    assertFalse(options.contains(StandardSocketOptions.IP_MULTICAST_TTL));
-  }
-
-  public void test_getOption_unsupportedOption() throws Exception {
-    SocketChannel sc = SocketChannel.open();
-    try {
-      sc.getOption(StandardSocketOptions.IP_MULTICAST_TTL);
-      fail();
-    } catch (UnsupportedOperationException expected) {
-    }
-
-    sc.close();
-  }
-
-  public void test_getOption_afterClose() throws Exception {
-    SocketChannel sc = SocketChannel.open();
-    sc.close();
-
-    try {
-      sc.getOption(StandardSocketOptions.SO_RCVBUF);
-      fail();
-    } catch (ClosedChannelException expected) {
-    }
-  }
-
-  public void test_setOption_afterClose() throws Exception {
-    SocketChannel sc = SocketChannel.open();
-    sc.close();
-
-    try {
-      sc.setOption(StandardSocketOptions.SO_RCVBUF, 1234);
-      fail();
-    } catch (ClosedChannelException expected) {
-    }
-  }
-
-  public void test_getOption_SO_RCVBUF_defaults() throws Exception {
-    SocketChannel sc = SocketChannel.open();
-
-    int value = sc.getOption(StandardSocketOptions.SO_RCVBUF);
-    assertTrue(value > 0);
-    assertEquals(value, sc.socket().getReceiveBufferSize());
-
-    sc.close();
-  }
-
-  public void test_setOption_SO_RCVBUF_afterOpen() throws Exception {
-    SocketChannel sc = SocketChannel.open();
-
-    trySetReceiveBufferSizeOption(sc);
-
-    sc.close();
-  }
-
-  private static void trySetReceiveBufferSizeOption(SocketChannel sc) throws IOException {
-    int initialValue = sc.getOption(StandardSocketOptions.SO_RCVBUF);
-    try {
-      sc.setOption(StandardSocketOptions.SO_RCVBUF, -1);
-      fail();
-    } catch (IllegalArgumentException expected) {
-    }
-    int actualValue = sc.getOption(StandardSocketOptions.SO_RCVBUF);
-    assertEquals(initialValue, actualValue);
-    assertEquals(initialValue, sc.socket().getReceiveBufferSize());
-
-    int newBufferSize = initialValue - 1;
-    sc.setOption(StandardSocketOptions.SO_RCVBUF, newBufferSize);
-    actualValue = sc.getOption(StandardSocketOptions.SO_RCVBUF);
-    // The Linux Kernel actually doubles the value it is given and may choose to ignore it.
-    // This assertion may be brittle.
-    assertTrue(actualValue != initialValue);
-    assertEquals(actualValue, sc.socket().getReceiveBufferSize());
-  }
-
-  public void test_getOption_SO_SNDBUF_defaults() throws Exception {
-    SocketChannel sc = SocketChannel.open();
-
-    int bufferSize = sc.getOption(StandardSocketOptions.SO_SNDBUF);
-    assertTrue(bufferSize > 0);
-    assertEquals(bufferSize, sc.socket().getSendBufferSize());
-
-    sc.close();
-  }
-
-  public void test_setOption_SO_SNDBUF_afterOpen() throws Exception {
-    SocketChannel sc = SocketChannel.open();
-
-    trySetSendBufferSizeOption(sc);
-
-    sc.close();
-  }
-
-  private static void trySetSendBufferSizeOption(SocketChannel sc) throws IOException {
-    int initialValue = sc.getOption(StandardSocketOptions.SO_SNDBUF);
-    try {
-      sc.setOption(StandardSocketOptions.SO_SNDBUF, -1);
-      fail();
-    } catch (IllegalArgumentException expected) {
-    }
-    int actualValue = sc.getOption(StandardSocketOptions.SO_SNDBUF);
-    assertEquals(initialValue, actualValue);
-    assertEquals(initialValue, sc.socket().getSendBufferSize());
-
-    int newValue = initialValue - 1;
-    sc.setOption(StandardSocketOptions.SO_SNDBUF, newValue);
-    actualValue = sc.getOption(StandardSocketOptions.SO_SNDBUF);
-    // The Linux Kernel actually doubles the value it is given and may choose to ignore it.
-    // This assertion may be brittle.
-    assertTrue(actualValue != initialValue);
-    assertEquals(actualValue, sc.socket().getSendBufferSize());
-  }
-
-  public void test_getOption_SO_KEEPALIVE_defaults() throws Exception {
-    SocketChannel sc = SocketChannel.open();
-
-    assertFalse(sc.getOption(StandardSocketOptions.SO_KEEPALIVE));
-
-    sc.close();
-  }
-
-  public void test_setOption_SO_KEEPALIVE_afterOpen() throws Exception {
-    SocketChannel sc = SocketChannel.open();
-
-    trySetSoKeepaliveOption(sc);
-
-    sc.close();
-  }
-
-  private static void trySetSoKeepaliveOption(SocketChannel sc) throws IOException {
-    boolean initialValue = sc.getOption(StandardSocketOptions.SO_KEEPALIVE);
-
-    sc.setOption(StandardSocketOptions.SO_KEEPALIVE, !initialValue);
-    boolean actualValue = sc.getOption(StandardSocketOptions.SO_KEEPALIVE);
-    assertEquals(!initialValue, actualValue);
-  }
-
-  public void test_setOption_SO_KEEPALIVE_afterBind() throws Exception {
-    SocketChannel sc = SocketChannel.open();
-    sc.bind(null);
-
-    trySetSoKeepaliveOption(sc);
-
-    sc.close();
-  }
-
-  public void test_getOption_IP_TOS_defaults() throws Exception {
-    SocketChannel sc = SocketChannel.open();
-
-    int value = sc.getOption(StandardSocketOptions.IP_TOS);
-    assertEquals(0, value);
-    assertEquals(value, sc.socket().getTrafficClass());
-
-    sc.close();
-  }
-
-  public void test_setOption_IP_TOS_afterOpen() throws Exception {
-    SocketChannel sc = SocketChannel.open();
-
-    trySetTosOption(sc);
-
-    sc.close();
-  }
-
-  private static void trySetTosOption(SocketChannel sc) throws IOException {
-    int initialValue = sc.getOption(StandardSocketOptions.IP_TOS);
-    try {
-      sc.setOption(StandardSocketOptions.IP_TOS, -1);
-      fail();
-    } catch (IllegalArgumentException expected) {
-    }
-    assertEquals(initialValue, (int) sc.getOption(StandardSocketOptions.IP_TOS));
-    assertEquals(initialValue, sc.socket().getTrafficClass());
-
-    try {
-      sc.setOption(StandardSocketOptions.IP_TOS, 256);
-      fail();
-    } catch (IllegalArgumentException expected) {
-    }
-    assertEquals(initialValue, (int) sc.getOption(StandardSocketOptions.IP_TOS));
-    assertEquals(initialValue, sc.socket().getTrafficClass());
-
-    int newValue = (initialValue + 1) % 255;
-    sc.setOption(StandardSocketOptions.IP_TOS, newValue);
-    assertEquals(newValue, (int) sc.getOption(StandardSocketOptions.IP_TOS));
-    assertEquals(newValue, sc.socket().getTrafficClass());
-  }
-
-  public void test_setOption_IP_TOS_afterBind() throws Exception {
-    SocketChannel sc = SocketChannel.open();
-    sc.bind(null);
-
-    trySetTosOption(sc);
-
-    sc.close();
-  }
-
-  public void test_getOption_SO_LINGER_defaults() throws Exception {
-    SocketChannel sc = SocketChannel.open();
-
-    int value = sc.getOption(StandardSocketOptions.SO_LINGER);
-    assertTrue(value < 0);
-    assertEquals(value, sc.socket().getSoLinger());
-
-    sc.close();
-  }
-
-  public void test_setOption_SO_LINGER_afterOpen() throws Exception {
-    SocketChannel sc = SocketChannel.open();
-
-    trySetLingerOption(sc);
-
-    sc.close();
-  }
-
-  private static void trySetLingerOption(SocketChannel sc) throws IOException {
-    int initialValue = sc.getOption(StandardSocketOptions.SO_LINGER);
-    // Any negative value disables the setting, -1 is used to report SO_LINGER being disabled.
-    sc.setOption(StandardSocketOptions.SO_LINGER, -2);
-    int soLingerDisabled = -1;
-    assertEquals(soLingerDisabled, (int) sc.getOption(StandardSocketOptions.SO_LINGER));
-    assertEquals(soLingerDisabled, sc.socket().getSoLinger());
-
-    sc.setOption(StandardSocketOptions.SO_LINGER, 65536);
-    assertEquals(65535, (int) sc.getOption(StandardSocketOptions.SO_LINGER));
-    assertEquals(65535, sc.socket().getSoLinger());
-
-    int newValue = (initialValue + 1) % 65535;
-    sc.setOption(StandardSocketOptions.SO_LINGER, newValue);
-    assertEquals(newValue, (int) sc.getOption(StandardSocketOptions.SO_LINGER));
-    assertEquals(newValue, sc.socket().getSoLinger());
-  }
-
-  public void test_setOption_SO_LINGER_afterBind() throws Exception {
-    SocketChannel sc = SocketChannel.open();
-    sc.bind(null);
-
-    trySetLingerOption(sc);
-
-    sc.close();
-  }
-
-  public void test_getOption_SO_REUSEADDR_defaults() throws Exception {
-    SocketChannel sc = SocketChannel.open();
-
-    boolean value = sc.getOption(StandardSocketOptions.SO_REUSEADDR);
-    assertFalse(value);
-    assertFalse(sc.socket().getReuseAddress());
-
-    sc.close();
-  }
-
-  public void test_setOption_SO_REUSEADDR_afterOpen() throws Exception {
-    SocketChannel sc = SocketChannel.open();
-
-    boolean initialValue = sc.getOption(StandardSocketOptions.SO_REUSEADDR);
-    sc.setOption(StandardSocketOptions.SO_REUSEADDR, !initialValue);
-    assertEquals(!initialValue, (boolean) sc.getOption(StandardSocketOptions.SO_REUSEADDR));
-    assertEquals(!initialValue, sc.socket().getReuseAddress());
-
-    sc.close();
-  }
-
-  public void test_getOption_TCP_NODELAY_defaults() throws Exception {
-    SocketChannel sc = SocketChannel.open();
-
-    boolean value = sc.getOption(StandardSocketOptions.TCP_NODELAY);
-    assertFalse(value);
-    assertFalse(sc.socket().getTcpNoDelay());
-
-    sc.close();
-  }
-
-  public void test_setOption_TCP_NODELAY_afterOpen() throws Exception {
-    SocketChannel sc = SocketChannel.open();
-
-    trySetNoDelay(sc);
-
-    sc.close();
-  }
-
-  private static void trySetNoDelay(SocketChannel sc) throws IOException {
-    boolean initialValue = sc.getOption(StandardSocketOptions.TCP_NODELAY);
-    sc.setOption(StandardSocketOptions.TCP_NODELAY, !initialValue);
-    assertEquals(!initialValue, (boolean) sc.getOption(StandardSocketOptions.TCP_NODELAY));
-    assertEquals(!initialValue, sc.socket().getTcpNoDelay());
-  }
-
-  public void test_setOption_TCP_NODELAY_afterBind() throws Exception {
-    SocketChannel sc = SocketChannel.open();
-    sc.bind(null);
-
-    trySetNoDelay(sc);
-
-    sc.close();
-  }
-
 }
diff --git a/luni/src/test/java/libcore/java/util/CurrencyTest.java b/luni/src/test/java/libcore/java/util/CurrencyTest.java
index fb7fbf6..61a22fd 100644
--- a/luni/src/test/java/libcore/java/util/CurrencyTest.java
+++ b/luni/src/test/java/libcore/java/util/CurrencyTest.java
@@ -67,13 +67,6 @@
         assertEquals(-1, Currency.getInstance("XXX").getDefaultFractionDigits());
     }
 
-    public void test_getNumericCode() throws Exception {
-        assertEquals(840, Currency.getInstance("USD").getNumericCode());
-        assertEquals(826, Currency.getInstance("GBP").getNumericCode());
-        assertEquals(999, Currency.getInstance("XXX").getNumericCode());
-        assertEquals(0, Currency.getInstance("XFU").getNumericCode());
-    }
-
     // http://code.google.com/p/android/issues/detail?id=38622
     public void test_getSymbol_38622() throws Exception {
         // The CLDR data had the Portuguese symbol for "EUR" in pt, not in pt_PT.
diff --git a/luni/src/test/java/libcore/java/util/zip/ZipFileTest.java b/luni/src/test/java/libcore/java/util/zip/ZipFileTest.java
index 81ff673..a9ff56f 100644
--- a/luni/src/test/java/libcore/java/util/zip/ZipFileTest.java
+++ b/luni/src/test/java/libcore/java/util/zip/ZipFileTest.java
@@ -217,96 +217,6 @@
         }
     }
 
-    public void testNullCharset() throws IOException {
-        try {
-            new ZipFile(createTemporaryZipFile(), null);
-            fail();
-        } catch (NullPointerException expected) {
-        }
-    }
-
-    // Tests that non-UTF8 encoded zip files can be interpreted. Relies on ZipOutputStream.
-    public void testNonUtf8Encoding() throws IOException {
-        Charset charset = Charset.forName("Cp437");
-        String encodingDependentString = "\u00FB";
-        assertEncodingDiffers(encodingDependentString, charset, StandardCharsets.US_ASCII,
-                StandardCharsets.UTF_8);
-        String name = "name" + encodingDependentString;
-        String comment = "comment" + encodingDependentString;
-
-        File result = createTemporaryZipFile();
-        OutputStream os = new BufferedOutputStream(new FileOutputStream(result));
-        ZipOutputStream out = new ZipOutputStream(os, charset);
-        out.setComment(comment);
-        ZipEntry writeEntry = new ZipEntry(name);
-        writeEntry.setComment(comment);
-        out.putNextEntry(writeEntry);
-        out.write("FileContentsIrrelevant".getBytes());
-        out.closeEntry();
-        out.close();
-
-        ZipFile zipFile = new ZipFile(result, StandardCharsets.US_ASCII);
-        assertNull(zipFile.getEntry(name));
-        assertFalse(zipFile.getComment().equals(comment));
-        zipFile.close();
-
-        zipFile = new ZipFile(result, charset);
-        ZipEntry readEntry = zipFile.getEntry(name);
-        assertNotNull(readEntry);
-        assertEquals(name, readEntry.getName());
-        assertEquals(comment, readEntry.getComment());
-        assertEquals(comment, zipFile.getComment());
-        zipFile.close();
-    }
-
-    // Tests that UTF8 encoded zip files can be interpreted when the constructor is provided with a
-    // non-UTF-8 encoding. Relies on ZipOutputStream.
-    public void testUtf8EncodingOverridesConstructor() throws IOException {
-        Charset charset = Charset.forName("Cp437");
-        String encodingDependentString = "\u00FB";
-        assertEncodingDiffers(encodingDependentString, charset, StandardCharsets.UTF_8);
-        String name = "name" + encodingDependentString;
-        String comment = "comment" + encodingDependentString;
-
-        File result = createTemporaryZipFile();
-        OutputStream os = new BufferedOutputStream(new FileOutputStream(result));
-        ZipOutputStream out = new ZipOutputStream(os, StandardCharsets.UTF_8);
-        // The file comment does not get meta-data about the character encoding.
-        out.setComment(comment);
-        // The entry will be tagged as being UTF-8 encoded.
-        ZipEntry writeEntry = new ZipEntry(name);
-        writeEntry.setComment(comment);
-        out.putNextEntry(writeEntry);
-        out.write("FileContentsIrrelevant".getBytes());
-        out.closeEntry();
-        out.close();
-
-        ZipFile zipFile = new ZipFile(result, charset);
-        // The entry should be found, because it should be tagged as being UTF-8 encoded.
-        ZipEntry readEntry = zipFile.getEntry(name);
-        assertNotNull(readEntry);
-        assertEquals(name, readEntry.getName());
-        assertEquals(comment, readEntry.getComment());
-        // We expect the comment to be mangled because it is not tagged.
-        assertFalse(zipFile.getComment().equals(comment));
-        zipFile.close();
-    }
-
-    /**
-     * Asserts the byte encoding for the string is different for all the supplied character
-     * sets.
-     */
-    private void assertEncodingDiffers(String string, Charset... charsets) {
-        Set<List<Byte>> encodings = new HashSet<List<Byte>>();
-        for (int i = 0; i < charsets.length; i++) {
-            List<Byte> byteList = new ArrayList<Byte>();
-            for (byte b : string.getBytes(charsets[i])) {
-                byteList.add(b);
-            }
-            assertTrue("Encoding has been seen before", encodings.add(byteList));
-        }
-    }
-
     /**
      * Compresses the given number of files, each of the given size, into a .zip archive.
      */
diff --git a/luni/src/test/java/libcore/java/util/zip/ZipInputStreamTest.java b/luni/src/test/java/libcore/java/util/zip/ZipInputStreamTest.java
index 2daa127..49990a3 100644
--- a/luni/src/test/java/libcore/java/util/zip/ZipInputStreamTest.java
+++ b/luni/src/test/java/libcore/java/util/zip/ZipInputStreamTest.java
@@ -50,97 +50,6 @@
         assertTrue(Arrays.equals(data, unzip("r", ZipOutputStreamTest.zip("r", data))));
     }
 
-    public void testNullCharset() throws IOException {
-        try {
-            new ZipInputStream(new ByteArrayInputStream(new byte[1]), null);
-            fail();
-        } catch (NullPointerException expected) {
-        }
-    }
-
-    // Tests that non-UTF8 encoded zip file entries can be interpreted. Relies on ZipOutputStream.
-    public void testNonUtf8Encoding() throws IOException {
-        Charset charset = Charset.forName("Cp437");
-        String encodingDependentString = "\u00FB";
-        assertEncodingDiffers(encodingDependentString, charset, StandardCharsets.US_ASCII,
-                StandardCharsets.UTF_8);
-        String name = "name" + encodingDependentString;
-        String comment = "comment" + encodingDependentString;
-
-        ByteArrayOutputStream bytesOutputStream = new ByteArrayOutputStream();
-        ZipOutputStream out = new ZipOutputStream(bytesOutputStream, charset);
-        ZipEntry writeEntry = new ZipEntry(name);
-        writeEntry.setComment(comment);
-        out.putNextEntry(writeEntry);
-        out.write("FileContentsIrrelevant".getBytes());
-        out.closeEntry();
-        out.close();
-
-        ByteArrayInputStream bytesInputStream =
-                new ByteArrayInputStream(bytesOutputStream.toByteArray());
-        ZipInputStream in = new ZipInputStream(bytesInputStream, StandardCharsets.US_ASCII);
-        ZipEntry readEntry = in.getNextEntry();
-        // Due to the way ZipInputStream works it never returns entry comments.
-        assertNull("ZipInputStream must not retrieve comments", readEntry.getComment());
-        assertFalse(readEntry.getName().equals(name));
-        in.close();
-
-        bytesInputStream = new ByteArrayInputStream(bytesOutputStream.toByteArray());
-        in = new ZipInputStream(bytesInputStream, charset);
-        readEntry = in.getNextEntry();
-        // Because ZipInputStream never reads the central directory it never returns entry
-        // comments or the file comment.
-        assertNull("ZipInputStream must not retrieve comments", readEntry.getComment());
-        assertEquals(name, readEntry.getName());
-        in.close();
-    }
-
-    // Tests that UTF8 encoded zip file entries can be interpreted when the constructor is provided
-    // with a non-UTF-8 encoding. Relies on ZipOutputStream.
-    public void testUtf8EncodingOverridesConstructor() throws IOException {
-        Charset charset = Charset.forName("Cp437");
-        String encodingDependentString = "\u00FB";
-        assertEncodingDiffers(encodingDependentString, charset, StandardCharsets.UTF_8);
-        String name = "name" + encodingDependentString;
-        String comment = "comment" + encodingDependentString;
-
-        ByteArrayOutputStream bytesOutputStream = new ByteArrayOutputStream();
-        ZipOutputStream out = new ZipOutputStream(bytesOutputStream, StandardCharsets.UTF_8);
-        // The entry will be tagged as being UTF-8 encoded.
-        ZipEntry writeEntry = new ZipEntry(name);
-        writeEntry.setComment(comment);
-        out.putNextEntry(writeEntry);
-        out.write("FileContentsIrrelevant".getBytes());
-        out.closeEntry();
-        out.close();
-
-        ByteArrayInputStream bytesInputStream =
-                new ByteArrayInputStream(bytesOutputStream.toByteArray());
-        ZipInputStream in = new ZipInputStream(bytesInputStream, charset);
-        ZipEntry readEntry = in.getNextEntry();
-        // Because ZipInputStream never reads the central directory it never returns entry
-        // comments or the file comment.
-        assertNull("ZipInputStream must not retrieve comments", readEntry.getComment());
-        assertNotNull(readEntry);
-        assertEquals(name, readEntry.getName());
-        in.close();
-    }
-
-    /**
-     * Asserts the byte encoding for the string is different for all the supplied character
-     * sets.
-     */
-    private void assertEncodingDiffers(String string, Charset... charsets) {
-        Set<List<Byte>> encodings = new HashSet<List<Byte>>();
-        for (int i = 0; i < charsets.length; i++) {
-            List<Byte> byteList = new ArrayList<Byte>();
-            for (byte b : string.getBytes(charsets[i])) {
-                byteList.add(b);
-            }
-            assertTrue("Encoding has been seen before", encodings.add(byteList));
-        }
-    }
-
     public static byte[] unzip(String name, byte[] bytes) throws IOException {
         ZipInputStream in = new ZipInputStream(new ByteArrayInputStream(bytes));
         ByteArrayOutputStream out = new ByteArrayOutputStream();
diff --git a/luni/src/test/java/libcore/java/util/zip/ZipOutputStreamTest.java b/luni/src/test/java/libcore/java/util/zip/ZipOutputStreamTest.java
index 92afffa..e69f010 100644
--- a/luni/src/test/java/libcore/java/util/zip/ZipOutputStreamTest.java
+++ b/luni/src/test/java/libcore/java/util/zip/ZipOutputStreamTest.java
@@ -78,14 +78,6 @@
         }
     }
 
-    public void testNullCharset() throws IOException {
-        try {
-            new ZipOutputStream(new ByteArrayOutputStream(), null);
-            fail();
-        } catch (NullPointerException expected) {
-        }
-    }
-
     /** Regression test for null comment causing a NullPointerException during write. */
     public void testNullComment() throws IOException {
         ZipOutputStream out = new ZipOutputStream(new ByteArrayOutputStream());
@@ -95,54 +87,4 @@
         out.closeEntry();
         out.finish();
     }
-
-    /** Contrived test to force a longer name than can be stored. */
-    public void testLongName() throws IOException {
-        int maxNameBytes = 0xffff; // 2 bytes
-        String longName = createString(maxNameBytes);
-
-        ZipEntry entry = new ZipEntry(longName);
-
-        // Using UTF-16 will result in name bytes twice as large as is supported by Zip.
-        // UTF-16 is an unlikely character set to actually want to use with Zip but enables
-        // the edge-case behavior required without using direct field access.
-        ZipOutputStream out = new ZipOutputStream(
-                new ByteArrayOutputStream(), StandardCharsets.UTF_16);
-        try {
-            out.putNextEntry(entry);
-            fail();
-        } catch (IllegalArgumentException expected) {
-        }
-    }
-
-    /** Contrived test to force a longer comment than can be stored. */
-    public void testLongComment() throws IOException {
-        int maxCommentBytes = 0xffff; // 2 bytes
-        String longComment = createString(maxCommentBytes);
-
-        ZipEntry entry = new ZipEntry("name");
-        // setComment() should pass, because it is at the limit of what ZipEntry will detect as
-        // valid (since it uses UTF-8 as a worst-case guess).
-        entry.setComment(longComment);
-
-        // Using UTF-16 will result in comment bytes twice as large as is supported by Zip.
-        // UTF-16 is an unlikely character set to actually want to use with Zip but enables
-        // the edge-case behavior required without using direct field access.
-        ZipOutputStream out = new ZipOutputStream(
-                new ByteArrayOutputStream(), StandardCharsets.UTF_16);
-        try {
-            out.putNextEntry(entry);
-            fail();
-        } catch (IllegalArgumentException expected) {
-        }
-    }
-
-    private static String createString(int numChars) {
-        char c = 'a';
-        StringBuilder sb = new StringBuilder(numChars);
-        for (int i = 0; i < numChars; i++) {
-            sb.append(c);
-        }
-        return sb.toString();
-    }
 }