am 60e4a65d: am 916c54b2: Merge "Enable host multilib for ART testing."

* commit '60e4a65d7c30ea0b5456933db9a1aa75e4a3f645':
  Enable host multilib for ART testing.
diff --git a/NativeCode.mk b/NativeCode.mk
index 12e8114..0ae615e 100644
--- a/NativeCode.mk
+++ b/NativeCode.mk
@@ -66,7 +66,7 @@
 core_c_includes := libcore/include $(LOCAL_C_INCLUDES)
 core_shared_libraries := $(LOCAL_SHARED_LIBRARIES)
 core_static_libraries := $(LOCAL_STATIC_LIBRARIES)
-core_cflags := -Wall -Wextra -Werror
+core_cflags := $(LOCAL_CFLAGS) -Wall -Wextra -Werror
 core_cppflags += -std=gnu++11
 
 core_test_files := \
diff --git a/dex/src/main/java/com/android/dex/DexException.java b/dex/src/main/java/com/android/dex/DexException.java
index a30a46f..ee0af18 100644
--- a/dex/src/main/java/com/android/dex/DexException.java
+++ b/dex/src/main/java/com/android/dex/DexException.java
@@ -22,7 +22,7 @@
  * Thrown when there's a format problem reading, writing, or generally
  * processing a dex file.
  */
-public final class DexException extends ExceptionWithContext {
+public class DexException extends ExceptionWithContext {
     public DexException(String message) {
         super(message);
     }
diff --git a/dex/src/main/java/com/android/dex/DexIndexOverflowException.java b/dex/src/main/java/com/android/dex/DexIndexOverflowException.java
new file mode 100644
index 0000000..3226207
--- /dev/null
+++ b/dex/src/main/java/com/android/dex/DexIndexOverflowException.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2013 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 com.android.dex;
+
+/**
+ * Thrown when there's an index overflow writing a dex file.
+ */
+public final class DexIndexOverflowException extends DexException {
+    public DexIndexOverflowException(String message) {
+        super(message);
+    }
+
+    public DexIndexOverflowException(Throwable cause) {
+        super(cause);
+    }
+}
diff --git a/expectations/brokentests.txt b/expectations/brokentests.txt
index 5b5803d..5cebb63 100644
--- a/expectations/brokentests.txt
+++ b/expectations/brokentests.txt
@@ -98,21 +98,6 @@
   ]
 },
 {
-  description: "Some DecimalFormat tests fail, treating tests as broken while investigate further.",
-  bug: 12781028,
-  result: EXEC_FAILED,
-  names: [
-      "org.apache.harmony.tests.java.text.DecimalFormatTest#testSerializationSelf",
-      "org.apache.harmony.tests.java.text.DecimalFormatTest#test_formatD",
-      "org.apache.harmony.tests.java.text.DecimalFormatTest#test_formatDLjava_lang_StringBufferLjava_text_FieldPosition",
-      "org.apache.harmony.tests.java.text.DecimalFormatTest#test_formatDLjava_lang_StringBufferLjava_text_FieldPosition_problem_cases",
-      "org.apache.harmony.tests.java.text.DecimalFormatTest#test_formatD_2",
-      "org.apache.harmony.tests.java.text.DecimalFormatTest#test_formatJLjava_lang_StringBufferLjava_text_FieldPosition",
-      "org.apache.harmony.tests.java.text.DecimalFormatTest#test_formatToCharacterIterator_very_large",
-      "org.apache.harmony.tests.java.text.DecimalFormatTest#test_format_minus_zero"
-  ]
-},
-{
   description: "Fails in CTS, passes in CoreTestRunner.",
   result: EXEC_FAILED,
   names: [
diff --git a/expectations/knownfailures.txt b/expectations/knownfailures.txt
index 0924bd4..94b1a59 100644
--- a/expectations/knownfailures.txt
+++ b/expectations/knownfailures.txt
@@ -1374,89 +1374,37 @@
   ]
 },
 {
-  description: "Known failures in klp-modular-dev branch being suppressed for dory / molly.",
-  bug: 14674275,
-  names: [
-    "libcore.java.lang.SystemTest#testArrayCopyConcurrentModification",
-    "libcore.java.lang.ref.FinalizeTest#testSystemRunFinalizationReturnsEvenIfQueueIsNonEmpty",
-    "libcore.java.lang.reflect.ClassLoaderReflectionTest#testConstructorsOfDifferentClassLoadersAreNotEqual",
-    "libcore.java.lang.reflect.ClassLoaderReflectionTest#testFieldsOfDifferentClassLoadersAreNotEqual",
-    "libcore.java.lang.reflect.MethodTest#testEqualMethodEqualsAndHashCode",
-    "libcore.java.lang.reflect.MethodTest#testHashCodeSpec",
-    "libcore.java.lang.reflect.ProxyTest#testDeclaredExceptionIntersectedByExactReturnTypes",
-    "libcore.java.lang.reflect.ProxyTest#testReturnTypeDoesNotSatisfyAllConstraintsWithLenientCaller",
-    "libcore.java.net.ConcurrentCloseTest#test_connect",
-    "libcore.java.net.ConcurrentCloseTest#test_connect_nonBlocking",
-    "libcore.java.net.ConcurrentCloseTest#test_connect_timeout",
-    "libcore.java.net.InetAddressTest#test_isReachable",
-    "libcore.java.net.OldCookieHandlerTest#test_get_put",
-    "libcore.java.net.OldSocketTest#test_ConstructorLjava_lang_StringILjava_net_InetAddressI2",
-    "libcore.java.net.OldSocketTest#test_connectLjava_net_SocketAddressI",
-    "libcore.java.net.URLConnectionTest#testConnectViaHttpProxyToHttpsUsingBadProxyAndHttpResponseCache",
-    "libcore.java.util.prefs.OldFilePreferencesImplTest#testSystemChildNodes",
-    "libcore.java.util.prefs.OldNodeChangeEventTest#testGetChild",
-    "libcore.java.util.prefs.OldNodeChangeEventTest#testGetParent",
-    "org.apache.harmony.luni.tests.java.net.URLConnectionTest#test_getLastModified",
-    "org.apache.harmony.tests.java.io.SerializationStressTest4#test_writeObject_Proxy",
-    "org.apache.harmony.tests.java.lang.RuntimeTest#test_gc",
-    "org.apache.harmony.tests.java.lang.ref.ReferenceQueueTest#test_removeJ",
-    "org.apache.harmony.tests.java.lang.reflect.FieldTest#testProtectedFieldAccess",
-    "org.apache.harmony.tests.java.lang.reflect.ProxyTest#test_ProxyClass_withParentAndSubInThrowList",
-    "org.apache.harmony.tests.java.net.DatagramSocketTest#test_setBroadcastZ",
-    "org.apache.harmony.tests.java.net.JarURLConnectionTest#test_getURLEncodedEntry",
-    "org.apache.harmony.tests.java.net.MulticastSocketTest#test_joinGroupLjava_net_InetAddress_IPv4",
-    "org.apache.harmony.tests.java.net.MulticastSocketTest#test_joinGroupLjava_net_InetAddress_IPv6",
-    "org.apache.harmony.tests.java.net.MulticastSocketTest#test_joinGroupLjava_net_SocketAddressLjava_net_NetworkInterface",
-    "org.apache.harmony.tests.java.net.MulticastSocketTest#test_joinGroupLjava_net_SocketAddressLjava_net_NetworkInterface_IPv4",
-    "org.apache.harmony.tests.java.net.MulticastSocketTest#test_joinGroupLjava_net_SocketAddressLjava_net_NetworkInterface_IPv6",
-    "org.apache.harmony.tests.java.net.MulticastSocketTest#test_joinGroupLjava_net_SocketAddressLjava_net_NetworkInterface_multiple_joins_IPv4",
-    "org.apache.harmony.tests.java.net.MulticastSocketTest#test_joinGroupLjava_net_SocketAddressLjava_net_NetworkInterface_multiple_joins_IPv6",
-    "org.apache.harmony.tests.java.net.MulticastSocketTest#test_leaveGroupLjava_net_InetAddress_IPv4",
-    "org.apache.harmony.tests.java.net.MulticastSocketTest#test_leaveGroupLjava_net_InetAddress_IPv6",
-    "org.apache.harmony.tests.java.net.MulticastSocketTest#test_leaveGroupLjava_net_SocketAddressLjava_net_NetworkInterface_IPv4",
-    "org.apache.harmony.tests.java.net.MulticastSocketTest#test_leaveGroupLjava_net_SocketAddressLjava_net_NetworkInterface_IPv6",
-    "org.apache.harmony.tests.java.net.MulticastSocketTest#test_sendLjava_net_DatagramPacketB_IPv4",
-    "org.apache.harmony.tests.java.net.MulticastSocketTest#test_sendLjava_net_DatagramPacketB_IPv6",
-    "org.apache.harmony.tests.java.net.MulticastSocketTest#test_setLoopbackModeSendReceive_IPv4",
-    "org.apache.harmony.tests.java.net.MulticastSocketTest#test_setLoopbackModeSendReceive_IPv6",
-    "org.apache.harmony.tests.java.net.MulticastSocketTest#test_setNetworkInterfaceLjava_net_NetworkInterface_IPv4",
-    "org.apache.harmony.tests.java.text.SimpleDateFormatTest#test_formatLjava_util_DateLjava_lang_StringBufferLjava_text_FieldPosition",
-    "org.apache.harmony.tests.java.text.SimpleDateFormatTest#test_parseLjava_lang_StringLjava_text_ParsePosition",
-    "tests.api.internal.net.www.protocol.file.FileURLConnectionTest#testGetContentType",
-    "tests.api.internal.net.www.protocol.file.FileURLConnectionTest#testGetInputStream",
-    "tests.api.internal.net.www.protocol.file.FileURLConnectionTest#testHeaderFunctions",
-    "tests.api.internal.net.www.protocol.file.FileURLConnectionTest#testHeader_BoundaryCheck"
-  ]
-},
-{
   description: "Known failure in GregorianCalendarTest",
   bug: 12778197,
   name: "org.apache.harmony.tests.java.util.GregorianCalendarTest#test_computeTime"
 },
 {
-  description: "Environment specific Console test suppressed for dory / molly",
-  bug: 12491103,
-  name: "org.apache.harmony.tests.java.io.ConsoleTest#test_readPassword_LString_LObject"
-},
-{
-  description: "Some tests take too long on clockwork devices. Suppressed on klp-modular-dev.",
-  bug: 5513723,
+  description: "SpdyConnection issue https://github.com/square/okhttp/issues/644 crashes the test app. Android does not provide SPDY/HTTP_2 connections by default so have been suppressed.",
+  bug: 14462336,
   names: [
-    "libcore.java.security.KeyPairGeneratorTest#test_getInstance_provider0",
-    "libcore.java.security.KeyPairGeneratorTest#test_getInstance_provider1",
-    "libcore.java.security.KeyPairGeneratorTest#test_getInstance_provider2",
-    "libcore.java.security.KeyPairGeneratorTest#test_getInstance_provider3",
-    "libcore.java.security.KeyPairGeneratorTest#test_getInstance_provider4",
-    "libcore.java.security.KeyPairGeneratorTest#test_getInstance_provider5",
-    "libcore.java.security.KeyPairGeneratorTest#test_getInstance_provider6",
-    "libcore.java.security.KeyPairGeneratorTest#test_getInstance_provider7",
-    "libcore.java.security.KeyPairGeneratorTest#test_getInstance_provider8",
-    "libcore.java.security.KeyPairGeneratorTest#test_getInstance_provider9"
+    "com.squareup.okhttp.internal.spdy.SpdyConnectionTest",
+    "com.squareup.okhttp.internal.http.HttpOverHttp20Draft09Test",
+    "com.squareup.okhttp.internal.http.HttpOverSpdy3Test",
+    "com.squareup.okhttp.internal.http.URLConnectionTest#npnSetsProtocolHeader_SPDY_3",
+    "com.squareup.okhttp.internal.http.URLConnectionTest#npnSetsProtocolHeader_HTTP_2",
+    "com.squareup.okhttp.internal.http.URLConnectionTest#zeroLengthPost_SPDY_3",
+    "com.squareup.okhttp.internal.http.URLConnectionTest#zeroLengthPost_HTTP_2",
+    "com.squareup.okhttp.internal.http.URLConnectionTest#zeroLengthPut_SPDY_3",
+    "com.squareup.okhttp.internal.http.URLConnectionTest#zeroLengthPut_HTTP_2"
   ]
 },
 {
-  description: "Suppression of a test that proves there is a known bug with Matcher",
-  bug: 14865710,
-  name: "org.apache.harmony.tests.java.util.ScannerParseLargeFileBenchmarkTest#testParseLargeFile"
+  description: "Okhttp test hardcodes the TLS version expected.",
+  bug: 14462336,
+  names: [
+    "com.squareup.okhttp.internal.http.URLConnectionTest#sslFallbackNotUsedWhenRecycledConnectionFails"
+  ]
+},
+{
+  description: "The test relies on SimpleDateFormat zzz producing GMT not GMT+00:00 as it does on Android. Android issue 66136.",
+  bug: 14462336,
+  names: [
+    "com.squareup.okhttp.internal.http.HttpResponseCacheTest#setIfModifiedSince"
+  ]
 }
 ]
diff --git a/harmony-tests/src/test/java/org/apache/harmony/tests/internal/net/www/protocol/file/FileURLConnectionTest.java b/harmony-tests/src/test/java/org/apache/harmony/tests/internal/net/www/protocol/file/FileURLConnectionTest.java
index 1f4ad1f..d6f2c01 100644
--- a/harmony-tests/src/test/java/org/apache/harmony/tests/internal/net/www/protocol/file/FileURLConnectionTest.java
+++ b/harmony-tests/src/test/java/org/apache/harmony/tests/internal/net/www/protocol/file/FileURLConnectionTest.java
@@ -112,8 +112,6 @@
         assertEquals(conn.getContentType(), conn.getHeaderField("content-type"));
         assertEquals(Integer.toString(conn.getContentLength()),
                 conn.getHeaderField("content-length"));
-        assertEquals(Long.toString(conn.getContentLengthLong()),
-                conn.getHeaderField("content-length"));
         assertEquals(conn.getHeaderField(0), conn.getHeaderField("content-type"));
         assertEquals(conn.getHeaderField(1), conn.getHeaderField("content-length"));
         assertEquals(conn.getHeaderField(2), conn.getHeaderField("last-modified"));
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/net/InetAddressTest.java b/harmony-tests/src/test/java/org/apache/harmony/tests/java/net/InetAddressTest.java
index a029a51..959f83c 100644
--- a/harmony-tests/src/test/java/org/apache/harmony/tests/java/net/InetAddressTest.java
+++ b/harmony-tests/src/test/java/org/apache/harmony/tests/java/net/InetAddressTest.java
@@ -349,9 +349,8 @@
         } catch (IllegalArgumentException e) {
             // correct
         }
-        // tests unreachable address. 192.0.2.1 is reserved by RFC 5737
-        // and should not be used outside of example code / docs.
-        ia = Inet4Address.getByName("192.0.2.1");
+        // tests nowhere
+        ia = Inet4Address.getByName("1.1.1.1");
         assertFalse(ia.isReachable(1000));
         assertFalse(ia.isReachable(null, 0, 1000));
 
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/harmony-tests/src/test/java/org/apache/harmony/tests/java/util/jar/JarFileTest.java b/harmony-tests/src/test/java/org/apache/harmony/tests/java/util/jar/JarFileTest.java
index 740340e..d5d8191 100644
--- a/harmony-tests/src/test/java/org/apache/harmony/tests/java/util/jar/JarFileTest.java
+++ b/harmony-tests/src/test/java/org/apache/harmony/tests/java/util/jar/JarFileTest.java
@@ -23,6 +23,7 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URL;
+import java.security.CodeSigner;
 import java.security.Permission;
 import java.security.cert.Certificate;
 import java.security.cert.X509Certificate;
@@ -98,6 +99,8 @@
 
     private static final String INVALID_CHAIN_JAR = "hyts_signed_invalidChain.jar";
 
+    private static final String AMBIGUOUS_SIGNERS_JAR = "hyts_signed_ambiguousSignerArray.jar";
+
     private File resources;
 
     // custom security manager
@@ -647,13 +650,18 @@
                         + jarName + "\"", foundCerts);
     }
 
-    private Certificate[] getSignedJarCerts(String jarName, boolean chainCheck) throws Exception {
+    private static class Results {
+        public Certificate[] certificates;
+        public CodeSigner[] signers;
+    }
+
+    private Results getSignedJarCerts(String jarName) throws Exception {
         Support_Resources.copyFile(resources, null, jarName);
 
         File file = new File(resources, jarName);
-        Certificate[] foundCerts = null;
+        Results results = new Results();
 
-        JarFile jarFile = new JarFile(file, true, ZipFile.OPEN_READ, chainCheck);
+        JarFile jarFile = new JarFile(file, true, ZipFile.OPEN_READ);
         try {
 
             Enumeration<JarEntry> e = jarFile.entries();
@@ -664,8 +672,10 @@
                 is.skip(entry.getSize());
                 is.close();
                 Certificate[] certs = entry.getCertificates();
+                CodeSigner[] signers = entry.getCodeSigners();
                 if (certs != null && certs.length > 0) {
-                    foundCerts = certs;
+                    results.certificates = certs;
+                    results.signers = signers;
                     break;
                 }
             }
@@ -673,42 +683,38 @@
             jarFile.close();
         }
 
-        return foundCerts;
+        return results;
     }
 
-    public void testJarFile_Signed_ValidChain_NoCheck() throws Exception {
-        Certificate[] certs = getSignedJarCerts(VALID_CHAIN_JAR, false);
-        assertNotNull(certs);
-        assertEquals(Arrays.deepToString(certs), 3, certs.length);
-        assertEquals("CN=fake-chain", ((X509Certificate) certs[0]).getSubjectDN().toString());
-        assertEquals("CN=intermediate1", ((X509Certificate) certs[1]).getSubjectDN().toString());
-        assertEquals("CN=root1", ((X509Certificate) certs[2]).getSubjectDN().toString());
+    public void testJarFile_Signed_ValidChain() throws Exception {
+        Results result = getSignedJarCerts(VALID_CHAIN_JAR);
+        assertNotNull(result);
+        assertEquals(Arrays.deepToString(result.certificates), 3, result.certificates.length);
+        assertEquals(Arrays.deepToString(result.signers), 1, result.signers.length);
+        assertEquals(3, result.signers[0].getSignerCertPath().getCertificates().size());
+        assertEquals("CN=fake-chain", ((X509Certificate) result.certificates[0]).getSubjectDN().toString());
+        assertEquals("CN=intermediate1", ((X509Certificate) result.certificates[1]).getSubjectDN().toString());
+        assertEquals("CN=root1", ((X509Certificate) result.certificates[2]).getSubjectDN().toString());
     }
 
-    public void testJarFile_Signed_ValidChain_Check() throws Exception {
-        Certificate[] certs = getSignedJarCerts(VALID_CHAIN_JAR, true);
-        assertNotNull(certs);
-        assertEquals(Arrays.deepToString(certs), 3, certs.length);
-        assertEquals("CN=fake-chain", ((X509Certificate) certs[0]).getSubjectDN().toString());
-        assertEquals("CN=intermediate1", ((X509Certificate) certs[1]).getSubjectDN().toString());
-        assertEquals("CN=root1", ((X509Certificate) certs[2]).getSubjectDN().toString());
+    public void testJarFile_Signed_InvalidChain() throws Exception {
+        Results result = getSignedJarCerts(INVALID_CHAIN_JAR);
+        assertNotNull(result);
+        assertEquals(Arrays.deepToString(result.certificates), 3, result.certificates.length);
+        assertEquals(Arrays.deepToString(result.signers), 1, result.signers.length);
+        assertEquals(3, result.signers[0].getSignerCertPath().getCertificates().size());
+        assertEquals("CN=fake-chain", ((X509Certificate) result.certificates[0]).getSubjectDN().toString());
+        assertEquals("CN=intermediate1", ((X509Certificate) result.certificates[1]).getSubjectDN().toString());
+        assertEquals("CN=root1", ((X509Certificate) result.certificates[2]).getSubjectDN().toString());
     }
 
-    public void testJarFile_Signed_InvalidChain_NoCheck() throws Exception {
-        Certificate[] certs = getSignedJarCerts(INVALID_CHAIN_JAR, false);
-        assertNotNull(certs);
-        assertEquals(Arrays.deepToString(certs), 3, certs.length);
-        assertEquals("CN=fake-chain", ((X509Certificate) certs[0]).getSubjectDN().toString());
-        assertEquals("CN=intermediate1", ((X509Certificate) certs[1]).getSubjectDN().toString());
-        assertEquals("CN=root1", ((X509Certificate) certs[2]).getSubjectDN().toString());
-    }
-
-    public void testJarFile_Signed_InvalidChain_Check() throws Exception {
-        Certificate[] certs = getSignedJarCerts(INVALID_CHAIN_JAR, true);
-        assertNotNull(certs);
-        assertEquals(Arrays.deepToString(certs), 2, certs.length);
-        assertEquals("CN=fake-chain", ((X509Certificate) certs[0]).getSubjectDN().toString());
-        assertEquals("CN=intermediate1", ((X509Certificate) certs[1]).getSubjectDN().toString());
+    public void testJarFile_Signed_AmbiguousSigners() throws Exception {
+        Results result = getSignedJarCerts(AMBIGUOUS_SIGNERS_JAR);
+        assertNotNull(result);
+        assertEquals(Arrays.deepToString(result.certificates), 2, result.certificates.length);
+        assertEquals(Arrays.deepToString(result.signers), 2, result.signers.length);
+        assertEquals(1, result.signers[0].getSignerCertPath().getCertificates().size());
+        assertEquals(1, result.signers[1].getSignerCertPath().getCertificates().size());
     }
 
     /*
diff --git a/luni/src/main/java/android/system/ErrnoException.java b/luni/src/main/java/android/system/ErrnoException.java
index 134d6a0..90155c8 100644
--- a/luni/src/main/java/android/system/ErrnoException.java
+++ b/luni/src/main/java/android/system/ErrnoException.java
@@ -24,8 +24,6 @@
  * A checked exception thrown when {@link Os} methods fail. This exception contains the native
  * errno value, for comparison against the constants in {@link OsConstants}, should sophisticated
  * callers need to adjust their behavior based on the exact failure.
- *
- * @hide
  */
 public final class ErrnoException extends Exception {
   private final String functionName;
diff --git a/luni/src/main/java/android/system/Os.java b/luni/src/main/java/android/system/Os.java
index e7613df..0b80b52 100644
--- a/luni/src/main/java/android/system/Os.java
+++ b/luni/src/main/java/android/system/Os.java
@@ -47,8 +47,6 @@
  * primitives used to implement the higher-level APIs.
  *
  * <p>The corresponding constants can be found in {@link OsConstants}.
- *
- * @hide
  */
 public final class Os {
   private Os() {}
@@ -63,6 +61,8 @@
    */
   public static boolean access(String path, int mode) throws ErrnoException { return Libcore.os.access(path, mode); }
 
+  /** @hide */ public static InetAddress[] android_getaddrinfo(String node, StructAddrinfo hints, int netId) throws GaiException { return Libcore.os.android_getaddrinfo(node, hints, netId); }
+
   /**
    * See <a href="http://man7.org/linux/man-pages/man2/bind.2.html">bind(2)</a>.
    */
@@ -157,8 +157,6 @@
    */
   public static String gai_strerror(int error) { return Libcore.os.gai_strerror(error); }
 
-  /** @hide */ public static InetAddress[] getaddrinfo(String node, StructAddrinfo hints) throws GaiException { return Libcore.os.getaddrinfo(node, hints); }
-
   /**
    * See <a href="http://man7.org/linux/man-pages/man2/getegid.2.html">getegid(2)</a>.
    */
diff --git a/luni/src/main/java/android/system/OsConstants.java b/luni/src/main/java/android/system/OsConstants.java
index cfed2f6..4166325 100644
--- a/luni/src/main/java/android/system/OsConstants.java
+++ b/luni/src/main/java/android/system/OsConstants.java
@@ -18,7 +18,6 @@
 
 /**
  * Constants and helper functions for use with {@link Os}.
- * @hide
  */
 public final class OsConstants {
     private OsConstants() {
diff --git a/luni/src/main/java/android/system/StructPollfd.java b/luni/src/main/java/android/system/StructPollfd.java
index 8bdecb2..b812612 100644
--- a/luni/src/main/java/android/system/StructPollfd.java
+++ b/luni/src/main/java/android/system/StructPollfd.java
@@ -22,8 +22,6 @@
 /**
  * Used as an in/out parameter to {@link Os#poll}.
  * Corresponds to C's {@code struct pollfd} from {@code &lt;poll.h&gt;}.
- *
- * @hide
  */
 public final class StructPollfd {
   /** The file descriptor to poll. */
diff --git a/luni/src/main/java/android/system/StructStat.java b/luni/src/main/java/android/system/StructStat.java
index 87bd50c..a6958c1 100644
--- a/luni/src/main/java/android/system/StructStat.java
+++ b/luni/src/main/java/android/system/StructStat.java
@@ -21,8 +21,6 @@
 /**
  * File information returned by {@link Os#fstat}, {@link Os#lstat}, and {@link Os#stat}.
  * Corresponds to C's {@code struct stat} from {@code &lt;stat.h&gt;}.
- *
- * @hide
  */
 public final class StructStat {
   /** Device ID of device containing file. */
diff --git a/luni/src/main/java/android/system/StructStatVfs.java b/luni/src/main/java/android/system/StructStatVfs.java
index b0b7802..942a39a 100644
--- a/luni/src/main/java/android/system/StructStatVfs.java
+++ b/luni/src/main/java/android/system/StructStatVfs.java
@@ -20,8 +20,6 @@
 
 /**
  * File information returned by {@link Os#fstatvfs} and {@link Os#statvfs}.
- *
- * @hide
  */
 public final class StructStatVfs {
   /** File system block size (used for block counts). */
diff --git a/luni/src/main/java/android/system/StructUtsname.java b/luni/src/main/java/android/system/StructUtsname.java
index c62dbfa..5d9127b 100644
--- a/luni/src/main/java/android/system/StructUtsname.java
+++ b/luni/src/main/java/android/system/StructUtsname.java
@@ -21,8 +21,6 @@
 /**
  * Information returned by {@link Os#uname}.
  * Corresponds to C's {@code struct utsname} from {@code &lt;sys/utsname.h&gt;}.
- *
- * @hide
  */
 public final class StructUtsname {
   /** The OS name, such as "Linux". */
diff --git a/luni/src/main/java/android/util/MutableBoolean.java b/luni/src/main/java/android/util/MutableBoolean.java
index 90bf68c..5a8a200 100644
--- a/luni/src/main/java/android/util/MutableBoolean.java
+++ b/luni/src/main/java/android/util/MutableBoolean.java
@@ -17,7 +17,6 @@
 package android.util;
 
 /**
- * @hide
  */
 public final class MutableBoolean {
   public boolean value;
diff --git a/luni/src/main/java/android/util/MutableByte.java b/luni/src/main/java/android/util/MutableByte.java
index 65738b9..7397ba4 100644
--- a/luni/src/main/java/android/util/MutableByte.java
+++ b/luni/src/main/java/android/util/MutableByte.java
@@ -17,7 +17,6 @@
 package android.util;
 
 /**
- * @hide
  */
 public final class MutableByte {
   public byte value;
diff --git a/luni/src/main/java/android/util/MutableChar.java b/luni/src/main/java/android/util/MutableChar.java
index b59bab3..f435331 100644
--- a/luni/src/main/java/android/util/MutableChar.java
+++ b/luni/src/main/java/android/util/MutableChar.java
@@ -17,7 +17,6 @@
 package android.util;
 
 /**
- * @hide
  */
 public final class MutableChar {
   public char value;
diff --git a/luni/src/main/java/android/util/MutableDouble.java b/luni/src/main/java/android/util/MutableDouble.java
index 3e2cc3a..f62f47e 100644
--- a/luni/src/main/java/android/util/MutableDouble.java
+++ b/luni/src/main/java/android/util/MutableDouble.java
@@ -17,7 +17,6 @@
 package android.util;
 
 /**
- * @hide
  */
 public final class MutableDouble {
   public double value;
diff --git a/luni/src/main/java/android/util/MutableFloat.java b/luni/src/main/java/android/util/MutableFloat.java
index 6e30501..6b5441c 100644
--- a/luni/src/main/java/android/util/MutableFloat.java
+++ b/luni/src/main/java/android/util/MutableFloat.java
@@ -17,7 +17,6 @@
 package android.util;
 
 /**
- * @hide
  */
 public final class MutableFloat {
   public float value;
diff --git a/luni/src/main/java/android/util/MutableInt.java b/luni/src/main/java/android/util/MutableInt.java
index 8220c44..2f93030 100644
--- a/luni/src/main/java/android/util/MutableInt.java
+++ b/luni/src/main/java/android/util/MutableInt.java
@@ -17,7 +17,6 @@
 package android.util;
 
 /**
- * @hide
  */
 public final class MutableInt {
   public int value;
diff --git a/luni/src/main/java/android/util/MutableLong.java b/luni/src/main/java/android/util/MutableLong.java
index 5df6a0d..94beab5 100644
--- a/luni/src/main/java/android/util/MutableLong.java
+++ b/luni/src/main/java/android/util/MutableLong.java
@@ -17,7 +17,6 @@
 package android.util;
 
 /**
- * @hide
  */
 public final class MutableLong {
   public long value;
diff --git a/luni/src/main/java/android/util/MutableShort.java b/luni/src/main/java/android/util/MutableShort.java
index 3880fef..cdd9923 100644
--- a/luni/src/main/java/android/util/MutableShort.java
+++ b/luni/src/main/java/android/util/MutableShort.java
@@ -17,7 +17,6 @@
 package android.util;
 
 /**
- * @hide
  */
 public final class MutableShort {
   public short value;
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/lang/System.java b/luni/src/main/java/java/lang/System.java
index 6fc35da..185701e 100644
--- a/luni/src/main/java/java/lang/System.java
+++ b/luni/src/main/java/java/lang/System.java
@@ -356,11 +356,6 @@
         }
         p.put("java.home", javaHome);
 
-        String ldLibraryPath = getenv("LD_LIBRARY_PATH");
-        if (ldLibraryPath != null) {
-            p.put("java.library.path", ldLibraryPath);
-        }
-
         p.put("java.specification.name", "Dalvik Core Library");
         p.put("java.specification.vendor", projectName);
         p.put("java.specification.version", "0.9");
diff --git a/luni/src/main/java/java/net/AddressCache.java b/luni/src/main/java/java/net/AddressCache.java
index 194761a..2aba78b 100644
--- a/luni/src/main/java/java/net/AddressCache.java
+++ b/luni/src/main/java/java/net/AddressCache.java
@@ -37,8 +37,36 @@
     private static final long TTL_NANOS = 2 * 1000000000L;
 
     // The actual cache.
-    private final BasicLruCache<String, AddressCacheEntry> cache
-            = new BasicLruCache<String, AddressCacheEntry>(MAX_ENTRIES);
+    private final BasicLruCache<AddressCacheKey, AddressCacheEntry> cache
+            = new BasicLruCache<AddressCacheKey, AddressCacheEntry>(MAX_ENTRIES);
+
+    static class AddressCacheKey {
+        private final String mHostname;
+        private final int mNetId;
+
+        AddressCacheKey(String hostname, int netId) {
+            mHostname = hostname;
+            mNetId = netId;
+        }
+
+        @Override public boolean equals(Object o) {
+            if (this == o) {
+                return true;
+            }
+            if (!(o instanceof AddressCacheKey)) {
+                return false;
+            }
+            AddressCacheKey lhs = (AddressCacheKey) o;
+            return mHostname.equals(lhs.mHostname) && mNetId == lhs.mNetId;
+        }
+
+        @Override public int hashCode() {
+            int result = 17;
+            result = 31 * result + mNetId;
+            result = 31 * result + mHostname.hashCode();
+            return result;
+        }
+    }
 
     static class AddressCacheEntry {
         // Either an InetAddress[] for a positive entry,
@@ -67,12 +95,12 @@
     }
 
     /**
-     * Returns the cached InetAddress[] associated with 'hostname'. Returns null if nothing is known
-     * about 'hostname'. Returns a String suitable for use as an UnknownHostException detail
-     * message if 'hostname' is known not to exist.
+     * Returns the cached InetAddress[] for 'hostname' on network 'netId'. Returns null
+     * if nothing is known about 'hostname'. Returns a String suitable for use as an
+     * UnknownHostException detail message if 'hostname' is known not to exist.
      */
-    public Object get(String hostname) {
-        AddressCacheEntry entry = cache.get(hostname);
+    public Object get(String hostname, int netId) {
+        AddressCacheEntry entry = cache.get(new AddressCacheKey(hostname, netId));
         // Do we have a valid cache entry?
         if (entry != null && entry.expiryNanos >= System.nanoTime()) {
             return entry.value;
@@ -86,15 +114,15 @@
      * Associates the given 'addresses' with 'hostname'. The association will expire after a
      * certain length of time.
      */
-    public void put(String hostname, InetAddress[] addresses) {
-        cache.put(hostname, new AddressCacheEntry(addresses));
+    public void put(String hostname, int netId, InetAddress[] addresses) {
+        cache.put(new AddressCacheKey(hostname, netId), new AddressCacheEntry(addresses));
     }
 
     /**
      * Records that 'hostname' is known not to have any associated addresses. (I.e. insert a
      * negative cache entry.)
      */
-    public void putUnknownHost(String hostname, String detailMessage) {
-        cache.put(hostname, new AddressCacheEntry(detailMessage));
+    public void putUnknownHost(String hostname, int netId, String detailMessage) {
+        cache.put(new AddressCacheKey(hostname, netId), new AddressCacheEntry(detailMessage));
     }
 }
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/InetAddress.java b/luni/src/main/java/java/net/InetAddress.java
index e31b4c3..5cfa15a 100644
--- a/luni/src/main/java/java/net/InetAddress.java
+++ b/luni/src/main/java/java/net/InetAddress.java
@@ -127,6 +127,9 @@
 
     private static final long serialVersionUID = 3286316764910316507L;
 
+    /** Using NetID of NETID_UNSET indicates resolution should be done on default network. */
+    private static final int NETID_UNSET = 0;
+
     private int family;
 
     byte[] ipaddress;
@@ -209,14 +212,29 @@
      * @throws UnknownHostException if the address lookup fails.
      */
     public static InetAddress[] getAllByName(String host) throws UnknownHostException {
-        return getAllByNameImpl(host).clone();
+        return getAllByNameImpl(host, NETID_UNSET).clone();
     }
 
     /**
-     * Returns the InetAddresses for {@code host}. The returned array is shared
-     * and must be cloned before it is returned to application code.
+     * Operates identically to {@code getAllByName} except host resolution is
+     * performed on the network designated by {@code netId}.
+     *
+     * @param host the hostname or literal IP string to be resolved.
+     * @param netId the network to use for host resolution.
+     * @return the array of addresses associated with the specified host.
+     * @throws UnknownHostException if the address lookup fails.
+     * @hide internal use only
      */
-    private static InetAddress[] getAllByNameImpl(String host) throws UnknownHostException {
+    public static InetAddress[] getAllByNameOnNet(String host, int netId) throws UnknownHostException {
+        return getAllByNameImpl(host, netId).clone();
+    }
+
+    /**
+     * Returns the InetAddresses for {@code host} on network {@code netId}. The
+     * returned array is shared and must be cloned before it is returned to
+     * application code.
+     */
+    private static InetAddress[] getAllByNameImpl(String host, int netId) throws UnknownHostException {
         if (host == null || host.isEmpty()) {
             return loopbackAddresses();
         }
@@ -231,7 +249,7 @@
             return new InetAddress[] { result };
         }
 
-        return lookupHostByName(host).clone();
+        return lookupHostByName(host, netId).clone();
     }
 
     private static InetAddress makeInetAddress(byte[] bytes, String hostName) throws UnknownHostException {
@@ -264,7 +282,7 @@
         hints.ai_flags = AI_NUMERICHOST;
         InetAddress[] addresses = null;
         try {
-            addresses = Libcore.os.getaddrinfo(address, hints);
+            addresses = Libcore.os.android_getaddrinfo(address, hints, NETID_UNSET);
         } catch (GaiException ignored) {
         }
         return (addresses != null) ? addresses[0] : null;
@@ -284,7 +302,22 @@
      *             if the address lookup fails.
      */
     public static InetAddress getByName(String host) throws UnknownHostException {
-        return getAllByNameImpl(host)[0];
+        return getAllByNameImpl(host, NETID_UNSET)[0];
+    }
+
+    /**
+     * Operates identically to {@code getByName} except host resolution is
+     * performed on the network designated by {@code netId}.
+     *
+     * @param host
+     *            the hostName to be resolved to an address or {@code null}.
+     * @param netId the network to use for host resolution.
+     * @return the {@code InetAddress} instance representing the host.
+     * @throws UnknownHostException if the address lookup fails.
+     * @hide internal use only
+     */
+    public static InetAddress getByNameOnNet(String host, int netId) throws UnknownHostException {
+        return getAllByNameImpl(host, netId)[0];
     }
 
     /**
@@ -360,7 +393,7 @@
      */
     public static InetAddress getLocalHost() throws UnknownHostException {
         String host = Libcore.os.uname().nodename;
-        return lookupHostByName(host)[0];
+        return lookupHostByName(host, NETID_UNSET)[0];
     }
 
     /**
@@ -377,12 +410,14 @@
      * Resolves a hostname to its IP addresses using a cache.
      *
      * @param host the hostname to resolve.
+     * @param netId the network to perform resolution upon.
      * @return the IP addresses of the host.
      */
-    private static InetAddress[] lookupHostByName(String host) throws UnknownHostException {
+    private static InetAddress[] lookupHostByName(String host, int netId)
+            throws UnknownHostException {
         BlockGuard.getThreadPolicy().onNetwork();
         // Do we have a result cached?
-        Object cachedResult = addressCache.get(host);
+        Object cachedResult = addressCache.get(host, netId);
         if (cachedResult != null) {
             if (cachedResult instanceof InetAddress[]) {
                 // A cached positive result.
@@ -400,12 +435,12 @@
             // for SOCK_STREAM and one for SOCK_DGRAM. Since we do not return the family
             // anyway, just pick one.
             hints.ai_socktype = SOCK_STREAM;
-            InetAddress[] addresses = Libcore.os.getaddrinfo(host, hints);
+            InetAddress[] addresses = Libcore.os.android_getaddrinfo(host, hints, netId);
             // TODO: should getaddrinfo set the hostname of the InetAddresses it returns?
             for (InetAddress address : addresses) {
                 address.hostName = host;
             }
-            addressCache.put(host, addresses);
+            addressCache.put(host, netId, addresses);
             return addresses;
         } catch (GaiException gaiException) {
             // If the failure appears to have been a lack of INTERNET permission, throw a clear
@@ -418,7 +453,7 @@
             }
             // Otherwise, throw an UnknownHostException.
             String detailMessage = "Unable to resolve host \"" + host + "\": " + Libcore.os.gai_strerror(gaiException.error);
-            addressCache.putUnknownHost(host, detailMessage);
+            addressCache.putUnknownHost(host, netId, detailMessage);
             throw gaiException.rethrowAsUnknownHostException(detailMessage);
         }
     }
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/net/URLConnection.java b/luni/src/main/java/java/net/URLConnection.java
index cc7de90..2fb3f45 100644
--- a/luni/src/main/java/java/net/URLConnection.java
+++ b/luni/src/main/java/java/net/URLConnection.java
@@ -316,17 +316,6 @@
     }
 
     /**
-     * Returns the content length in bytes specified by the response header field
-     * {@code content-length} or {@code -1} if this field is not set.
-     *
-     * @since 1.7
-     * @hide Until ready for a public API change
-     */
-    public long getContentLengthLong() {
-        return getHeaderFieldLong("Content-Length", -1);
-    }
-
-    /**
      * Returns the MIME-type of the content specified by the response header field
      * {@code content-type} or {@code null} if type is unknown.
      *
@@ -558,27 +547,6 @@
     }
 
     /**
-     * Returns the specified header value as a number. Returns the {@code
-     * defaultValue} if no such header field could be found or the value could
-     * not be parsed as a {@code long}.
-     *
-     * @param field
-     *            the header field name whose value is needed.
-     * @param defaultValue
-     *            the default value if no field has been found.
-     * @return the value of the specified header field as a number.
-     * @since 1.7
-     * @hide Until ready for a public API change
-     */
-    public long getHeaderFieldLong(String field, long defaultValue) {
-        try {
-            return Long.parseLong(getHeaderField(field));
-        } catch (NumberFormatException e) {
-            return defaultValue;
-        }
-    }
-
-    /**
      * Returns the name of the header field at the given position {@code posn} or
      * {@code null} if there are fewer than {@code posn} fields. The base
      * implementation of this method returns always {@code null}.
diff --git a/luni/src/main/java/java/nio/DatagramChannelImpl.java b/luni/src/main/java/java/nio/DatagramChannelImpl.java
index 8a5dbb6..9008637 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
@@ -160,35 +130,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 +465,6 @@
         // A closed channel is not connected.
         onDisconnect(true /* updateSocketState */);
         IoBridge.closeAndSignalBlockedThreads(fd);
-        multicastMembershipHandler = null;
 
         if (socket != null && !socket.isClosed()) {
             socket.onClose();
@@ -570,52 +510,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..ae33672 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;
@@ -58,57 +55,6 @@
         return socket;
     }
 
-    /** @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()) {
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/IllformedLocaleException.java b/luni/src/main/java/java/util/IllformedLocaleException.java
index db1754e..ff844f7 100644
--- a/luni/src/main/java/java/util/IllformedLocaleException.java
+++ b/luni/src/main/java/java/util/IllformedLocaleException.java
@@ -21,8 +21,8 @@
  *
  * See {@link Locale} and {@link Locale.Builder}.
  *
- * @hide
  * @since 1.7
+ * @hide 1.7
  */
 public class IllformedLocaleException extends RuntimeException {
 
diff --git a/luni/src/main/java/java/util/Locale.java b/luni/src/main/java/java/util/Locale.java
index a3eaf21..f69d55f 100644
--- a/luni/src/main/java/java/util/Locale.java
+++ b/luni/src/main/java/java/util/Locale.java
@@ -253,8 +253,8 @@
      *
      * See {@link #getExtension(char)} and {@link Builder#setExtension(char, String)}.
      *
-     * @hide
      * @since 1.7
+     * @hide 1.7
      */
     public static final char PRIVATE_USE_EXTENSION = 'x';
 
@@ -264,8 +264,8 @@
      *
      * See {@link #getExtension(char)} and {@link Builder#setExtension(char, String)}.
      *
-     * @hide
      * @since 1.7
+     * @hide 1.7
      */
     public static final char UNICODE_LOCALE_EXTENSION = 'u';
 
@@ -297,7 +297,7 @@
      * the structured state (keywords and attributes) specified therein.
      *
      * @since 1.7
-     * @hide
+     * @hide 1.7
      */
     public static final class Builder {
         private String language;
@@ -787,8 +787,8 @@
      *
      * @throws NullPointerException if {@code languageTag} is {@code null}.
      *
-     * @hide
      * @since 1.7
+     * @hide 1.7
      */
     public static Locale forLanguageTag(String languageTag) {
         if (languageTag == null) {
@@ -1125,6 +1125,8 @@
      * Returns the full variant name in the default {@code Locale} for the variant code of
      * this {@code Locale}. If there is no matching variant name, the variant code is
      * returned.
+     *
+     * @since 1.7
      */
     public final String getDisplayVariant() {
         return getDisplayVariant(getDefault());
@@ -1134,6 +1136,8 @@
      * Returns the full variant name in the specified {@code Locale} for the variant code
      * of this {@code Locale}. If there is no matching variant name, the variant code is
      * returned.
+     *
+     * @since 1.7
      */
     public String getDisplayVariant(Locale locale) {
         if (variantCode.isEmpty()) {
@@ -1238,8 +1242,8 @@
      * If set, the script code will be a title cased string of length 4, as per the ISO 15924
      * specification.
      *
-     * @hide
      * @since 1.7
+     * @hide 1.7
      */
     public String getScript() {
         return scriptCode;
@@ -1248,8 +1252,8 @@
     /**
      * Equivalent to {@code getDisplayScript(Locale.getDefault()))}
      *
-     * @hide
      * @since 1.7
+     * @hide 1.7
      */
     public String getDisplayScript() {
         return getDisplayScript(getDefault());
@@ -1260,8 +1264,8 @@
      * script code is unknown, the return value of this method is the same as that of
      * {@link #getScript()}.
      *
-     * @hide
      * @since 1.7
+     * @hide 1.7
      */
     public String getDisplayScript(Locale locale) {
         if (scriptCode.isEmpty()) {
@@ -1296,8 +1300,8 @@
      * For example, we do not require scripts to be a registered ISO 15924 scripts or
      * languages to appear in the ISO-639-2 code list.
      *
-     * @hide
      * @since 1.7
+     * @hide 1.7
      */
     public String toLanguageTag() {
         if (cachedLanguageTag == null) {
@@ -1512,8 +1516,8 @@
      * See <a href="https://tools.ietf.org/html/bcp47#section-2.1">
      *     the IETF BCP-47 specification</a> (Section 2.2.6) for details.
      *
-     * @hide
      * @since 1.7
+     * @hide 1.7
      */
     public Set<Character> getExtensionKeys() {
         return extensions.keySet();
@@ -1527,8 +1531,8 @@
      * locale extension can be fetched using {@link #getUnicodeLocaleAttributes()},
      * {@link #getUnicodeLocaleKeys()}  and {@link #getUnicodeLocaleType}.
      *
-     * @hide
      * @since 1.7
+     * @hide 1.7
      */
     public String getExtension(char extensionKey) {
         return extensions.get(extensionKey);
@@ -1540,8 +1544,8 @@
      * For more information about types and keywords, see {@link Builder#setUnicodeLocaleKeyword}
      * and <a href="http://www.unicode.org/reports/tr35/#BCP47">Unicode Technical Standard #35</a>
      *
-     * @hide
      * @since 1.7
+     * @hide 1.7
      */
     public String getUnicodeLocaleType(String keyWord) {
         return unicodeKeywords.get(keyWord);
@@ -1553,8 +1557,8 @@
      * For more information about attributes, see {@link Builder#addUnicodeLocaleAttribute}
      * and <a href="http://www.unicode.org/reports/tr35/#BCP47">Unicode Technical Standard #35</a>
      *
-     * @hide
      * @since 1.7
+     * @hide 1.7
      */
     public Set<String> getUnicodeLocaleAttributes() {
         return unicodeAttributes;
@@ -1566,8 +1570,8 @@
      * For more information about types and keywords, see {@link Builder#setUnicodeLocaleKeyword}
      * and <a href="http://www.unicode.org/reports/tr35/#BCP47">Unicode Technical Standard #35</a>
      *
-     * @hide
      * @since 1.7
+     * @hide 1.7
      */
     public Set<String> getUnicodeLocaleKeys() {
         return unicodeKeywords.keySet();
diff --git a/luni/src/main/java/java/util/concurrent/ConcurrentLinkedDeque.java b/luni/src/main/java/java/util/concurrent/ConcurrentLinkedDeque.java
index 54b53ae..b38d6a5 100644
--- a/luni/src/main/java/java/util/concurrent/ConcurrentLinkedDeque.java
+++ b/luni/src/main/java/java/util/concurrent/ConcurrentLinkedDeque.java
@@ -56,8 +56,6 @@
  * actions subsequent to the access or removal of that element from
  * the {@code ConcurrentLinkedDeque} in another thread.
  *
- * @hide
- *
  * @since 1.7
  * @author Doug Lea
  * @author Martin Buchholz
diff --git a/luni/src/main/java/java/util/concurrent/ForkJoinPool.java b/luni/src/main/java/java/util/concurrent/ForkJoinPool.java
index 5ac01c8..9448616 100644
--- a/luni/src/main/java/java/util/concurrent/ForkJoinPool.java
+++ b/luni/src/main/java/java/util/concurrent/ForkJoinPool.java
@@ -39,7 +39,7 @@
  * ForkJoinPool}s may also be appropriate for use with event-style
  * tasks that are never joined.
  *
- * <p>A static {@link #commonPool()} is available and appropriate for
+ * <p>A static {@code commonPool()} is available and appropriate for
  * most applications. The common pool is used by any ForkJoinTask that
  * is not explicitly submitted to a specified pool. Using the common
  * pool normally reduces resource usage (its threads are slowly
@@ -127,7 +127,6 @@
  * or internal resources have been exhausted.
  *
  * @since 1.7
- * @hide
  * @author Doug Lea
  */
 public class ForkJoinPool extends AbstractExecutorService {
@@ -213,8 +212,7 @@
      * choosing existing queues, and may be randomly repositioned upon
      * contention with other submitters.  In essence, submitters act
      * like workers except that they are restricted to executing local
-     * tasks that they submitted (or in the case of CountedCompleters,
-     * others with the same root task).  However, because most
+     * tasks that they submitted. However, because most
      * shared/external queue operations are more expensive than
      * internal, and because, at steady state, external submitters
      * will compete for CPU with workers, ForkJoinTask.join and
@@ -419,12 +417,6 @@
      * to find work (see MAX_HELP) and fall back to suspending the
      * worker and if necessary replacing it with another.
      *
-     * Helping actions for CountedCompleters are much simpler: Method
-     * helpComplete can take and execute any task with the same root
-     * as the task being waited on. However, this still entails some
-     * traversal of completer chains, so is less efficient than using
-     * CountedCompleters without explicit joins.
-     *
      * It is impossible to keep exactly the target parallelism number
      * of threads running at any given time.  Determining the
      * existence of conservatively safe helping targets, the
@@ -2907,7 +2899,7 @@
      * Possibly initiates an orderly shutdown in which previously
      * submitted tasks are executed, but no new tasks will be
      * accepted. Invocation has no effect on execution state if this
-     * is the {@link #commonPool()}, and no additional effect if
+     * is the {@code commonPool()}, and no additional effect if
      * already shut down.  Tasks that are in the process of being
      * submitted concurrently during the course of this method may or
      * may not be rejected.
@@ -2920,7 +2912,7 @@
     /**
      * Possibly attempts to cancel and/or stop all tasks, and reject
      * all subsequently submitted tasks.  Invocation has no effect on
-     * execution state if this is the {@link #commonPool()}, and no
+     * execution state if this is the {@code commonPool()}, and no
      * additional effect if already shut down. Otherwise, tasks that
      * are in the process of being submitted or executed concurrently
      * during the course of this method may or may not be
@@ -2979,8 +2971,8 @@
     /**
      * Blocks until all tasks have completed execution after a
      * shutdown request, or the timeout occurs, or the current thread
-     * is interrupted, whichever happens first. Because the {@link
-     * #commonPool()} never terminates until program shutdown, when
+     * is interrupted, whichever happens first. Because the {@code
+     * commonPool()} never terminates until program shutdown, when
      * applied to the common pool, this method is equivalent to {@link
      * #awaitQuiescence(long, TimeUnit)} but always returns {@code false}.
      *
@@ -3064,7 +3056,7 @@
 
     /**
      * Waits and/or attempts to assist performing tasks indefinitely
-     * until the {@link #commonPool()} {@link #isQuiescent}.
+     * until the {@code commonPool()} {@link #isQuiescent}.
      */
     static void quiesceCommonPool() {
         common.awaitQuiescence(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
diff --git a/luni/src/main/java/java/util/concurrent/ForkJoinTask.java b/luni/src/main/java/java/util/concurrent/ForkJoinTask.java
index 6d25775..c6bc6de 100644
--- a/luni/src/main/java/java/util/concurrent/ForkJoinTask.java
+++ b/luni/src/main/java/java/util/concurrent/ForkJoinTask.java
@@ -32,8 +32,8 @@
  *
  * <p>A "main" {@code ForkJoinTask} begins execution when it is
  * explicitly submitted to a {@link ForkJoinPool}, or, if not already
- * engaged in a ForkJoin computation, commenced in the {@link
- * ForkJoinPool#commonPool()} via {@link #fork}, {@link #invoke}, or
+ * engaged in a ForkJoin computation, commenced in the {@code
+ * ForkJoinPool.commonPool()} via {@link #fork}, {@link #invoke}, or
  * related methods.  Once started, it will usually in turn start other
  * subtasks.  As indicated by the name of this class, many programs
  * using {@code ForkJoinTask} employ only methods {@link #fork} and
@@ -74,10 +74,9 @@
  * but doing do requires three further considerations: (1) Completion
  * of few if any <em>other</em> tasks should be dependent on a task
  * that blocks on external synchronization or I/O. Event-style async
- * tasks that are never joined (for example, those subclassing {@link
- * CountedCompleter}) often fall into this category.  (2) To minimize
- * resource impact, tasks should be small; ideally performing only the
- * (possibly) blocking action. (3) Unless the {@link
+ * tasks that are never joined often fall into this category.
+ * (2) To minimize resource impact, tasks should be small; ideally
+ * performing only the (possibly) blocking action. (3) Unless the {@link
  * ForkJoinPool.ManagedBlocker} API is used, or the number of possibly
  * blocked tasks is known to be less than the pool's {@link
  * ForkJoinPool#getParallelism} level, the pool cannot guarantee that
@@ -120,13 +119,11 @@
  * <p>The ForkJoinTask class is not usually directly subclassed.
  * Instead, you subclass one of the abstract classes that support a
  * particular style of fork/join processing, typically {@link
- * RecursiveAction} for most computations that do not return results,
- * {@link RecursiveTask} for those that do, and {@link
- * CountedCompleter} for those in which completed actions trigger
- * other actions.  Normally, a concrete ForkJoinTask subclass declares
- * fields comprising its parameters, established in a constructor, and
- * then defines a {@code compute} method that somehow uses the control
- * methods supplied by this base class.
+ * RecursiveAction} for most computations that do not return results
+ * and {@link RecursiveTask} for those that do. Normally, a concrete
+ * ForkJoinTask subclass declares fields comprising its parameters,
+ * established in a constructor, and then defines a {@code compute}
+ * method that somehow uses the control methods supplied by this base class.
  *
  * <p>Method {@link #join} and its variants are appropriate for use
  * only when completion dependencies are acyclic; that is, the
@@ -138,9 +135,9 @@
  * may be of use in constructing custom subclasses for problems that
  * are not statically structured as DAGs. To support such usages, a
  * ForkJoinTask may be atomically <em>tagged</em> with a {@code short}
- * value using {@link #setForkJoinTaskTag} or {@link
- * #compareAndSetForkJoinTaskTag} and checked using {@link
- * #getForkJoinTaskTag}. The ForkJoinTask implementation does not use
+ * value using {@code setForkJoinTaskTag} or {@code
+ * compareAndSetForkJoinTaskTag} and checked using {@code
+ * getForkJoinTaskTag}. The ForkJoinTask implementation does not use
  * these {@code protected} methods or tags for any purpose, but they
  * may be of use in the construction of specialized subclasses.  For
  * example, parallel graph traversals can use the supplied methods to
@@ -178,7 +175,6 @@
  * execution. Serialization is not relied on during execution itself.
  *
  * @since 1.7
- * @hide
  * @author Doug Lea
  */
 public abstract class ForkJoinTask<V> implements Future<V>, Serializable {
@@ -645,8 +641,8 @@
 
     /**
      * Arranges to asynchronously execute this task in the pool the
-     * current task is running in, if applicable, or using the {@link
-     * ForkJoinPool#commonPool()} if not {@link #inForkJoinPool}.  While
+     * current task is running in, if applicable, or using the {@code
+     * ForkJoinPool.commonPool()} if not {@link #inForkJoinPool}.  While
      * it is not necessarily enforced, it is a usage error to fork a
      * task more than once unless it has completed and been
      * reinitialized.  Subsequent modifications to the state of this
diff --git a/luni/src/main/java/java/util/concurrent/ForkJoinWorkerThread.java b/luni/src/main/java/java/util/concurrent/ForkJoinWorkerThread.java
index 5f2799b..ae28700 100644
--- a/luni/src/main/java/java/util/concurrent/ForkJoinWorkerThread.java
+++ b/luni/src/main/java/java/util/concurrent/ForkJoinWorkerThread.java
@@ -18,7 +18,6 @@
  * {@linkplain ForkJoinPool#ForkJoinPool use it} in a {@code ForkJoinPool}.
  *
  * @since 1.7
- * @hide
  * @author Doug Lea
  */
 public class ForkJoinWorkerThread extends Thread {
diff --git a/luni/src/main/java/java/util/concurrent/LinkedTransferQueue.java b/luni/src/main/java/java/util/concurrent/LinkedTransferQueue.java
index cff5dbf..a041fb1 100644
--- a/luni/src/main/java/java/util/concurrent/LinkedTransferQueue.java
+++ b/luni/src/main/java/java/util/concurrent/LinkedTransferQueue.java
@@ -50,7 +50,6 @@
  * the {@code LinkedTransferQueue} in another thread.
  *
  * @since 1.7
- * @hide
  * @author Doug Lea
  * @param <E> the type of elements held in this collection
  */
diff --git a/luni/src/main/java/java/util/concurrent/Phaser.java b/luni/src/main/java/java/util/concurrent/Phaser.java
index a9adbe5..a97d187 100644
--- a/luni/src/main/java/java/util/concurrent/Phaser.java
+++ b/luni/src/main/java/java/util/concurrent/Phaser.java
@@ -227,7 +227,6 @@
  * of participants.
  *
  * @since 1.7
- * @hide
  * @author Doug Lea
  */
 public class Phaser {
diff --git a/luni/src/main/java/java/util/concurrent/RecursiveAction.java b/luni/src/main/java/java/util/concurrent/RecursiveAction.java
index 8d666f6..e3a6340 100644
--- a/luni/src/main/java/java/util/concurrent/RecursiveAction.java
+++ b/luni/src/main/java/java/util/concurrent/RecursiveAction.java
@@ -131,7 +131,6 @@
  * }}</pre>
  *
  * @since 1.7
- * @hide
  * @author Doug Lea
  */
 public abstract class RecursiveAction extends ForkJoinTask<Void> {
diff --git a/luni/src/main/java/java/util/concurrent/RecursiveTask.java b/luni/src/main/java/java/util/concurrent/RecursiveTask.java
index 421c9d3..80baa52 100644
--- a/luni/src/main/java/java/util/concurrent/RecursiveTask.java
+++ b/luni/src/main/java/java/util/concurrent/RecursiveTask.java
@@ -34,7 +34,6 @@
  * sequentially solve rather than subdividing.
  *
  * @since 1.7
- * @hide
  * @author Doug Lea
  */
 public abstract class RecursiveTask<V> extends ForkJoinTask<V> {
diff --git a/luni/src/main/java/java/util/concurrent/ScheduledThreadPoolExecutor.java b/luni/src/main/java/java/util/concurrent/ScheduledThreadPoolExecutor.java
index a52351b..483981d 100644
--- a/luni/src/main/java/java/util/concurrent/ScheduledThreadPoolExecutor.java
+++ b/luni/src/main/java/java/util/concurrent/ScheduledThreadPoolExecutor.java
@@ -690,7 +690,6 @@
      * @param value if {@code true}, remove on cancellation, else don't
      * @see #getRemoveOnCancelPolicy
      * @since 1.7
-     * @hide
      */
     public void setRemoveOnCancelPolicy(boolean value) {
         removeOnCancel = value;
@@ -705,7 +704,6 @@
      *         from the queue
      * @see #setRemoveOnCancelPolicy
      * @since 1.7
-     * @hide
      */
     public boolean getRemoveOnCancelPolicy() {
         return removeOnCancel;
diff --git a/luni/src/main/java/java/util/concurrent/ThreadLocalRandom.java b/luni/src/main/java/java/util/concurrent/ThreadLocalRandom.java
index a559321..5baf75f 100644
--- a/luni/src/main/java/java/util/concurrent/ThreadLocalRandom.java
+++ b/luni/src/main/java/java/util/concurrent/ThreadLocalRandom.java
@@ -30,7 +30,6 @@
  * generation methods.
  *
  * @since 1.7
- * @hide
  * @author Doug Lea
  */
 public class ThreadLocalRandom extends Random {
diff --git a/luni/src/main/java/java/util/concurrent/TransferQueue.java b/luni/src/main/java/java/util/concurrent/TransferQueue.java
index 9cd5773..4c2be6f 100644
--- a/luni/src/main/java/java/util/concurrent/TransferQueue.java
+++ b/luni/src/main/java/java/util/concurrent/TransferQueue.java
@@ -33,7 +33,6 @@
  * and {@code transfer} are effectively synonymous.
  *
  * @since 1.7
- * @hide
  * @author Doug Lea
  * @param <E> the type of elements held in this collection
  */
diff --git a/luni/src/main/java/java/util/concurrent/atomic/Fences.java b/luni/src/main/java/java/util/concurrent/atomic/Fences.java
index 7ecf45a..5714ba0 100644
--- a/luni/src/main/java/java/util/concurrent/atomic/Fences.java
+++ b/luni/src/main/java/java/util/concurrent/atomic/Fences.java
@@ -453,7 +453,6 @@
  *
  * </dl>
  *
- * @since 1.7
  * @hide
  * @author Doug Lea
  */
diff --git a/luni/src/main/java/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java b/luni/src/main/java/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java
index 4c5e280..37aa9d0 100644
--- a/luni/src/main/java/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java
+++ b/luni/src/main/java/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java
@@ -1255,7 +1255,6 @@
      *         current thread, and {@code false} if the current thread
      *         is at the head of the queue or the queue is empty
      * @since 1.7
-     * @hide
      */
     public final boolean hasQueuedPredecessors() {
         // The correctness of this depends on head being initialized
diff --git a/luni/src/main/java/java/util/concurrent/locks/AbstractQueuedSynchronizer.java b/luni/src/main/java/java/util/concurrent/locks/AbstractQueuedSynchronizer.java
index 0350060..e711da5 100644
--- a/luni/src/main/java/java/util/concurrent/locks/AbstractQueuedSynchronizer.java
+++ b/luni/src/main/java/java/util/concurrent/locks/AbstractQueuedSynchronizer.java
@@ -1485,7 +1485,6 @@
      *         current thread, and {@code false} if the current thread
      *         is at the head of the queue or the queue is empty
      * @since 1.7
-     * @hide
      */
     public final boolean hasQueuedPredecessors() {
         // The correctness of this depends on head being initialized
diff --git a/luni/src/main/java/java/util/jar/JarEntry.java b/luni/src/main/java/java/util/jar/JarEntry.java
index 85c8678..bceef63 100644
--- a/luni/src/main/java/java/util/jar/JarEntry.java
+++ b/luni/src/main/java/java/util/jar/JarEntry.java
@@ -17,16 +17,16 @@
 
 package java.util.jar;
 
-import javax.security.auth.x500.X500Principal;
 import java.io.IOException;
 import java.security.CodeSigner;
 import java.security.cert.CertPath;
+import java.security.cert.CertPathValidator;
 import java.security.cert.Certificate;
 import java.security.cert.CertificateException;
 import java.security.cert.CertificateFactory;
 import java.security.cert.X509Certificate;
 import java.util.ArrayList;
-import java.util.List;
+import java.util.Arrays;
 import java.util.zip.ZipEntry;
 
 /**
@@ -114,8 +114,12 @@
      * entry or {@code null} if none exists. Make sure that the everything is
      * read from the input stream before calling this method, or else the method
      * returns {@code null}.
+     * <p>
+     * This method returns all the signers' unverified chains concatenated
+     * together in one array. To know which certificates were tied to the
+     * private keys that made the signatures on this entry, see
+     * {@link #getCodeSigners()} instead.
      *
-     * @return the certificate for this entry.
      * @see java.security.cert.Certificate
      */
     public Certificate[] getCertificates() {
@@ -126,7 +130,27 @@
         if (jarVerifier == null) {
             return null;
         }
-        return jarVerifier.getCertificates(getName());
+
+        Certificate[][] certChains = jarVerifier.getCertificateChains(getName());
+        if (certChains == null) {
+            return null;
+        }
+
+        // Measure number of certs.
+        int count = 0;
+        for (Certificate[] chain : certChains) {
+            count += chain.length;
+        }
+
+        // Create new array and copy all the certs into it.
+        Certificate[] certs = new Certificate[count];
+        int i = 0;
+        for (Certificate[] chain : certChains) {
+            System.arraycopy(chain, 0, certs, i, chain.length);
+            i += chain.length;
+        }
+
+        return certs;
     }
 
     void setAttributes(Attributes attrib) {
@@ -138,68 +162,60 @@
      * JAR file. If there is no such code signer, it returns {@code null}. Make
      * sure that the everything is read from the input stream before calling
      * this method, or else the method returns {@code null}.
+     * <p>
+     * Only the digital signature on the entry is cryptographically verified.
+     * None of the certificates in the the {@link CertPath} returned from
+     * {@link CodeSigner#getSignerCertPath()} are verified and must be verified
+     * by the caller if needed. See {@link CertPathValidator} for more
+     * information.
      *
-     * @return the code signers for the JAR entry.
+     * @return an array of CodeSigner for this JAR entry.
      * @see CodeSigner
      */
     public CodeSigner[] getCodeSigners() {
+        if (parentJar == null) {
+            return null;
+        }
+
+        JarVerifier jarVerifier = parentJar.verifier;
+        if (jarVerifier == null) {
+            return null;
+        }
+
         if (signers == null) {
-            signers = getCodeSigners(getCertificates());
+            signers = getCodeSigners(jarVerifier.getCertificateChains(getName()));
         }
         if (signers == null) {
             return null;
         }
 
-        CodeSigner[] tmp = new CodeSigner[signers.length];
-        System.arraycopy(signers, 0, tmp, 0, tmp.length);
-        return tmp;
+        return signers.clone();
     }
 
-    private CodeSigner[] getCodeSigners(Certificate[] certs) {
-        if (certs == null) {
+    private CodeSigner[] getCodeSigners(Certificate[][] certChains) {
+        if (certChains == null) {
             return null;
         }
 
-        X500Principal prevIssuer = null;
-        ArrayList<Certificate> list = new ArrayList<Certificate>(certs.length);
-        ArrayList<CodeSigner> asigners = new ArrayList<CodeSigner>();
+        ArrayList<CodeSigner> asigners = new ArrayList<CodeSigner>(certChains.length);
 
-        for (Certificate element : certs) {
-            if (!(element instanceof X509Certificate)) {
-                // Only X509Certificate-s are taken into account - see API spec.
-                continue;
-            }
-            X509Certificate x509 = (X509Certificate) element;
-            if (prevIssuer != null) {
-                X500Principal subj = x509.getSubjectX500Principal();
-                if (!prevIssuer.equals(subj)) {
-                    // Ok, this ends the previous chain,
-                    // so transform this one into CertPath ...
-                    addCodeSigner(asigners, list);
-                    // ... and start a new one
-                    list.clear();
-                }// else { it's still the same chain }
-
-            }
-            prevIssuer = x509.getIssuerX500Principal();
-            list.add(x509);
-        }
-        if (!list.isEmpty()) {
-            addCodeSigner(asigners, list);
-        }
-        if (asigners.isEmpty()) {
-            // 'signers' is 'null' already
-            return null;
+        for (Certificate[] chain : certChains) {
+            addCodeSigner(asigners, chain);
         }
 
         CodeSigner[] tmp = new CodeSigner[asigners.size()];
         asigners.toArray(tmp);
         return tmp;
-
     }
 
-    private void addCodeSigner(ArrayList<CodeSigner> asigners,
-            List<Certificate> list) {
+    private void addCodeSigner(ArrayList<CodeSigner> asigners, Certificate[] certs) {
+        for (Certificate cert : certs) {
+            // Only X509Certificate instances are counted. See API spec.
+            if (!(cert instanceof X509Certificate)) {
+                return;
+            }
+        }
+
         CertPath certPath = null;
         if (!isFactoryChecked) {
             try {
@@ -214,7 +230,7 @@
             return;
         }
         try {
-            certPath = factory.generateCertPath(list);
+            certPath = factory.generateCertPath(Arrays.asList(certs));
         } catch (CertificateException ex) {
             // do nothing
         }
diff --git a/luni/src/main/java/java/util/jar/JarFile.java b/luni/src/main/java/java/util/jar/JarFile.java
index a089019..6b147f6 100644
--- a/luni/src/main/java/java/util/jar/JarFile.java
+++ b/luni/src/main/java/java/util/jar/JarFile.java
@@ -196,16 +196,6 @@
      *             If the file cannot be read.
      */
     public JarFile(File file, boolean verify, int mode) throws IOException {
-        this(file, verify, mode, false);
-    }
-
-    /**
-     * See previous constructor for other parameter definitions.
-     * @param chainCheck
-     *            whether or not to check certificate chain signatures
-     * @hide
-     */
-    public JarFile(File file, boolean verify, int mode, boolean chainCheck) throws IOException {
         super(file, mode);
 
         // Step 1: Scan the central directory for meta entries (MANIFEST.mf
@@ -225,7 +215,7 @@
             // We create the manifest straight away, so that we can create
             // the jar verifier as well.
             manifest = new Manifest(metaEntries.get(MANIFEST_NAME), true);
-            verifier = new JarVerifier(getName(), manifest, metaEntries, chainCheck);
+            verifier = new JarVerifier(getName(), manifest, metaEntries);
         } else {
             verifier = null;
             manifestBytes = metaEntries.get(MANIFEST_NAME);
@@ -257,17 +247,7 @@
      *             If file cannot be opened or read.
      */
     public JarFile(String filename, boolean verify) throws IOException {
-        this(filename, verify, false);
-    }
-
-    /**
-     * See previous constructor for other parameter definitions.
-     * @param chainCheck
-     *            whether or not to check certificate chain signatures
-     * @hide
-     */
-    public JarFile(String filename, boolean verify, boolean chainCheck) throws IOException {
-        this(new File(filename), verify, ZipFile.OPEN_READ, chainCheck);
+        this(new File(filename), verify, ZipFile.OPEN_READ);
     }
 
     /**
diff --git a/luni/src/main/java/java/util/jar/JarVerifier.java b/luni/src/main/java/java/util/jar/JarVerifier.java
index f78cbe8..467e298 100644
--- a/luni/src/main/java/java/util/jar/JarVerifier.java
+++ b/luni/src/main/java/java/util/jar/JarVerifier.java
@@ -27,7 +27,6 @@
 import java.security.NoSuchAlgorithmException;
 import java.security.cert.Certificate;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Hashtable;
 import java.util.Iterator;
@@ -72,11 +71,8 @@
     private final Hashtable<String, Certificate[]> certificates =
             new Hashtable<String, Certificate[]>(5);
 
-    private final Hashtable<String, Certificate[]> verifiedEntries =
-            new Hashtable<String, Certificate[]>();
-
-    /** Whether or not to check certificate chain signatures. */
-    private final boolean chainCheck;
+    private final Hashtable<String, Certificate[][]> verifiedEntries =
+            new Hashtable<String, Certificate[][]>();
 
     /**
      * Stores and a hash and a message digest and verifies that massage digest
@@ -90,16 +86,16 @@
 
         private final byte[] hash;
 
-        private final Certificate[] certificates;
+        private final Certificate[][] certChains;
 
-        private final Hashtable<String, Certificate[]> verifiedEntries;
+        private final Hashtable<String, Certificate[][]> verifiedEntries;
 
         VerifierEntry(String name, MessageDigest digest, byte[] hash,
-                Certificate[] certificates, Hashtable<String, Certificate[]> verifedEntries) {
+                Certificate[][] certChains, Hashtable<String, Certificate[][]> verifedEntries) {
             this.name = name;
             this.digest = digest;
             this.hash = hash;
-            this.certificates = certificates;
+            this.certChains = certChains;
             this.verifiedEntries = verifedEntries;
         }
 
@@ -135,7 +131,7 @@
             if (!MessageDigest.isEqual(d, Base64.decode(hash))) {
                 throw invalidDigest(JarFile.MANIFEST_NAME, name, name);
             }
-            verifiedEntries.put(name, certificates);
+            verifiedEntries.put(name, certChains);
         }
     }
 
@@ -150,27 +146,16 @@
     }
 
     /**
-     * Convenience constructor for backward compatibility.
-     */
-    JarVerifier(String name, Manifest manifest, HashMap<String, byte[]> metaEntries) {
-        this(name, manifest, metaEntries, false);
-    }
-
-    /**
      * Constructs and returns a new instance of {@code JarVerifier}.
      *
      * @param name
      *            the name of the JAR file being verified.
-     * @param chainCheck
-     *            whether to check the certificate chain signatures
      */
-    JarVerifier(String name, Manifest manifest, HashMap<String, byte[]> metaEntries,
-            boolean chainCheck) {
+    JarVerifier(String name, Manifest manifest, HashMap<String, byte[]> metaEntries) {
         jarName = name;
         this.manifest = manifest;
         this.metaEntries = metaEntries;
         this.mainAttributesEnd = manifest.getMainAttributesEnd();
-        this.chainCheck = chainCheck;
     }
 
     /**
@@ -199,7 +184,7 @@
             return null;
         }
 
-        ArrayList<Certificate> certs = new ArrayList<Certificate>();
+        ArrayList<Certificate[]> certChains = new ArrayList<Certificate[]>();
         Iterator<Map.Entry<String, HashMap<String, Attributes>>> it = signatures.entrySet().iterator();
         while (it.hasNext()) {
             Map.Entry<String, HashMap<String, Attributes>> entry = it.next();
@@ -209,16 +194,16 @@
                 String signatureFile = entry.getKey();
                 Certificate[] certChain = certificates.get(signatureFile);
                 if (certChain != null) {
-                    Collections.addAll(certs, certChain);
+                    certChains.add(certChain);
                 }
             }
         }
 
         // entry is not signed
-        if (certs.isEmpty()) {
+        if (certChains.isEmpty()) {
             return null;
         }
-        Certificate[] certificatesArray = certs.toArray(new Certificate[certs.size()]);
+        Certificate[][] certChainsArray = certChains.toArray(new Certificate[certChains.size()][]);
 
         for (int i = 0; i < DIGEST_ALGORITHMS.length; i++) {
             final String algorithm = DIGEST_ALGORITHMS[i];
@@ -230,9 +215,8 @@
 
             try {
                 return new VerifierEntry(name, MessageDigest.getInstance(algorithm), hashBytes,
-                        certificatesArray, verifiedEntries);
-            } catch (NoSuchAlgorithmException e) {
-                // ignored
+                        certChainsArray, verifiedEntries);
+            } catch (NoSuchAlgorithmException ignored) {
             }
         }
         return null;
@@ -309,15 +293,7 @@
         try {
             Certificate[] signerCertChain = JarUtils.verifySignature(
                     new ByteArrayInputStream(sfBytes),
-                    new ByteArrayInputStream(sBlockBytes),
-                    chainCheck);
-            /*
-             * Recursive call in loading security provider related class which
-             * is in a signed JAR.
-             */
-            if (metaEntries == null) {
-                return;
-            }
+                    new ByteArrayInputStream(sBlockBytes));
             if (signerCertChain != null) {
                 certificates.put(signatureFile, signerCertChain);
             }
@@ -418,20 +394,16 @@
     }
 
     /**
-     * Returns all of the {@link java.security.cert.Certificate} instances that
+     * Returns all of the {@link java.security.cert.Certificate} chains that
      * were used to verify the signature on the JAR entry called
-     * {@code name}.
+     * {@code name}. Callers must not modify the returned arrays.
      *
      * @param name
      *            the name of a JAR entry.
-     * @return an array of {@link java.security.cert.Certificate}.
+     * @return an array of {@link java.security.cert.Certificate} chains.
      */
-    Certificate[] getCertificates(String name) {
-        Certificate[] verifiedCerts = verifiedEntries.get(name);
-        if (verifiedCerts == null) {
-            return null;
-        }
-        return verifiedCerts.clone();
+    Certificate[][] getCertificateChains(String name) {
+        return verifiedEntries.get(name);
     }
 
     /**
diff --git a/luni/src/main/java/java/util/jar/StrictJarFile.java b/luni/src/main/java/java/util/jar/StrictJarFile.java
index 80b4fe9..4a8af5f 100644
--- a/luni/src/main/java/java/util/jar/StrictJarFile.java
+++ b/luni/src/main/java/java/util/jar/StrictJarFile.java
@@ -63,7 +63,7 @@
             // or manifests, so it's best to throw as early as possible.
             HashMap<String, byte[]> metaEntries = getMetaEntries();
             this.manifest = new Manifest(metaEntries.get(JarFile.MANIFEST_NAME), true);
-            this.verifier = new JarVerifier(fileName, manifest, metaEntries, true);
+            this.verifier = new JarVerifier(fileName, manifest, metaEntries);
 
             isSigned = verifier.readCertificates() && verifier.isSignedJar();
         } catch (IOException ioe) {
@@ -87,16 +87,51 @@
     }
 
     /**
-     * Return all certificates for a given {@link ZipEntry} belonging to this jar.
+     * Return all certificate chains for a given {@link ZipEntry} belonging to this jar.
      * This method MUST be called only after fully exhausting the InputStream belonging
      * to this entry.
      *
      * Returns {@code null} if this jar file isn't signed or if this method is
      * called before the stream is processed.
      */
+    public Certificate[][] getCertificateChains(ZipEntry ze) {
+        if (isSigned) {
+            return verifier.getCertificateChains(ze.getName());
+        }
+
+        return null;
+    }
+
+    /**
+     * Return all certificates for a given {@link ZipEntry} belonging to this jar.
+     * This method MUST be called only after fully exhausting the InputStream belonging
+     * to this entry.
+     *
+     * Returns {@code null} if this jar file isn't signed or if this method is
+     * called before the stream is processed.
+     *
+     * @deprecated Switch callers to use getCertificateChains instead
+     */
+    @Deprecated
     public Certificate[] getCertificates(ZipEntry ze) {
         if (isSigned) {
-            return verifier.getCertificates(ze.getName());
+            Certificate[][] certChains = verifier.getCertificateChains(ze.getName());
+
+            // Measure number of certs.
+            int count = 0;
+            for (Certificate[] chain : certChains) {
+                count += chain.length;
+            }
+
+            // Create new array and copy all the certs into it.
+            Certificate[] certs = new Certificate[count];
+            int i = 0;
+            for (Certificate[] chain : certChains) {
+                System.arraycopy(chain, 0, certs, i, chain.length);
+                i += chain.length;
+            }
+
+            return certs;
         }
 
         return null;
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/main/java/javax/net/ssl/SSLEngine.java b/luni/src/main/java/javax/net/ssl/SSLEngine.java
index d63ee94..d938642 100644
--- a/luni/src/main/java/javax/net/ssl/SSLEngine.java
+++ b/luni/src/main/java/javax/net/ssl/SSLEngine.java
@@ -783,7 +783,7 @@
      *
      * @return the SSL session for this engine instance.
      * @since 1.7
-     * @hide
+     * @hide 1.7
      */
     public SSLSession getHandshakeSession() {
         throw new UnsupportedOperationException();
diff --git a/luni/src/main/java/javax/net/ssl/SSLParameters.java b/luni/src/main/java/javax/net/ssl/SSLParameters.java
index b8fdc38..d049038 100644
--- a/luni/src/main/java/javax/net/ssl/SSLParameters.java
+++ b/luni/src/main/java/javax/net/ssl/SSLParameters.java
@@ -146,7 +146,7 @@
      *
      * @see #setEndpointIdentificationAlgorithm(String)
      * @since 1.7
-     * @hide
+     * @hide 1.7
      */
     public String getEndpointIdentificationAlgorithm() {
         return endpointIdentificationAlgorithm;
@@ -158,7 +158,7 @@
      *
      * @see #getEndpointIdentificationAlgorithm()
      * @since 1.7
-     * @hide
+     * @hide 1.7
      */
     public void setEndpointIdentificationAlgorithm(String endpointIdentificationAlgorithm) {
         this.endpointIdentificationAlgorithm = endpointIdentificationAlgorithm;
diff --git a/luni/src/main/java/javax/net/ssl/SSLSocket.java b/luni/src/main/java/javax/net/ssl/SSLSocket.java
index f681681..dd89e90 100644
--- a/luni/src/main/java/javax/net/ssl/SSLSocket.java
+++ b/luni/src/main/java/javax/net/ssl/SSLSocket.java
@@ -895,7 +895,7 @@
      *
      * @return the session object.
      * @since 1.7
-     * @hide
+     * @hide 1.7
      */
     public SSLSession getHandshakeSession() {
         throw new UnsupportedOperationException();
diff --git a/luni/src/main/java/javax/net/ssl/X509ExtendedTrustManager.java b/luni/src/main/java/javax/net/ssl/X509ExtendedTrustManager.java
index 8b398ce..61ab169 100644
--- a/luni/src/main/java/javax/net/ssl/X509ExtendedTrustManager.java
+++ b/luni/src/main/java/javax/net/ssl/X509ExtendedTrustManager.java
@@ -27,7 +27,7 @@
  *
  * @see SSLParameters#setEndpointIdentificationAlgorithm(String)
  * @since 1.7
- * @hide
+ * @hide 1.7
  */
 public abstract class X509ExtendedTrustManager implements X509TrustManager {
     /**
diff --git a/luni/src/main/java/libcore/io/ForwardingOs.java b/luni/src/main/java/libcore/io/ForwardingOs.java
index d09e442..bf4b448 100644
--- a/luni/src/main/java/libcore/io/ForwardingOs.java
+++ b/luni/src/main/java/libcore/io/ForwardingOs.java
@@ -52,6 +52,7 @@
 
     public FileDescriptor accept(FileDescriptor fd, InetSocketAddress peerAddress) throws ErrnoException, SocketException { return os.accept(fd, peerAddress); }
     public boolean access(String path, int mode) throws ErrnoException { return os.access(path, mode); }
+    public InetAddress[] android_getaddrinfo(String node, StructAddrinfo hints, int netId) throws GaiException { return os.android_getaddrinfo(node, hints, netId); }
     public void bind(FileDescriptor fd, InetAddress address, int port) throws ErrnoException, SocketException { os.bind(fd, address, port); }
     public void chmod(String path, int mode) throws ErrnoException { os.chmod(path, mode); }
     public void chown(String path, int uid, int gid) throws ErrnoException { os.chown(path, uid, gid); }
@@ -73,7 +74,6 @@
     public void fsync(FileDescriptor fd) throws ErrnoException { os.fsync(fd); }
     public void ftruncate(FileDescriptor fd, long length) throws ErrnoException { os.ftruncate(fd, length); }
     public String gai_strerror(int error) { return os.gai_strerror(error); }
-    public InetAddress[] getaddrinfo(String node, StructAddrinfo hints) throws GaiException { return os.getaddrinfo(node, hints); }
     public int getegid() { return os.getegid(); }
     public int geteuid() { return os.geteuid(); }
     public int getgid() { return os.getgid(); }
diff --git a/luni/src/main/java/libcore/io/Os.java b/luni/src/main/java/libcore/io/Os.java
index a537aeb..511bb27 100644
--- a/luni/src/main/java/libcore/io/Os.java
+++ b/luni/src/main/java/libcore/io/Os.java
@@ -43,6 +43,7 @@
 public interface Os {
     public FileDescriptor accept(FileDescriptor fd, InetSocketAddress peerAddress) throws ErrnoException, SocketException;
     public boolean access(String path, int mode) throws ErrnoException;
+    public InetAddress[] android_getaddrinfo(String node, StructAddrinfo hints, int netId) throws GaiException;
     public void bind(FileDescriptor fd, InetAddress address, int port) throws ErrnoException, SocketException;
     public void chmod(String path, int mode) throws ErrnoException;
     public void chown(String path, int uid, int gid) throws ErrnoException;
@@ -64,7 +65,6 @@
     public void fsync(FileDescriptor fd) throws ErrnoException;
     public void ftruncate(FileDescriptor fd, long length) throws ErrnoException;
     public String gai_strerror(int error);
-    public InetAddress[] getaddrinfo(String node, StructAddrinfo hints) throws GaiException;
     public int getegid();
     public int geteuid();
     public int getgid();
diff --git a/luni/src/main/java/libcore/io/Posix.java b/luni/src/main/java/libcore/io/Posix.java
index 7551190..f5eaaa3 100644
--- a/luni/src/main/java/libcore/io/Posix.java
+++ b/luni/src/main/java/libcore/io/Posix.java
@@ -46,6 +46,7 @@
 
     public native FileDescriptor accept(FileDescriptor fd, InetSocketAddress peerAddress) throws ErrnoException, SocketException;
     public native boolean access(String path, int mode) throws ErrnoException;
+    public native InetAddress[] android_getaddrinfo(String node, StructAddrinfo hints, int netId) throws GaiException;
     public native void bind(FileDescriptor fd, InetAddress address, int port) throws ErrnoException, SocketException;
     public native void chmod(String path, int mode) throws ErrnoException;
     public native void chown(String path, int uid, int gid) throws ErrnoException;
@@ -67,7 +68,6 @@
     public native void fsync(FileDescriptor fd) throws ErrnoException;
     public native void ftruncate(FileDescriptor fd, long length) throws ErrnoException;
     public native String gai_strerror(int error);
-    public native InetAddress[] getaddrinfo(String node, StructAddrinfo hints) throws GaiException;
     public native int getegid();
     public native int geteuid();
     public native int getgid();
diff --git a/luni/src/main/java/libcore/net/url/FileURLConnection.java b/luni/src/main/java/libcore/net/url/FileURLConnection.java
index 94fe1d6..43eaa7d 100644
--- a/luni/src/main/java/libcore/net/url/FileURLConnection.java
+++ b/luni/src/main/java/libcore/net/url/FileURLConnection.java
@@ -225,13 +225,8 @@
 
     /**
      * Returns the length of the file in bytes.
-     *
-     * @return the length of the file
-     * @since 1.7
-     * @hide Until ready for a public API change
      */
-    @Override
-    public long getContentLengthLong() {
+    private long getContentLengthLong() {
         try {
             if (!connected) {
                 connect();
diff --git a/luni/src/main/java/libcore/net/url/JarURLConnectionImpl.java b/luni/src/main/java/libcore/net/url/JarURLConnectionImpl.java
index e00bcab..b01a20a 100644
--- a/luni/src/main/java/libcore/net/url/JarURLConnectionImpl.java
+++ b/luni/src/main/java/libcore/net/url/JarURLConnectionImpl.java
@@ -265,25 +265,12 @@
      */
     @Override
     public int getContentLength() {
-        long length = getContentLengthLong();
-        return length > Integer.MAX_VALUE ? -1 : (int) length;
-    }
-
-    /**
-     * Returns the content length of the resource. Test cases reveal that if the URL is referring to
-     * a Jar file, this method answers a content-length returned by URLConnection. For a jar entry
-     * it should return the entry's size. Otherwise, it will return -1.
-     *
-     * @hide Until ready for a public API change
-     */
-    @Override
-    public long getContentLengthLong() {
         try {
             connect();
             if (jarEntry == null) {
-                return jarFileURLConnection.getContentLengthLong();
+                return jarFileURLConnection.getContentLength();
             }
-            return getJarEntry().getSize();
+            return (int) getJarEntry().getSize();
         } catch (IOException e) {
             // Ignored
         }
diff --git a/luni/src/main/java/org/apache/harmony/security/utils/JarUtils.java b/luni/src/main/java/org/apache/harmony/security/utils/JarUtils.java
index b9056353..d11c8dd 100644
--- a/luni/src/main/java/org/apache/harmony/security/utils/JarUtils.java
+++ b/luni/src/main/java/org/apache/harmony/security/utils/JarUtils.java
@@ -54,27 +54,18 @@
         new int[] {1, 2, 840, 113549, 1, 9, 4};
 
     /**
-     * @see #verifySignature(InputStream, InputStream, boolean)
-     */
-    public static Certificate[] verifySignature(InputStream signature, InputStream signatureBlock)
-            throws IOException, GeneralSecurityException {
-        return verifySignature(signature, signatureBlock, false);
-    }
-
-    /**
      * This method handle all the work with  PKCS7, ASN1 encoding, signature verifying,
      * and certification path building.
      * See also PKCS #7: Cryptographic Message Syntax Standard:
      * http://www.ietf.org/rfc/rfc2315.txt
      * @param signature - the input stream of signature file to be verified
      * @param signatureBlock - the input stream of corresponding signature block file
-     * @param chainCheck - whether to validate certificate chain signatures
      * @return array of certificates used to verify the signature file
      * @throws IOException - if some errors occurs during reading from the stream
      * @throws GeneralSecurityException - if signature verification process fails
      */
     public static Certificate[] verifySignature(InputStream signature, InputStream
-            signatureBlock, boolean chainCheck) throws IOException, GeneralSecurityException {
+            signatureBlock) throws IOException, GeneralSecurityException {
 
         BerInputStream bis = new BerInputStream(signatureBlock);
         ContentInfo info = (ContentInfo)ContentInfo.ASN1.decode(bis);
@@ -232,11 +223,11 @@
             throw new SecurityException("Incorrect signature");
         }
 
-        return createChain(certs[issuerSertIndex], certs, chainCheck);
+        return createChain(certs[issuerSertIndex], certs);
     }
 
     private static X509Certificate[] createChain(X509Certificate signer,
-            X509Certificate[] candidates, boolean chainCheck) {
+            X509Certificate[] candidates) {
         Principal issuer = signer.getIssuerDN();
 
         // Signer is self-signed
@@ -248,11 +239,10 @@
         chain.add(0, signer);
 
         X509Certificate issuerCert;
-        X509Certificate subjectCert = signer;
         int count = 1;
         while (true) {
-            issuerCert = findCert(issuer, candidates, subjectCert, chainCheck);
-            if( issuerCert == null) {
+            issuerCert = findCert(issuer, candidates);
+            if (issuerCert == null) {
                 break;
             }
             chain.add(issuerCert);
@@ -261,22 +251,13 @@
             if (issuerCert.getSubjectDN().equals(issuer)) {
                 break;
             }
-            subjectCert = issuerCert;
         }
         return chain.toArray(new X509Certificate[count]);
     }
 
-    private static X509Certificate findCert(Principal issuer, X509Certificate[] candidates,
-            X509Certificate subjectCert, boolean chainCheck) {
+    private static X509Certificate findCert(Principal issuer, X509Certificate[] candidates) {
         for (int i = 0; i < candidates.length; i++) {
             if (issuer.equals(candidates[i].getSubjectDN())) {
-                if (chainCheck) {
-                    try {
-                        subjectCert.verify(candidates[i].getPublicKey());
-                    } catch (Exception e) {
-                        continue;
-                    }
-                }
                 return candidates[i];
             }
         }
diff --git a/luni/src/main/native/Portability.h b/luni/src/main/native/Portability.h
index fb60ed4..1520311 100644
--- a/luni/src/main/native/Portability.h
+++ b/luni/src/main/native/Portability.h
@@ -65,7 +65,7 @@
 #include <sys/param.h>
 #include <sys/mount.h>
 
-#else
+#else  // defined(__APPLE__)
 
 // Bionic or glibc.
 
@@ -73,6 +73,15 @@
 #include <sys/sendfile.h>
 #include <sys/statvfs.h>
 
-#endif
+#endif  // defined(__APPLE__)
+
+#if !defined(__BIONIC__)
+#include <netdb.h>
+#include "../../bionic/libc/dns/include/resolv_netid.h"
+inline int android_getaddrinfofornet(const char *hostname, const char *servname,
+    const struct addrinfo *hints, unsigned /*netid*/, unsigned /*mark*/, struct addrinfo **res) {
+  return getaddrinfo(hostname, servname, hints, res);
+}
+#endif  // !defined(__BIONIC__)
 
 #endif  // PORTABILITY_H_included
diff --git a/luni/src/main/native/libcore_io_Posix.cpp b/luni/src/main/native/libcore_io_Posix.cpp
index 2592fe7..df31008 100644
--- a/luni/src/main/native/libcore_io_Posix.cpp
+++ b/luni/src/main/native/libcore_io_Posix.cpp
@@ -25,6 +25,7 @@
 #include "NetworkUtilities.h"
 #include "Portability.h"
 #include "readlink.h"
+#include "../../bionic/libc/dns/include/resolv_netid.h"  // For android_getaddrinfofornet.
 #include "ScopedBytes.h"
 #include "ScopedLocalRef.h"
 #include "ScopedPrimitiveArray.h"
@@ -661,7 +662,8 @@
     return env->NewStringUTF(gai_strerror(error));
 }
 
-static jobjectArray Posix_getaddrinfo(JNIEnv* env, jobject, jstring javaNode, jobject javaHints) {
+static jobjectArray Posix_android_getaddrinfo(JNIEnv* env, jobject, jstring javaNode,
+        jobject javaHints, jint netId) {
     ScopedUtfChars node(env, javaNode);
     if (node.c_str() == NULL) {
         return NULL;
@@ -681,10 +683,10 @@
 
     addrinfo* addressList = NULL;
     errno = 0;
-    int rc = getaddrinfo(node.c_str(), NULL, &hints, &addressList);
+    int rc = android_getaddrinfofornet(node.c_str(), NULL, &hints, netId, 0, &addressList);
     UniquePtr<addrinfo, addrinfo_deleter> addressListDeleter(addressList);
     if (rc != 0) {
-        throwGaiException(env, "getaddrinfo", rc);
+        throwGaiException(env, "android_getaddrinfo", rc);
         return NULL;
     }
 
@@ -694,7 +696,7 @@
         if (ai->ai_family == AF_INET || ai->ai_family == AF_INET6) {
             ++addressCount;
         } else {
-            ALOGE("getaddrinfo unexpected ai_family %i", ai->ai_family);
+            ALOGE("android_getaddrinfo unexpected ai_family %i", ai->ai_family);
         }
     }
     if (addressCount == 0) {
@@ -712,7 +714,7 @@
     for (addrinfo* ai = addressList; ai != NULL; ai = ai->ai_next) {
         if (ai->ai_family != AF_INET && ai->ai_family != AF_INET6) {
             // Unknown address family. Skip this address.
-            ALOGE("getaddrinfo unexpected ai_family %i", ai->ai_family);
+            ALOGE("android_getaddrinfo unexpected ai_family %i", ai->ai_family);
             continue;
         }
 
@@ -1537,6 +1539,7 @@
 static JNINativeMethod gMethods[] = {
     NATIVE_METHOD(Posix, accept, "(Ljava/io/FileDescriptor;Ljava/net/InetSocketAddress;)Ljava/io/FileDescriptor;"),
     NATIVE_METHOD(Posix, access, "(Ljava/lang/String;I)Z"),
+    NATIVE_METHOD(Posix, android_getaddrinfo, "(Ljava/lang/String;Landroid/system/StructAddrinfo;I)[Ljava/net/InetAddress;"),
     NATIVE_METHOD(Posix, bind, "(Ljava/io/FileDescriptor;Ljava/net/InetAddress;I)V"),
     NATIVE_METHOD(Posix, chmod, "(Ljava/lang/String;I)V"),
     NATIVE_METHOD(Posix, chown, "(Ljava/lang/String;II)V"),
@@ -1558,7 +1561,6 @@
     NATIVE_METHOD(Posix, fsync, "(Ljava/io/FileDescriptor;)V"),
     NATIVE_METHOD(Posix, ftruncate, "(Ljava/io/FileDescriptor;J)V"),
     NATIVE_METHOD(Posix, gai_strerror, "(I)Ljava/lang/String;"),
-    NATIVE_METHOD(Posix, getaddrinfo, "(Ljava/lang/String;Landroid/system/StructAddrinfo;)[Ljava/net/InetAddress;"),
     NATIVE_METHOD(Posix, getegid, "()I"),
     NATIVE_METHOD(Posix, geteuid, "()I"),
     NATIVE_METHOD(Posix, getgid, "()I"),
diff --git a/luni/src/test/java/com/android/org/bouncycastle/jce/provider/CertBlacklistTest.java b/luni/src/test/java/com/android/org/bouncycastle/jce/provider/CertBlacklistTest.java
index 6d033d3..1475a63 100644
--- a/luni/src/test/java/com/android/org/bouncycastle/jce/provider/CertBlacklistTest.java
+++ b/luni/src/test/java/com/android/org/bouncycastle/jce/provider/CertBlacklistTest.java
@@ -109,6 +109,24 @@
                     "3xQAyMuOHm72exJljYFqIsiNvGE0KufCqCuH1PD97IXMrLlwGmKKg5jP349lySBpJjm6RDqCTT+6" +
                     "dUl2jkVbeNmco99Y7AOdtLsOdXBMCo5x8lK8zwQWFrzEms0joHXCpWfGWA==";
 
+    public static final String ANSSI = "" +
+                    "MIIDbDCCAlSgAwIBAgIDAx2nMA0GCSqGSIb3DQEBBQUAMEsxCzAJBgNVBAYTAkZSMQ4wDAYDVQQK" +
+                    "EwVER1RQRTEsMCoGA1UEAxMjQUMgREdUUEUgU2lnbmF0dXJlIEF1dGhlbnRpZmljYXRpb24wHhcN" +
+                    "MTMwNzE4MTAwNTI4WhcNMTQwNzE4MTAwNTI4WjA+MQswCQYDVQQGEwJGUjETMBEGA1UECgwKREcg" +
+                    "VHLDqXNvcjEaMBgGA1UEAwwRQUMgREcgVHLDqXNvciBTU0wwggEiMA0GCSqGSIb3DQEBAQUAA4IB" +
+                    "DwAwggEKAoIBAQDI0WFSUyY+MmtFkqFjTefoFyDgh9b1C/2YvSIvT8oCH62JWT5rpeTCZwaXbqWc" +
+                    "jaNfzggqaFsokqfhBif43HNHNtNJmvKE32VcuLB0SpsLR/1VeTd9F99C1JeHVa+nelumOHEfouX8" +
+                    "rRFrxNXNIYTVeiENT8Y2YqRb/XAril9g7i674uFzLiNR/t/N/F8Exujv9U8m8rmgud/+tG9WDRaD" +
+                    "Jwoj3ZFCOnL5qLnSUEcS6TzWpozLmC2JVO5GZKGGd7qC9FjdBkVilkbVIEGSrYvz2Uz2v5IGqMBI" +
+                    "QaFL/kSYWxGTaedTOk2drFEApp9AEPTfv1NwCWBfegsGQrHUROM3AgMBAAGjZjBkMBIGA1UdEwEB" +
+                    "/wQIMAYBAf8CAQQwHQYDVR0OBBYEFAAMW8lJqJW0DtAv5p3Mjogxvh9lMB8GA1UdIwQYMBaAFOnb" +
+                    "kI/9W5nkFTvwYlyn5A1Y6IeZMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAtDfG" +
+                    "HkHOLW2d9fiMtwtkEwDauISJLJyCjoRmawzmQbIZXq7HaLliVfE0sdfKUm0iQ0im1/CpnJLPoTeK" +
+                    "yBHvNu1ubLc2m+9dabAYhF3pVdKC+gNaAzBXZ9Gt0p1CLk1lf8Hg+R10HN2IPCv7V/crz2Ga+c23" +
+                    "4P3pfwYW8+Nd7alGCuvqot6UYXOlheF7zWUkHn6z6tvY+9oMDHKSUAthhA/FB50JgJU89zyTv1eg" +
+                    "Y3ldKwvYBW3W3yNZdTHbPyNsPJdhqA55mDNsteE5YTp1PyySDb1MSVrbxDEruoH6ZE99Hob4Ih8A" +
+                    "mn7MHZatGClECgjXWFZ2Gxa7OUCaQpcH8g==";
+
     public CertBlacklistTest() throws IOException {
         tmpFile = File.createTempFile("test", "");
         DEFAULT_PUBKEYS = getDefaultPubkeys();
@@ -415,6 +433,20 @@
         assertEquals(bl.isPublicKeyBlackListed(pk), true);
     }
 
+    public void testANSSISerialBlacklist() throws Exception {
+        CertBlacklist bl = new CertBlacklist();
+        assertEquals(bl.isSerialNumberBlackListed(createSerialNumber(ANSSI)), true);
+    }
+
+    public void testANSSIIntermediatePubkeyBlacklist() throws Exception {
+        // build the public key
+        PublicKey pk = createPublicKey(ANSSI);
+        // set our blacklist path
+        CertBlacklist bl = new CertBlacklist();
+        // check to make sure it isn't blacklisted
+        assertEquals(bl.isPublicKeyBlackListed(pk), true);
+    }
+
     private static void printHash(String cert) throws Exception {
         System.out.println("CERTIFICATE PUBLIC KEY HASH: " + getHash(createPublicKey(cert)));
     }
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/security/KeyPairGeneratorTest.java b/luni/src/test/java/libcore/java/security/KeyPairGeneratorTest.java
index 09a18e2..55e088f 100644
--- a/luni/src/test/java/libcore/java/security/KeyPairGeneratorTest.java
+++ b/luni/src/test/java/libcore/java/security/KeyPairGeneratorTest.java
@@ -54,63 +54,28 @@
 public class KeyPairGeneratorTest extends TestCase {
 
     public void test_providerCount() {
-        Provider[] providers = Security.getProviders();
-        // We expect there to be at least one provider.
-        assertTrue(providers.length > 0);
-        // If this fails remember to add _provider methods below. This test is sharded because it
-        // takes a long time to execute.
-        assertTrue(providers.length < 10);
+        // If this fails remember to add/remove _provider methods below. This test is sharded
+        // because it takes so long.
+        assertEquals(4, Security.getProviders().length);
     }
 
     public void test_getInstance_provider0() throws Exception {
-        test_getInstance(0);
+        test_getInstance(Security.getProviders()[0]);
     }
 
     public void test_getInstance_provider1() throws Exception {
-        test_getInstance(1);
+        test_getInstance(Security.getProviders()[1]);
     }
 
     public void test_getInstance_provider2() throws Exception {
-        test_getInstance(2);
+        test_getInstance(Security.getProviders()[2]);
     }
 
     public void test_getInstance_provider3() throws Exception {
-        test_getInstance(3);
+        test_getInstance(Security.getProviders()[3]);
     }
 
-    public void test_getInstance_provider4() throws Exception {
-        test_getInstance(4);
-    }
-
-    public void test_getInstance_provider5() throws Exception {
-        test_getInstance(5);
-    }
-
-    public void test_getInstance_provider6() throws Exception {
-        test_getInstance(6);
-    }
-
-    public void test_getInstance_provider7() throws Exception {
-        test_getInstance(7);
-    }
-
-    public void test_getInstance_provider8() throws Exception {
-        test_getInstance(8);
-    }
-
-    public void test_getInstance_provider9() throws Exception {
-        test_getInstance(9);
-    }
-
-    private void test_getInstance(int providerIndex) throws Exception {
-        Provider[] providers = Security.getProviders();
-        if (providerIndex >= providers.length) {
-            // Providers can be added by vendors and other tests. We do not
-            // specify a fixed number and silenty pass if the provider at the
-            // specified index does not exist.
-            return;
-        }
-        Provider provider = providers[providerIndex];
+    private void test_getInstance(Provider provider) throws Exception {
         Set<Provider.Service> services = provider.getServices();
         for (Provider.Service service : services) {
             String type = service.getType();
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/jar/StrictJarFileTest.java b/luni/src/test/java/libcore/java/util/jar/StrictJarFileTest.java
index 0b194f5..e5a6cd8 100644
--- a/luni/src/test/java/libcore/java/util/jar/StrictJarFileTest.java
+++ b/luni/src/test/java/libcore/java/util/jar/StrictJarFileTest.java
@@ -122,6 +122,7 @@
             jarFile.getInputStream(zipEntry).skip(Long.MAX_VALUE);
             if ("Test.class".equals(zipEntry.getName())) {
                 assertNotNull(jarFile.getCertificates(zipEntry));
+                assertNotNull(jarFile.getCertificateChains(zipEntry));
             }
         }
     }
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();
-    }
 }
diff --git a/luni/src/test/java/org/apache/harmony/luni/tests/java/net/URLConnectionTest.java b/luni/src/test/java/org/apache/harmony/luni/tests/java/net/URLConnectionTest.java
index d3da174..d52b033 100644
--- a/luni/src/test/java/org/apache/harmony/luni/tests/java/net/URLConnectionTest.java
+++ b/luni/src/test/java/org/apache/harmony/luni/tests/java/net/URLConnectionTest.java
@@ -484,20 +484,6 @@
         fileURLCon.getInputStream().close();
     }
 
-    /**
-     * {@link java.net.URLConnection#getContentLengthLong()}
-     */
-    public void test_getContentLengthLong() throws Exception {
-        assertEquals(testString.getBytes().length, fileURLCon.getContentLengthLong());
-        assertEquals(Support_TestWebData.test1.length, uc.getContentLengthLong());
-        assertEquals(Support_TestWebData.test2.length, uc2.getContentLengthLong());
-
-        assertTrue(jarURLCon.getContentLength() > 0);
-        assertTrue(gifURLCon.getContentLength() > 0);
-
-        fileURLCon.getInputStream().close();
-    }
-
     public void test_getContentType() throws Exception {
         assertTrue("getContentType failed: " + fileURLCon.getContentType(),
                 fileURLCon.getContentType().contains("text/plain"));
@@ -772,39 +758,6 @@
     }
 
     /**
-     * {@link java.net.URLConnection#getHeaderFieldLong(String, long)}
-     */
-    public void test_getHeaderFieldLong() throws IOException, ParseException {
-        // Test getHeaderFieldLong() can read an int value.
-        Support_TestWebData params0 = Support_TestWebData.testParams[0];
-        long hf = uc.getHeaderFieldLong("Content-Length", Long.MIN_VALUE);
-        assertEquals(params0.testLength, hf);
-
-        // Test getHeaderFieldLong() for a value outside of the range of int.
-        Support_TestWebData params2 = Support_TestWebData.testParams[2];
-        hf = uc3.getHeaderFieldLong("Content-Length", Long.MIN_VALUE);
-        assertEquals(params2.testLength, hf);
-
-        // The remaining fields should be invalid or missing. Confirm the default is returned.
-        hf = uc3.getHeaderFieldLong("Content-Encoding", Long.MIN_VALUE);
-        assertEquals(Long.MIN_VALUE, hf);
-        hf = uc3.getHeaderFieldInt("Content-Type", Integer.MIN_VALUE);
-        assertEquals(Integer.MIN_VALUE, hf);
-        hf = uc3.getHeaderFieldInt("Date", Integer.MIN_VALUE);
-        assertEquals(Integer.MIN_VALUE, hf);
-        hf = uc3.getHeaderFieldInt("Expires", Integer.MIN_VALUE);
-        assertEquals(Integer.MIN_VALUE, hf);
-        hf = uc3.getHeaderFieldInt("SERVER", Integer.MIN_VALUE);
-        assertEquals(Integer.MIN_VALUE, hf);
-        hf = uc3.getHeaderFieldInt("Last-Modified", Integer.MIN_VALUE);
-        assertEquals(Integer.MIN_VALUE, hf);
-        hf = uc3.getHeaderFieldInt("accept-ranges", Integer.MIN_VALUE);
-        assertEquals(Integer.MIN_VALUE, hf);
-        hf = uc3.getHeaderFieldInt("DoesNotExist", Integer.MIN_VALUE);
-        assertEquals(Integer.MIN_VALUE, hf);
-    }
-
-    /**
      * {@link java.net.URLConnection#getHeaderField(java.lang.String)}
      */
     public void test_getHeaderFieldLjava_lang_String() {
diff --git a/support/src/test/java/tests/resources/hyts_signed_ambiguousSignerArray.jar b/support/src/test/java/tests/resources/hyts_signed_ambiguousSignerArray.jar
new file mode 100644
index 0000000..7da4b59
--- /dev/null
+++ b/support/src/test/java/tests/resources/hyts_signed_ambiguousSignerArray.jar
Binary files differ