Use OpenJdk implementation of java.net.*

- Add FileURLConnection.
- NetworkUtilities : Update field names in JNI.
- Suppress a few libcore tests that rely on internal implementation
  details.
- Remove code that loads the net library (not needed on android).
- DatagramSocket : Add setNetworkInterface method.
- HttpCookie : make parse & field public
- Inet4Address / Inet6Address : Add getAddressInternal.
- InetAddress : Add methods required by frameworks/base, particularly
  those required to deal with net-ids and scope ids.
- URI : Add UriCodec static members for AUTHORITY_ENCODER and friends.
- URL : Add toUriLenient
- URLStreamHandler : Add a toExternalForm variant that optionally
  escapes illegal chars.
- Inet4AddressImpl.c : Unconditionally define HAS_GLIBC_GETHOSTBY_R

Change-Id: Ic51f863941f5d954ed6cf86309cc610e711d54bd
diff --git a/luni/src/main/java/java/net/InetUnixAddress.java b/luni/src/main/java/java/net/InetUnixAddress.java
index 51236e2..9f777d1 100644
--- a/luni/src/main/java/java/net/InetUnixAddress.java
+++ b/luni/src/main/java/java/net/InetUnixAddress.java
@@ -25,6 +25,7 @@
  * @hide
  */
 public final class InetUnixAddress extends InetAddress {
+  private byte[] address;
   /**
    * Constructs an AF_UNIX InetAddress for the given path.
    */
@@ -36,13 +37,30 @@
    * Constructs an AF_UNIX InetAddress for the given path.
    */
   public InetUnixAddress(byte[] path) {
-    super(AF_UNIX, path, null);
+    super();
+    holder().hostName = null;
+    holder().family = AF_UNIX;
+    address = path.clone();
   }
 
   /**
    * Returns a string form of this InetAddress.
    */
   @Override public String toString() {
-    return "InetUnixAddress[" + new String(ipaddress, StandardCharsets.UTF_8) + "]";
+    return "InetUnixAddress[" + new String(address, StandardCharsets.UTF_8) + "]";
+  }
+
+  @Override
+  public byte[] getAddress() {
+      return address.clone();
+  }
+
+  public byte[] getAddressInternal() {
+      return address;
+  }
+
+  @Override
+  public String getHostAddress() {
+      return new String(address, StandardCharsets.UTF_8);
   }
 }
diff --git a/luni/src/main/native/NetworkUtilities.cpp b/luni/src/main/native/NetworkUtilities.cpp
index 7215306..ee52fd6 100644
--- a/luni/src/main/native/NetworkUtilities.cpp
+++ b/luni/src/main/native/NetworkUtilities.cpp
@@ -109,9 +109,12 @@
         return false;
     }
 
+    // Get holder.
+    static jfieldID holderFid = env->GetFieldID(JniConstants::inetAddressClass, "holder", "Ljava/net/InetAddress$InetAddressHolder;");
+    ScopedLocalRef<jobject> holder(env, env->GetObjectField(inetAddress, holderFid));
     // Get the address family.
-    static jfieldID familyFid = env->GetFieldID(JniConstants::inetAddressClass, "family", "I");
-    ss.ss_family = env->GetIntField(inetAddress, familyFid);
+    static jfieldID familyFid = env->GetFieldID(JniConstants::inetAddressHolderClass, "family", "I");
+    ss.ss_family = env->GetIntField(holder.get(), familyFid);
     if (ss.ss_family == AF_UNSPEC) {
         sa_len = sizeof(ss.ss_family);
         return true; // Job done!
@@ -125,8 +128,8 @@
     }
 
     // Get the byte array that stores the IP address bytes in the InetAddress.
-    static jfieldID bytesFid = env->GetFieldID(JniConstants::inetAddressClass, "ipaddress", "[B");
-    ScopedLocalRef<jbyteArray> addressBytes(env, reinterpret_cast<jbyteArray>(env->GetObjectField(inetAddress, bytesFid)));
+    static jmethodID bytesMid = env->GetMethodID(JniConstants::inetAddressClass, "getAddressInternal", "()[B");
+    ScopedLocalRef<jbyteArray> addressBytes(env, reinterpret_cast<jbyteArray>(env->CallObjectMethod(inetAddress, bytesMid)));
     if (addressBytes.get() == NULL) {
         jniThrowNullPointerException(env, NULL);
         return false;
diff --git a/luni/src/test/java/libcore/io/OsTest.java b/luni/src/test/java/libcore/io/OsTest.java
index a0d1e5a..8ed15ba 100644
--- a/luni/src/test/java/libcore/io/OsTest.java
+++ b/luni/src/test/java/libcore/io/OsTest.java
@@ -40,7 +40,7 @@
     fis.close();
 
     ServerSocket s = new ServerSocket();
-    assertTrue(S_ISSOCK(Libcore.os.fstat(s.getImpl$().getFD$()).st_mode));
+    assertTrue(S_ISSOCK(Libcore.os.fstat(s.getImpl().getFileDescriptor()).st_mode));
     s.close();
   }
 
diff --git a/luni/src/test/java/libcore/java/io/FileDescriptorTest.java b/luni/src/test/java/libcore/java/io/FileDescriptorTest.java
index 39472df..d035957 100644
--- a/luni/src/test/java/libcore/java/io/FileDescriptorTest.java
+++ b/luni/src/test/java/libcore/java/io/FileDescriptorTest.java
@@ -37,7 +37,8 @@
     fis.close();
 
     ServerSocket s = new ServerSocket();
-    assertTrue(s.getImpl$().getFD$().isSocket());
+    // assertTrue(s.getImpl$().getFD$().isSocket());
+    assertTrue(false); // FIXME(haaawk): uncomment code above and remove this one
     s.close();
   }
 }
diff --git a/luni/src/test/java/libcore/java/net/NetworkInterfaceTest.java b/luni/src/test/java/libcore/java/net/NetworkInterfaceTest.java
index 116eb3f..ef3a228 100644
--- a/luni/src/test/java/libcore/java/net/NetworkInterfaceTest.java
+++ b/luni/src/test/java/libcore/java/net/NetworkInterfaceTest.java
@@ -45,6 +45,7 @@
         assertEquals(expected, actual);
     }
 
+    /*
     // http://code.google.com/p/android/issues/detail?id=34022
     public void test_collectIpv6Addresses_3digitInterfaceIndex() throws Exception {
         String lines[] = new String[] {
@@ -72,7 +73,7 @@
                 ifAddresses, lines);
         assertEquals(1, addresses.size());
         assertEquals(1, ifAddresses.size());
-    }
+    }*/
 
     public void testInterfaceProperties() throws Exception {
         for (NetworkInterface nif : Collections.list(NetworkInterface.getNetworkInterfaces())) {
diff --git a/luni/src/test/java/libcore/javax/net/ssl/DefaultHostnameVerifierTest.java b/luni/src/test/java/libcore/javax/net/ssl/DefaultHostnameVerifierTest.java
index feecebe..688b44b 100644
--- a/luni/src/test/java/libcore/javax/net/ssl/DefaultHostnameVerifierTest.java
+++ b/luni/src/test/java/libcore/javax/net/ssl/DefaultHostnameVerifierTest.java
@@ -30,12 +30,12 @@
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Set;
-import javax.net.ssl.DefaultHostnameVerifier;
+//import javax.net.ssl.DefaultHostnameVerifier;
 import javax.security.auth.x500.X500Principal;
 import junit.framework.TestCase;
 
 public final class DefaultHostnameVerifierTest extends TestCase {
-    private static final int ALT_UNKNOWN = 0;
+/*    private static final int ALT_UNKNOWN = 0;
     private static final int ALT_DNS_NAME = 2;
     private static final int ALT_IPA_NAME = 7;
 
@@ -45,13 +45,13 @@
         assertTrue(verifier.verify("imap.g.com", new StubX509Certificate("cn=imap.g.com")));
         assertFalse(verifier.verify("imap.g.com", new StubX509Certificate("cn=imap2.g.com")));
         assertFalse(verifier.verify("imap.g.com", new StubX509Certificate("cn=sub.imap.g.com")));
-    }
+    }*/
 
     /**
      * If a subjectAltName extension of type ALT_DNS_NAME is present, that MUST
      * be used as the identity and the CN should be ignored.
      */
-    public void testSubjectAltNameAndCn() {
+/*    public void testSubjectAltNameAndCn() {
         assertFalse(verifier.verify("imap.g.com", new StubX509Certificate("")
                 .addSubjectAlternativeName(ALT_DNS_NAME, "a.y.com")));
         assertFalse(verifier.verify("imap.g.com", new StubX509Certificate("cn=imap.g.com")
@@ -439,5 +439,5 @@
         @Override public boolean hasUnsupportedCriticalExtension() {
             throw new UnsupportedOperationException();
         }
-    }
+    }*/
 }
diff --git a/ojluni/src/main/java/java/io/InterruptedIOException.java b/ojluni/src/main/java/java/io/InterruptedIOException.java
index c83832a..a68e12a 100755
--- a/ojluni/src/main/java/java/io/InterruptedIOException.java
+++ b/ojluni/src/main/java/java/io/InterruptedIOException.java
@@ -72,6 +72,12 @@
      */
     public int bytesTransferred = 0;
 
+    /* @hide */
+    // Android-added.
+    public InterruptedIOException(Throwable cause) {
+        super(cause);
+    }
+
     /**
      * Constructs a new instance with given detail message and cause.
      *
diff --git a/ojluni/src/main/java/java/net/AbstractPlainDatagramSocketImpl.java b/ojluni/src/main/java/java/net/AbstractPlainDatagramSocketImpl.java
index b7f0f2f..57394f4 100755
--- a/ojluni/src/main/java/java/net/AbstractPlainDatagramSocketImpl.java
+++ b/ojluni/src/main/java/java/net/AbstractPlainDatagramSocketImpl.java
@@ -65,14 +65,6 @@
     private final static boolean connectDisabled = os.contains("OS X");
 
     /**
-     * Load net library into runtime.
-     */
-    static {
-        java.security.AccessController.doPrivileged(
-                  new sun.security.action.LoadLibraryAction("net"));
-    }
-
-    /**
      * Creates a datagram socket
      */
     protected synchronized void create() throws SocketException {
diff --git a/ojluni/src/main/java/java/net/AbstractPlainSocketImpl.java b/ojluni/src/main/java/java/net/AbstractPlainSocketImpl.java
index c6a38ad..2ad70b5 100755
--- a/ojluni/src/main/java/java/net/AbstractPlainSocketImpl.java
+++ b/ojluni/src/main/java/java/net/AbstractPlainSocketImpl.java
@@ -74,14 +74,6 @@
     protected boolean stream;
 
     /**
-     * Load net library into runtime.
-     */
-    static {
-        java.security.AccessController.doPrivileged(
-                  new sun.security.action.LoadLibraryAction("net"));
-    }
-
-    /**
      * Creates a socket with a boolean that specifies whether this
      * is a stream socket (true) or an unconnected UDP socket (false).
      */
diff --git a/ojluni/src/main/java/java/net/BindException.java b/ojluni/src/main/java/java/net/BindException.java
index f893909..b792013 100755
--- a/ojluni/src/main/java/java/net/BindException.java
+++ b/ojluni/src/main/java/java/net/BindException.java
@@ -51,4 +51,9 @@
      * Construct a new BindException with no detailed message.
      */
     public BindException() {}
+
+    /* @hide */
+    public BindException(String msg, Throwable cause) {
+        super(msg, cause);
+    }
 }
diff --git a/ojluni/src/main/java/java/net/ConnectException.java b/ojluni/src/main/java/java/net/ConnectException.java
index 7e41220..47e77fe 100755
--- a/ojluni/src/main/java/java/net/ConnectException.java
+++ b/ojluni/src/main/java/java/net/ConnectException.java
@@ -51,4 +51,9 @@
      * Construct a new ConnectException with no detailed message.
      */
     public ConnectException() {}
+
+    /* @hide */
+    public ConnectException(String msg, Throwable cause) {
+        super(msg, cause);
+    }
 }
diff --git a/ojluni/src/main/java/java/net/DatagramPacket.java b/ojluni/src/main/java/java/net/DatagramPacket.java
index 195ee86..a69d383 100755
--- a/ojluni/src/main/java/java/net/DatagramPacket.java
+++ b/ojluni/src/main/java/java/net/DatagramPacket.java
@@ -46,8 +46,6 @@
      * Perform class initialization
      */
     static {
-        java.security.AccessController.doPrivileged(
-                  new sun.security.action.LoadLibraryAction("net"));
         init();
     }
 
@@ -280,6 +278,16 @@
         address = iaddr;
     }
 
+    // ----- BEGIN android -----
+    /**
+     * Sets 'length' without changing 'userSuppliedLength', after receiving a packet.
+     * @hide for IoBridge
+     */
+    public void setReceivedLength(int length) {
+        this.length = length;
+    }
+    // ----- END android -----
+
     /**
      * Sets the port number on the remote host to which this datagram
      * is being sent.
diff --git a/ojluni/src/main/java/java/net/DatagramSocket.java b/ojluni/src/main/java/java/net/DatagramSocket.java
index 62493a8..72d8937 100755
--- a/ojluni/src/main/java/java/net/DatagramSocket.java
+++ b/ojluni/src/main/java/java/net/DatagramSocket.java
@@ -31,6 +31,9 @@
 import java.nio.channels.DatagramChannel;
 import java.security.AccessController;
 import java.security.PrivilegedExceptionAction;
+import android.system.ErrnoException;
+import libcore.io.Libcore;
+import static android.system.OsConstants.*;
 
 /**
  * This class represents a socket for sending and receiving datagram packets.
@@ -1265,4 +1268,29 @@
         }
         factory = fac;
     }
+
+    /* @hide */
+    public final FileDescriptor getFileDescriptor$() {
+        return impl.fd;
+    }
+
+    /**
+     * Sets the network interface used by this socket.  Any packets sent
+     * via this socket are transmitted via the specified interface.  Any
+     * packets received by this socket will come from the specified
+     * interface.  Broadcast datagrams received on this interface will
+     * be processed by this socket. This corresponds to Linux's SO_BINDTODEVICE.
+     *
+     * @hide used by GoogleTV for DHCP
+     */
+    public void setNetworkInterface(NetworkInterface netInterface) throws SocketException {
+        if (netInterface == null) {
+            throw new NullPointerException("netInterface == null");
+        }
+        try {
+            Libcore.os.setsockoptIfreq(impl.fd, SOL_SOCKET, SO_BINDTODEVICE, netInterface.getName());
+        } catch (ErrnoException errnoException) {
+            throw errnoException.rethrowAsSocketException();
+        }
+    }
 }
diff --git a/ojluni/src/main/java/java/net/HttpCookie.java b/ojluni/src/main/java/java/net/HttpCookie.java
index a1a3e8e..e7e605f 100755
--- a/ojluni/src/main/java/java/net/HttpCookie.java
+++ b/ojluni/src/main/java/java/net/HttpCookie.java
@@ -82,9 +82,13 @@
     private boolean httpOnly;   // HttpOnly ... i.e. not accessible to scripts
     private int version = 1;    // Version=1 ... RFC 2965 style
 
-    // The original header this cookie was consructed from, if it was
-    // constructed by parsing a header, otherwise null.
-    private final String header;
+    /**
+     * The original header this cookie was consructed from, if it was
+     * constructed by parsing a header, otherwise null.
+     *
+     * @hide
+     */
+    public final String header;
 
     //
     // Hold the creation time (in seconds) of the http cookie for later
@@ -199,8 +203,10 @@
     // create the cookie, in the cookie itself. This can be useful for filtering
     // Set-Cookie[2] headers, using the internal parsing logic defined in this
     // class.
-    private static List<HttpCookie> parse(String header, boolean retainHeader) {
-
+    /*
+     * @hide
+     */
+    public static List<HttpCookie> parse(String header, boolean retainHeader) {
         int version = guessCookieVersion(header);
 
         // if header start with set-cookie or set-cookie2, strip it off
@@ -1068,20 +1074,6 @@
         }
     }
 
-    static {
-        sun.misc.SharedSecrets.setJavaNetHttpCookieAccess(
-            new sun.misc.JavaNetHttpCookieAccess() {
-                public List<HttpCookie> parse(String header) {
-                    return HttpCookie.parse(header, true);
-                }
-
-                public String header(HttpCookie cookie) {
-                    return cookie.header;
-                }
-            }
-        );
-    }
-
     /*
      * Returns the original header this cookie was consructed from, if it was
      * constructed by parsing a header, otherwise null.
diff --git a/ojluni/src/main/java/java/net/Inet4Address.java b/ojluni/src/main/java/java/net/Inet4Address.java
index 06889d1..6ee7709 100755
--- a/ojluni/src/main/java/java/net/Inet4Address.java
+++ b/ojluni/src/main/java/java/net/Inet4Address.java
@@ -93,6 +93,17 @@
      *  serialized */
     private static final long serialVersionUID = 3286316764910316507L;
 
+    /* @hide */
+    public static final InetAddress ANY = new Inet4Address(null, new byte[] { 0, 0, 0, 0 });
+
+    /* @hide */
+    public static final InetAddress ALL =
+            new Inet4Address(null, new byte[] { (byte) 255, (byte) 255,
+                  (byte) 255, (byte) 255 });
+    /* @hide */
+    public static final InetAddress LOOPBACK =
+            new Inet4Address("localhost", new byte[] { 127, 0, 0, 1 });
+
     /*
      * Perform initializations.
      */
@@ -319,6 +330,10 @@
         return addr;
     }
 
+    public byte[] getAddressInternal() {
+        return getAddress();
+    }
+
     /**
      * Returns the IP address string in textual presentation form.
      *
diff --git a/ojluni/src/main/java/java/net/Inet6Address.java b/ojluni/src/main/java/java/net/Inet6Address.java
index b5a4ced..b470955 100755
--- a/ojluni/src/main/java/java/net/Inet6Address.java
+++ b/ojluni/src/main/java/java/net/Inet6Address.java
@@ -166,6 +166,15 @@
 class Inet6Address extends InetAddress {
     final static int INADDRSZ = 16;
 
+    /* @hide */
+    public static final InetAddress ANY =
+            new Inet6Address(null, new byte[] {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0);
+
+    /* @hide */
+    public static final InetAddress LOOPBACK = new Inet6Address("localhost",
+            new byte[] {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, 0);
+
+
     /*
      * cached scope_id - for link-local address use only.
      */
@@ -609,6 +618,10 @@
         return ipaddress.clone();
     }
 
+    public byte[] getAddressInternal() {
+        return ipaddress;
+    }
+
     /**
      * Returns the numeric scopeId, if this instance is associated with
      * an interface. If no scoped_id is set, the returned value is zero.
diff --git a/ojluni/src/main/java/java/net/InetAddress.java b/ojluni/src/main/java/java/net/InetAddress.java
index 3ea28e4..f057269 100755
--- a/ojluni/src/main/java/java/net/InetAddress.java
+++ b/ojluni/src/main/java/java/net/InetAddress.java
@@ -45,6 +45,12 @@
 import sun.net.util.IPAddressUtil;
 import sun.misc.Service;
 import sun.net.spi.nameservice.*;
+import android.system.ErrnoException;
+import android.system.GaiException;
+import android.system.StructAddrinfo;
+import dalvik.system.BlockGuard;
+import libcore.io.Libcore;
+import static android.system.OsConstants.*;
 
 /**
  * This class represents an Internet Protocol (IP) address.
@@ -260,7 +266,6 @@
     static {
         preferIPv6Address = java.security.AccessController.doPrivileged(
             new GetBooleanAction("java.net.preferIPv6Addresses")).booleanValue();
-        AccessController.doPrivileged(new LoadLibraryAction("net"));
         init();
     }
 
@@ -637,6 +642,11 @@
         return null;
     }
 
+    /* @hide */
+    public byte[] getAddressInternal() {
+        return null;
+    }
+
     /**
      * Returns the IP address string in textual presentation.
      *
@@ -1007,6 +1017,29 @@
         throw new UnknownHostException("addr is of illegal length");
     }
 
+    private static InetAddress getByAddress(String host, byte[] addr, int scopeId)
+        throws UnknownHostException {
+        if (host != null && host.length() > 0 && host.charAt(0) == '[') {
+            if (host.charAt(host.length()-1) == ']') {
+                host = host.substring(1, host.length() -1);
+            }
+        }
+        if (addr != null) {
+            if (addr.length == Inet4Address.INADDRSZ) {
+                return new Inet4Address(host, addr);
+            } else if (addr.length == Inet6Address.INADDRSZ) {
+                byte[] newAddr
+                    = IPAddressUtil.convertFromIPv4MappedAddress(addr);
+                if (newAddr != null) {
+                    return new Inet4Address(host, newAddr);
+                } else {
+                    return new Inet6Address(host, addr, scopeId);
+                }
+            }
+        }
+        throw new UnknownHostException("addr is of illegal length");
+    }
+
 
     /**
      * Determines the IP address of a host, given the host's name.
@@ -1596,6 +1629,166 @@
         s.writeFields();
         s.flush();
     }
+
+    private static final int NETID_UNSET = 0;
+
+    /**
+     * Returns true if the string is a valid numeric IPv4 or IPv6 address (such as "192.168.0.1").
+     * This copes with all forms of address that Java supports, detailed in the {@link InetAddress}
+     * class documentation.
+     *
+     * @hide used by frameworks/base to ensure that a getAllByName won't cause a DNS lookup.
+     */
+    public static boolean isNumeric(String address) {
+        InetAddress inetAddress = parseNumericAddressNoThrow(address);
+        return inetAddress != null && disallowDeprecatedFormats(address, inetAddress) != null;
+    }
+
+    private static InetAddress parseNumericAddressNoThrow(String address) {
+        // Accept IPv6 addresses (only) in square brackets for compatibility.
+        if (address.startsWith("[") && address.endsWith("]") && address.indexOf(':') != -1) {
+            address = address.substring(1, address.length() - 1);
+        }
+        StructAddrinfo hints = new StructAddrinfo();
+        hints.ai_flags = AI_NUMERICHOST;
+        InetAddress[] addresses = null;
+        try {
+            addresses = Libcore.os.android_getaddrinfo(address, hints, NETID_UNSET);
+        } catch (GaiException ignored) {
+        }
+        return (addresses != null) ? addresses[0] : null;
+    }
+
+    private static InetAddress disallowDeprecatedFormats(String address, InetAddress inetAddress) {
+        // Only IPv4 addresses are problematic.
+        if (!(inetAddress instanceof Inet4Address) || address.indexOf(':') != -1) {
+            return inetAddress;
+        }
+        // If inet_pton(3) can't parse it, it must have been a deprecated format.
+        // We need to return inet_pton(3)'s result to ensure that numbers assumed to be octal
+        // by getaddrinfo(3) are reinterpreted by inet_pton(3) as decimal.
+        return Libcore.os.inet_pton(AF_INET, address);
+    }
+
+    /**
+     * Returns an InetAddress corresponding to the given numeric address (such
+     * as {@code "192.168.0.1"} or {@code "2001:4860:800d::68"}).
+     * This method will never do a DNS lookup. Non-numeric addresses are errors.
+     *
+     * @hide used by frameworks/base's NetworkUtils.numericToInetAddress
+     * @throws IllegalArgumentException if {@code numericAddress} is not a numeric address
+     */
+    public static InetAddress parseNumericAddress(String numericAddress) {
+        if (numericAddress == null || numericAddress.isEmpty()) {
+            return Inet6Address.LOOPBACK;
+        }
+        InetAddress result = parseNumericAddressNoThrow(numericAddress);
+        result = disallowDeprecatedFormats(numericAddress, result);
+        if (result == null) {
+            throw new IllegalArgumentException("Not a numeric address: " + numericAddress);
+        }
+        return result;
+    }
+
+    /* @hide */
+    public static void clearDnsCache() {
+        System.logW("OJ: DNS cache clear requested, not implemented");
+    }
+
+    /**
+     * 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];
+    }
+
+    /**
+     * 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
+     */
+    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();
+        }
+
+        // Is it a numeric address?
+        InetAddress result = parseNumericAddressNoThrow(host);
+        if (result != null) {
+            result = disallowDeprecatedFormats(host, result);
+            if (result == null) {
+                throw new UnknownHostException("Deprecated IPv4 address format: " + host);
+            }
+            return new InetAddress[] { result };
+        }
+
+        return lookupHostByName(host, netId).clone();
+    }
+
+    /**
+     * 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, int netId)
+            throws UnknownHostException {
+        BlockGuard.getThreadPolicy().onNetwork();
+        try {
+            StructAddrinfo hints = new StructAddrinfo();
+            hints.ai_flags = AI_ADDRCONFIG;
+            hints.ai_family = AF_UNSPEC;
+            // If we don't specify a socket type, every address will appear twice, once
+            // 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.android_getaddrinfo(host, hints, netId);
+            // TODO: should getaddrinfo set the hostname of the InetAddresses it returns?
+            for (InetAddress address : addresses) {
+                address.holder().hostName = host;
+            }
+            return addresses;
+        } catch (GaiException gaiException) {
+            // If the failure appears to have been a lack of INTERNET permission, throw a clear
+            // SecurityException to aid in debugging this common mistake.
+            // http://code.google.com/p/android/issues/detail?id=15722
+            if (gaiException.getCause() instanceof ErrnoException) {
+                if (((ErrnoException) gaiException.getCause()).errno == EACCES) {
+                    throw new SecurityException("Permission denied (missing INTERNET permission?)", gaiException);
+                }
+            }
+            // Otherwise, throw an UnknownHostException.
+            String detailMessage = "Unable to resolve host \"" + host + "\": " + Libcore.os.gai_strerror(gaiException.error);
+            throw gaiException.rethrowAsUnknownHostException(detailMessage);
+        }
+    }
+
+    private static InetAddress[] loopbackAddresses() {
+        return new InetAddress[] { Inet6Address.LOOPBACK, Inet4Address.LOOPBACK };
+    }
 }
 
 /*
diff --git a/ojluni/src/main/java/java/net/InetSocketAddress.java b/ojluni/src/main/java/java/net/InetSocketAddress.java
index 4ad9504..ad5e2dc 100755
--- a/ojluni/src/main/java/java/net/InetSocketAddress.java
+++ b/ojluni/src/main/java/java/net/InetSocketAddress.java
@@ -151,6 +151,14 @@
     }
 
     /**
+     * @hide internal use only
+     */
+    public InetSocketAddress() {
+        // These will be filled in the native implementation of recvfrom.
+        holder = null;
+    }
+
+    /**
      * Creates a socket address where the IP address is the wildcard address
      * and the port number a specified value.
      * <p>
diff --git a/ojluni/src/main/java/java/net/NetworkInterface.java b/ojluni/src/main/java/java/net/NetworkInterface.java
index 6314d15..b641b5c 100755
--- a/ojluni/src/main/java/java/net/NetworkInterface.java
+++ b/ojluni/src/main/java/java/net/NetworkInterface.java
@@ -53,7 +53,6 @@
     private static final int defaultIndex; /* index of defaultInterface */
 
     static {
-        AccessController.doPrivileged(new LoadLibraryAction("net"));
         init();
         defaultInterface = DefaultInterface.getDefault();
         if (defaultInterface != null) {
diff --git a/ojluni/src/main/java/java/net/PortUnreachableException.java b/ojluni/src/main/java/java/net/PortUnreachableException.java
index c21345f..01ea241 100755
--- a/ojluni/src/main/java/java/net/PortUnreachableException.java
+++ b/ojluni/src/main/java/java/net/PortUnreachableException.java
@@ -49,4 +49,9 @@
      * detailed message.
      */
     public PortUnreachableException() {}
+
+    /* @hide */
+    public PortUnreachableException(String msg, Throwable cause) {
+        super(msg, cause);
+    }
 }
diff --git a/ojluni/src/main/java/java/net/ProtocolException.java b/ojluni/src/main/java/java/net/ProtocolException.java
index 74ff4f1..a1fe91e 100755
--- a/ojluni/src/main/java/java/net/ProtocolException.java
+++ b/ojluni/src/main/java/java/net/ProtocolException.java
@@ -53,4 +53,9 @@
      */
     public ProtocolException() {
     }
+
+    /* @hide */
+    public ProtocolException(String msg, Throwable cause) {
+        super(msg, cause);
+    }
 }
diff --git a/ojluni/src/main/java/java/net/ServerSocket.java b/ojluni/src/main/java/java/net/ServerSocket.java
index 1d88ab7..4bf2a69 100755
--- a/ojluni/src/main/java/java/net/ServerSocket.java
+++ b/ojluni/src/main/java/java/net/ServerSocket.java
@@ -251,8 +251,9 @@
      * @return  the <code>SocketImpl</code> attached to that ServerSocket.
      * @throws SocketException if creation fails.
      * @since 1.4
+     * @hide
      */
-    SocketImpl getImpl() throws SocketException {
+    public SocketImpl getImpl() throws SocketException {
         if (!created)
             createImpl();
         return impl;
diff --git a/ojluni/src/main/java/java/net/Socket.java b/ojluni/src/main/java/java/net/Socket.java
index 575d96e..3a9f76c 100755
--- a/ojluni/src/main/java/java/net/Socket.java
+++ b/ojluni/src/main/java/java/net/Socket.java
@@ -25,6 +25,7 @@
 
 package java.net;
 
+import java.io.FileDescriptor;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.IOException;
@@ -1668,4 +1669,11 @@
     {
         /* Not implemented yet */
     }
+
+    /**
+     * @hide internal use only
+     */
+    public FileDescriptor getFileDescriptor$() {
+        return impl.getFileDescriptor();
+    }
 }
diff --git a/ojluni/src/main/java/java/net/SocketException.java b/ojluni/src/main/java/java/net/SocketException.java
index eae84d9..fbbe4f8 100755
--- a/ojluni/src/main/java/java/net/SocketException.java
+++ b/ojluni/src/main/java/java/net/SocketException.java
@@ -52,4 +52,14 @@
      */
     public SocketException() {
     }
+
+    /* @hide */
+    public SocketException(Throwable cause) {
+        super(cause);
+    }
+
+    /* @hide */
+    public SocketException(String msg, Throwable cause) {
+        super(msg, cause);
+    }
 }
diff --git a/ojluni/src/main/java/java/net/SocketImpl.java b/ojluni/src/main/java/java/net/SocketImpl.java
index 495b18f..921f6ce 100755
--- a/ojluni/src/main/java/java/net/SocketImpl.java
+++ b/ojluni/src/main/java/java/net/SocketImpl.java
@@ -221,7 +221,7 @@
      * @return  the value of this socket's <code>fd</code> field.
      * @see     java.net.SocketImpl#fd
      */
-    protected FileDescriptor getFileDescriptor() {
+    public FileDescriptor getFileDescriptor() {
         return fd;
     }
 
diff --git a/ojluni/src/main/java/java/net/SocketTimeoutException.java b/ojluni/src/main/java/java/net/SocketTimeoutException.java
index 7283f32..9c1e6ba 100755
--- a/ojluni/src/main/java/java/net/SocketTimeoutException.java
+++ b/ojluni/src/main/java/java/net/SocketTimeoutException.java
@@ -47,4 +47,14 @@
      * Construct a new SocketTimeoutException with no detailed message.
      */
     public SocketTimeoutException() {}
+
+    /* @hide */
+    public SocketTimeoutException(Throwable cause) {
+        super(cause);
+    }
+
+    /* @hide */
+    public SocketTimeoutException(String msg, Throwable cause) {
+        super(msg, cause);
+    }
 }
diff --git a/ojluni/src/main/java/java/net/URI.java b/ojluni/src/main/java/java/net/URI.java
index 6997a42..78a7be0 100755
--- a/ojluni/src/main/java/java/net/URI.java
+++ b/ojluni/src/main/java/java/net/URI.java
@@ -42,6 +42,7 @@
 
 import java.lang.Character;             // for javadoc
 import java.lang.NullPointerException;  // for javadoc
+import libcore.net.UriCodec;
 
 
 /**
@@ -471,6 +472,39 @@
 public final class URI
     implements Comparable<URI>, Serializable
 {
+    static final String UNRESERVED = "_-!.~\'()*";
+    static final String PUNCTUATION = ",;:$&+=";
+    static final UriCodec AUTHORITY_ENCODER = new PartEncoder("@[]");
+
+    /** for java.net.URL, which foolishly combines these two parts */
+    static final UriCodec FILE_AND_QUERY_ENCODER = new PartEncoder("/@?");
+
+    /** for query, fragment, and scheme-specific part */
+    static final UriCodec ALL_LEGAL_ENCODER = new PartEncoder("?/[]@");
+
+    /**
+     * Encodes the unescaped characters of {@code s} that are not permitted.
+     * Permitted characters are:
+     * <ul>
+     *   <li>Unreserved characters in <a href="http://www.ietf.org/rfc/rfc2396.txt">RFC 2396</a>.
+     *   <li>{@code extraOkayChars},
+     *   <li>non-ASCII, non-control, non-whitespace characters
+     * </ul>
+     */
+    private static class PartEncoder extends UriCodec {
+        private final String extraLegalCharacters;
+
+        PartEncoder(String extraLegalCharacters) {
+            this.extraLegalCharacters = extraLegalCharacters;
+        }
+
+        @Override protected boolean isRetained(char c) {
+            return UNRESERVED.indexOf(c) != -1
+                    || PUNCTUATION.indexOf(c) != -1
+                    || extraLegalCharacters.indexOf(c) != -1
+                    || (c > 127 && !Character.isSpaceChar(c) && !Character.isISOControl(c));
+        }
+    }
 
     // Note: Comments containing the word "ASSERT" indicate places where a
     // throw of an InternalError should be replaced by an appropriate assertion
diff --git a/ojluni/src/main/java/java/net/URL.java b/ojluni/src/main/java/java/net/URL.java
index 38d4e53..52aae1a 100755
--- a/ojluni/src/main/java/java/net/URL.java
+++ b/ojluni/src/main/java/java/net/URL.java
@@ -1304,6 +1304,14 @@
                 path = file;
         }
     }
+
+    public URI toURILenient() throws URISyntaxException {
+        URLStreamHandler handler = getURLStreamHandler(protocol);
+        if (handler == null) {
+          throw new IllegalStateException(protocol);
+        }
+        return new URI(handler.toExternalForm(this, true));
+    }
 }
 
 class Parts {
diff --git a/ojluni/src/main/java/java/net/URLClassLoader.java b/ojluni/src/main/java/java/net/URLClassLoader.java
index 4f28be6..f473b8e 100755
--- a/ojluni/src/main/java/java/net/URLClassLoader.java
+++ b/ojluni/src/main/java/java/net/URLClassLoader.java
@@ -438,14 +438,12 @@
             // Use (direct) ByteBuffer:
             CodeSigner[] signers = res.getCodeSigners();
             CodeSource cs = new CodeSource(url, signers);
-            sun.misc.PerfCounter.getReadClassBytesTime().addElapsedTimeFrom(t0);
             return defineClass(name, bb, cs);
         } else {
             byte[] b = res.getBytes();
             // must read certificates AFTER reading bytes.
             CodeSigner[] signers = res.getCodeSigners();
             CodeSource cs = new CodeSource(url, signers);
-            sun.misc.PerfCounter.getReadClassBytesTime().addElapsedTimeFrom(t0);
             return defineClass(name, b, 0, b.length, cs);
         }
     }
@@ -748,13 +746,13 @@
     }
 
     static {
-        sun.misc.SharedSecrets.setJavaNetAccess (
+        /*sun.misc.SharedSecrets.setJavaNetAccess (
             new sun.misc.JavaNetAccess() {
                 public URLClassPath getURLClassPath (URLClassLoader u) {
                     return u.ucp;
                 }
             }
-        );
+        );*/
         ClassLoader.registerAsParallelCapable();
     }
 }
diff --git a/ojluni/src/main/java/java/net/URLStreamHandler.java b/ojluni/src/main/java/java/net/URLStreamHandler.java
index c98588a..1143130 100755
--- a/ojluni/src/main/java/java/net/URLStreamHandler.java
+++ b/ojluni/src/main/java/java/net/URLStreamHandler.java
@@ -473,7 +473,10 @@
      * @return  a string representation of the <code>URL</code> argument.
      */
     protected String toExternalForm(URL u) {
+      return toExternalForm(u, false);
+    }
 
+    String toExternalForm(URL u, boolean escapeIllegalCharacters) {
         // pre-compute length of StringBuffer
         int len = u.getProtocol().length() + 1;
         if (u.getAuthority() != null && u.getAuthority().length() > 0)
@@ -487,23 +490,32 @@
         if (u.getRef() != null)
             len += 1 + u.getRef().length();
 
-        StringBuffer result = new StringBuffer(len);
+        StringBuilder result = new StringBuilder(len);
         result.append(u.getProtocol());
         result.append(":");
         if (u.getAuthority() != null && u.getAuthority().length() > 0) {
             result.append("//");
-            result.append(u.getAuthority());
+            if (escapeIllegalCharacters) {
+              URI.AUTHORITY_ENCODER.appendPartiallyEncoded(result, u.getAuthority());
+            } else {
+              result.append(u.getAuthority());
+            }
         }
-        if (u.getPath() != null) {
-            result.append(u.getPath());
-        }
-        if (u.getQuery() != null) {
-            result.append('?');
-            result.append(u.getQuery());
+        String fileAndQuery = u.getFile();
+        if (fileAndQuery != null) {
+            if (escapeIllegalCharacters) {
+                URI.FILE_AND_QUERY_ENCODER.appendPartiallyEncoded(result, fileAndQuery);
+            } else {
+                result.append(fileAndQuery);
+            }
         }
         if (u.getRef() != null) {
             result.append("#");
-            result.append(u.getRef());
+            if (escapeIllegalCharacters) {
+              URI.ALL_LEGAL_ENCODER.appendPartiallyEncoded(result, u.getRef());
+            } else {
+              result.append(u.getRef());
+            }
         }
         return result.toString();
     }
diff --git a/ojluni/src/main/java/java/util/jar/JarFile.java b/ojluni/src/main/java/java/util/jar/JarFile.java
index 42a7482..fe4dd90 100755
--- a/ojluni/src/main/java/java/util/jar/JarFile.java
+++ b/ojluni/src/main/java/java/util/jar/JarFile.java
@@ -499,7 +499,10 @@
     // attribute. Returns false if there is no manifest or the manifest
     // does not contain a "Class-Path" attribute. Currently exported to
     // core libraries via sun.misc.SharedSecrets.
-    boolean hasClassPathAttribute() throws IOException {
+    /*
+     * @hide
+     */
+    public boolean hasClassPathAttribute() throws IOException {
         if (computedHasClassPathAttribute) {
             return hasClassPathAttribute;
         }
diff --git a/ojluni/src/main/java/java/util/zip/ZipFile.java b/ojluni/src/main/java/java/util/zip/ZipFile.java
index c5f89b6..6ddb6e6 100755
--- a/ojluni/src/main/java/java/util/zip/ZipFile.java
+++ b/ojluni/src/main/java/java/util/zip/ZipFile.java
@@ -768,8 +768,10 @@
     /**
      * Returns {@code true} if, and only if, the zip file begins with {@code
      * LOCSIG}.
+     *
+     * @hide
      */
-    private boolean startsWithLocHeader() {
+    public boolean startsWithLocHeader() {
         return locsig;
     }
 
diff --git a/ojluni/src/main/java/javax/net/ssl/HttpsURLConnection.java b/ojluni/src/main/java/javax/net/ssl/HttpsURLConnection.java
index 391ae23..27462e8 100755
--- a/ojluni/src/main/java/javax/net/ssl/HttpsURLConnection.java
+++ b/ojluni/src/main/java/javax/net/ssl/HttpsURLConnection.java
@@ -196,14 +196,12 @@
      * updated for another other type of <code>HostnameVerifier</code>
      * that are created.
      */
-    /* ----- BEGIN android -----
     private static class DefaultHostnameVerifier
             implements HostnameVerifier {
         public boolean verify(String hostname, SSLSession session) {
             return false;
         }
     }
-    ----- END android ----- */
 
     /**
      * The <code>hostnameVerifier</code> for this object.
@@ -250,6 +248,11 @@
         return defaultHostnameVerifier;
     }
 
+    /* @hide */
+    public static boolean hasCustomDefaultHostnameVerifier() {
+        return !(defaultHostnameVerifier instanceof DefaultHostnameVerifier);
+    }
+
     /**
      * Sets the <code>HostnameVerifier</code> for this instance.
      * <P>
diff --git a/ojluni/src/main/java/sun/misc/URLClassPath.java b/ojluni/src/main/java/sun/misc/URLClassPath.java
index 56ec815..0f36e58 100755
--- a/ojluni/src/main/java/sun/misc/URLClassPath.java
+++ b/ojluni/src/main/java/sun/misc/URLClassPath.java
@@ -596,8 +596,6 @@
         private URLStreamHandler handler;
         private HashMap<String, Loader> lmap;
         private boolean closed = false;
-        private static final sun.misc.JavaUtilZipFileAccess zipAccess =
-                sun.misc.SharedSecrets.getJavaUtilZipFileAccess();
 
         /*
          * Creates a new JarLoader for the specified URL referring to
@@ -705,7 +703,7 @@
         /* Throws if the given jar file is does not start with the correct LOC */
         static JarFile checkJar(JarFile jar) throws IOException {
             if (System.getSecurityManager() != null && !DISABLE_JAR_CHECKING
-                && !zipAccess.startsWithLocHeader(jar)) {
+                && !jar.startsWithLocHeader()) {
                 IOException x = new IOException("Invalid Jar file");
                 try {
                     jar.close();
@@ -981,7 +979,7 @@
 
             ensureOpen();
             parseExtensionsDependencies();
-            if (SharedSecrets.javaUtilJarAccess().jarFileHasClassPathAttribute(jar)) { // Only get manifest when necessary
+            if (jar.hasClassPathAttribute()) { // Only get manifest when necessary
                 Manifest man = jar.getManifest();
                 if (man != null) {
                     Attributes attr = man.getMainAttributes();
@@ -1000,7 +998,6 @@
          * parse the standard extension dependencies
          */
         private void  parseExtensionsDependencies() throws IOException {
-            ExtensionDependency.checkExtensionsDependencies(jar);
         }
 
         /*
diff --git a/ojluni/src/main/java/sun/net/www/protocol/FileURLConnection.java b/ojluni/src/main/java/sun/net/www/protocol/FileURLConnection.java
new file mode 100644
index 0000000..1997cb0
--- /dev/null
+++ b/ojluni/src/main/java/sun/net/www/protocol/FileURLConnection.java
@@ -0,0 +1,233 @@
+/*
+ * Copyright (c) 1995, 2010, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * Open an file input stream given a URL.
+ * @author      James Gosling
+ * @author      Steven B. Byrne
+ */
+
+package sun.net.www.protocol.file;
+
+import java.net.URL;
+import java.net.FileNameMap;
+import java.io.*;
+import java.text.Collator;
+import java.security.Permission;
+import sun.net.*;
+import sun.net.www.*;
+import java.util.*;
+import java.text.SimpleDateFormat;
+
+import sun.security.action.GetPropertyAction;
+import sun.security.action.GetIntegerAction;
+import sun.security.action.GetBooleanAction;
+
+public class FileURLConnection extends URLConnection {
+
+    static String CONTENT_LENGTH = "content-length";
+    static String CONTENT_TYPE = "content-type";
+    static String TEXT_PLAIN = "text/plain";
+    static String LAST_MODIFIED = "last-modified";
+
+    String contentType;
+    InputStream is;
+
+    File file;
+    String filename;
+    boolean isDirectory = false;
+    boolean exists = false;
+    List<String> files;
+
+    long length = -1;
+    long lastModified = 0;
+
+    protected FileURLConnection(URL u, File file) {
+        super(u);
+        this.file = file;
+    }
+
+    /*
+     * Note: the semantics of FileURLConnection object is that the
+     * results of the various URLConnection calls, such as
+     * getContentType, getInputStream or getContentLength reflect
+     * whatever was true when connect was called.
+     */
+    public void connect() throws IOException {
+        if (!connected) {
+            try {
+                filename = file.toString();
+                isDirectory = file.isDirectory();
+                if (isDirectory) {
+                    String[] fileList = file.list();
+                    if (fileList == null)
+                        throw new FileNotFoundException(filename + " exists, but is not accessible");
+                    files = Arrays.<String>asList(fileList);
+                } else {
+
+                    is = new BufferedInputStream(new FileInputStream(filename));
+
+                    // Check if URL should be metered
+                    boolean meteredInput = ProgressMonitor.getDefault().shouldMeterInput(url, "GET");
+                    if (meteredInput)   {
+                        ProgressSource pi = new ProgressSource(url, "GET", file.length());
+                        is = new MeteredStream(is, pi, file.length());
+                    }
+                }
+            } catch (IOException e) {
+                throw e;
+            }
+            connected = true;
+        }
+    }
+
+    private boolean initializedHeaders = false;
+
+    private void initializeHeaders() {
+        try {
+            connect();
+            exists = file.exists();
+        } catch (IOException e) {
+        }
+        if (!initializedHeaders || !exists) {
+            length = file.length();
+            lastModified = file.lastModified();
+
+            if (!isDirectory) {
+                FileNameMap map = java.net.URLConnection.getFileNameMap();
+                contentType = map.getContentTypeFor(filename);
+                if (contentType != null) {
+                    properties.add(CONTENT_TYPE, contentType);
+                }
+                properties.add(CONTENT_LENGTH, String.valueOf(length));
+
+                /*
+                 * Format the last-modified field into the preferred
+                 * Internet standard - ie: fixed-length subset of that
+                 * defined by RFC 1123
+                 */
+                if (lastModified != 0) {
+                    Date date = new Date(lastModified);
+                    SimpleDateFormat fo =
+                        new SimpleDateFormat ("EEE, dd MMM yyyy HH:mm:ss 'GMT'", Locale.US);
+                    fo.setTimeZone(TimeZone.getTimeZone("GMT"));
+                    properties.add(LAST_MODIFIED, fo.format(date));
+                }
+            } else {
+                properties.add(CONTENT_TYPE, TEXT_PLAIN);
+            }
+            initializedHeaders = true;
+        }
+    }
+
+    public String getHeaderField(String name) {
+        initializeHeaders();
+        return super.getHeaderField(name);
+    }
+
+    public String getHeaderField(int n) {
+        initializeHeaders();
+        return super.getHeaderField(n);
+    }
+
+    public int getContentLength() {
+        initializeHeaders();
+        if (length > Integer.MAX_VALUE)
+            return -1;
+        return (int) length;
+    }
+
+    public long getContentLengthLong() {
+        initializeHeaders();
+        return length;
+    }
+
+    public String getHeaderFieldKey(int n) {
+        initializeHeaders();
+        return super.getHeaderFieldKey(n);
+    }
+
+    public MessageHeader getProperties() {
+        initializeHeaders();
+        return super.getProperties();
+    }
+
+    public long getLastModified() {
+        initializeHeaders();
+        return lastModified;
+    }
+
+    public synchronized InputStream getInputStream()
+        throws IOException {
+
+        int iconHeight;
+        int iconWidth;
+
+        connect();
+
+        if (is == null) {
+            if (isDirectory) {
+                FileNameMap map = java.net.URLConnection.getFileNameMap();
+
+                StringBuffer buf = new StringBuffer();
+
+                if (files == null) {
+                    throw new FileNotFoundException(filename);
+                }
+
+                Collections.sort(files, Collator.getInstance());
+
+                for (int i = 0 ; i < files.size() ; i++) {
+                    String fileName = files.get(i);
+                    buf.append(fileName);
+                    buf.append("\n");
+                }
+                // Put it into a (default) locale-specific byte-stream.
+                is = new ByteArrayInputStream(buf.toString().getBytes());
+            } else {
+                throw new FileNotFoundException(filename);
+            }
+        }
+        return is;
+    }
+
+    Permission permission;
+
+    /* since getOutputStream isn't supported, only read permission is
+     * relevant
+     */
+    public Permission getPermission() throws IOException {
+        if (permission == null) {
+            String decodedPath = ParseUtil.decode(url.getPath());
+            if (File.separatorChar == '/') {
+                permission = new FilePermission(decodedPath, "read");
+            } else {
+                permission = new FilePermission(
+                        decodedPath.replace('/',File.separatorChar), "read");
+            }
+        }
+        return permission;
+    }
+}
diff --git a/ojluni/src/main/java/sun/net/www/protocol/http/HttpURLConnection.java b/ojluni/src/main/java/sun/net/www/protocol/http/HttpURLConnection.java
index d4a9985..8ea0ec3 100755
--- a/ojluni/src/main/java/sun/net/www/protocol/http/HttpURLConnection.java
+++ b/ojluni/src/main/java/sun/net/www/protocol/http/HttpURLConnection.java
@@ -2617,10 +2617,8 @@
             if (cookieHandler == null)
                 return value;
 
-            sun.misc.JavaNetHttpCookieAccess access =
-                    sun.misc.SharedSecrets.getJavaNetHttpCookieAccess();
             StringBuilder retValue = new StringBuilder();
-            List<HttpCookie> cookies = access.parse(value);
+            List<HttpCookie> cookies = HttpCookie.parse(value, true);
             boolean multipleCookies = false;
             for (HttpCookie cookie : cookies) {
                 // skip HttpOnly cookies
@@ -2628,7 +2626,7 @@
                     continue;
                 if (multipleCookies)
                     retValue.append(',');  // RFC 2965, comma separated
-                retValue.append(access.header(cookie));
+                retValue.append(cookie.header);
                 multipleCookies = true;
             }
 
diff --git a/ojluni/src/main/native/DatagramPacket.c b/ojluni/src/main/native/DatagramPacket.c
index 01ac9fb..9a3c9c1 100755
--- a/ojluni/src/main/native/DatagramPacket.c
+++ b/ojluni/src/main/native/DatagramPacket.c
@@ -25,6 +25,10 @@
 
 #include "java_net_DatagramPacket.h"
 #include "net_util.h"
+#include "JNIHelp.h"
+
+#define NATIVE_METHOD(className, functionName, signature) \
+{ #functionName, signature, (void*)(className ## _ ## functionName) }
 
 /************************************************************************
  * DatagramPacket
@@ -43,7 +47,7 @@
  * Signature: ()V
  */
 JNIEXPORT void JNICALL
-Java_java_net_DatagramPacket_init (JNIEnv *env, jclass cls) {
+DatagramPacket_init (JNIEnv *env, jclass cls) {
     dp_addressID = (*env)->GetFieldID(env, cls, "address",
                                       "Ljava/net/InetAddress;");
     CHECK_NULL(dp_addressID);
@@ -58,3 +62,11 @@
     dp_bufLengthID = (*env)->GetFieldID(env, cls, "bufLength", "I");
     CHECK_NULL(dp_bufLengthID);
 }
+
+static JNINativeMethod gMethods[] = {
+  NATIVE_METHOD(DatagramPacket, init, "()V"),
+};
+
+void register_java_net_DatagramPacket(JNIEnv* env) {
+  jniRegisterNativeMethods(env, "java/net/DatagramPacket", gMethods, NELEM(gMethods));
+}
diff --git a/ojluni/src/main/native/DefaultProxySelector.c b/ojluni/src/main/native/DefaultProxySelector.c
index 6883902..0184f10 100755
--- a/ojluni/src/main/native/DefaultProxySelector.c
+++ b/ojluni/src/main/native/DefaultProxySelector.c
@@ -36,6 +36,10 @@
 #else
 #include <strings.h>
 #endif
+#include "JNIHelp.h"
+
+#define NATIVE_METHOD(className, functionName, signature) \
+{ #functionName, signature, (void*)(className ## _ ## functionName) }
 
 /**
  * These functions are used by the sun.net.spi.DefaultProxySelector class
@@ -94,7 +98,7 @@
  * Signature: ()Z
  */
 JNIEXPORT jboolean JNICALL
-Java_sun_net_spi_DefaultProxySelector_init(JNIEnv *env, jclass clazz) {
+DefaultProxySelector_init(JNIEnv *env, jclass clazz) {
   jclass cls = NULL;
   CHECK_NULL(cls = (*env)->FindClass(env,"java/net/Proxy"));
   proxy_class = (*env)->NewGlobalRef(env, cls);
@@ -152,7 +156,7 @@
  * Signature: ([Ljava/lang/String;Ljava/lang/String;)Ljava/net/Proxy;
  */
 JNIEXPORT jobject JNICALL
-Java_sun_net_spi_DefaultProxySelector_getSystemProxy(JNIEnv *env,
+DefaultProxySelector_getSystemProxy(JNIEnv *env,
                                                      jobject this,
                                                      jstring proto,
                                                      jstring host)
@@ -333,3 +337,12 @@
   CHECK_NULL(no_proxy = (*env)->GetStaticObjectField(env, proxy_class, pr_no_proxyID));
   return no_proxy;
 }
+
+static JNINativeMethod gMethods[] = {
+  NATIVE_METHOD(DefaultProxySelector, getSystemProxy, "(Ljava/lang/String;Ljava/lang/String;)Ljava/net/Proxy;"),
+  NATIVE_METHOD(DefaultProxySelector, init, "()Z"),
+};
+
+void register_sun_net_spi_DefaultProxySelector(JNIEnv* env) {
+  jniRegisterNativeMethods(env, "sun/net/spi/DefaultProxySelector", gMethods, NELEM(gMethods));
+}
diff --git a/ojluni/src/main/native/Inet4Address.c b/ojluni/src/main/native/Inet4Address.c
index 2030471..0c6ca22 100755
--- a/ojluni/src/main/native/Inet4Address.c
+++ b/ojluni/src/main/native/Inet4Address.c
@@ -27,6 +27,10 @@
 
 #include "java_net_Inet4Address.h"
 #include "net_util.h"
+#include "JNIHelp.h"
+
+#define NATIVE_METHOD(className, functionName, signature) \
+{ #functionName, signature, (void*)(className ## _ ## functionName) }
 
 /************************************************************************
  * Inet4Address
@@ -40,7 +44,7 @@
  * Signature: ()V
  */
 JNIEXPORT void JNICALL
-Java_java_net_Inet4Address_init(JNIEnv *env, jclass cls) {
+Inet4Address_init(JNIEnv *env, jclass cls) {
     jclass c = (*env)->FindClass(env, "java/net/Inet4Address");
     CHECK_NULL(c);
     ia4_class = (*env)->NewGlobalRef(env, c);
@@ -48,3 +52,11 @@
     ia4_ctrID = (*env)->GetMethodID(env, ia4_class, "<init>", "()V");
     CHECK_NULL(ia4_ctrID);
 }
+
+static JNINativeMethod gMethods[] = {
+  NATIVE_METHOD(Inet4Address, init, "()V"),
+};
+
+void register_java_net_Inet4Address(JNIEnv* env) {
+  jniRegisterNativeMethods(env, "java/net/Inet4Address", gMethods, NELEM(gMethods));
+}
diff --git a/ojluni/src/main/native/Inet4AddressImpl.c b/ojluni/src/main/native/Inet4AddressImpl.c
index 1aa2de0..aafc33e 100755
--- a/ojluni/src/main/native/Inet4AddressImpl.c
+++ b/ojluni/src/main/native/Inet4AddressImpl.c
@@ -46,10 +46,14 @@
 #include "net_util.h"
 
 #include "java_net_Inet4AddressImpl.h"
+#include "JNIHelp.h"
 
-#if defined(__GLIBC__) || (defined(__FreeBSD__) && (__FreeBSD_version >= 601104))
+#define NATIVE_METHOD(className, functionName, signature) \
+{ #functionName, signature, (void*)(className ## _ ## functionName) }
+
+//#if defined(__GLIBC__) || (defined(__FreeBSD__) && (__FreeBSD_version >= 601104))
 #define HAS_GLIBC_GETHOSTBY_R   1
-#endif
+//#endif
 
 #if defined(_ALLBSD_SOURCE) && !defined(HAS_GLIBC_GETHOSTBY_R)
 /* Use getaddrinfo(3), which is thread safe */
@@ -63,7 +67,7 @@
  * Signature: ()Ljava/lang/String;
  */
 JNIEXPORT jstring JNICALL
-Java_java_net_Jnet4AddressImpl_getLocalHostName(JNIEnv *env, jobject this) {
+Inet4AddressImpl_getLocalHostName(JNIEnv *env, jobject this) {
     char hostname[NI_MAXHOST+1];
 
     hostname[0] = '\0';
@@ -116,7 +120,7 @@
  */
 
 JNIEXPORT jobjectArray JNICALL
-Java_java_net_Jnet4AddressImpl_lookupAllHostAddr(JNIEnv *env, jobject this,
+Inet4AddressImpl_lookupAllHostAddr(JNIEnv *env, jobject this,
                                                 jstring host) {
     const char *hostname;
     jobject name;
@@ -264,7 +268,7 @@
  * Signature: (I)Ljava/lang/String;
  */
 JNIEXPORT jstring JNICALL
-Java_java_net_Jnet4AddressImpl_getHostByAddr(JNIEnv *env, jobject this,
+Inet4AddressImpl_getHostByAddr(JNIEnv *env, jobject this,
                                             jbyteArray addrArray) {
     jstring ret = NULL;
 
@@ -325,7 +329,7 @@
  * Signature: ()Ljava/lang/String;
  */
 JNIEXPORT jstring JNICALL
-Java_java_net_Jnet4AddressImpl_getLocalHostName(JNIEnv *env, jobject this) {
+Inet4AddressImpl_getLocalHostName(JNIEnv *env, jobject this) {
     char hostname[MAXHOSTNAMELEN+1];
 
     hostname[0] = '\0';
@@ -402,7 +406,7 @@
  */
 
 JNIEXPORT jobjectArray JNICALL
-Java_java_net_Jnet4AddressImpl_lookupAllHostAddr(JNIEnv *env, jobject this,
+Inet4AddressImpl_lookupAllHostAddr(JNIEnv *env, jobject this,
                                                 jstring host) {
     const char *hostname;
     jobjectArray ret = 0;
@@ -515,7 +519,7 @@
  * Signature: (I)Ljava/lang/String;
  */
 JNIEXPORT jstring JNICALL
-Java_java_net_Jnet4AddressImpl_getHostByAddr(JNIEnv *env, jobject this,
+Inet4AddressImpl_getHostByAddr(JNIEnv *env, jobject this,
                                             jbyteArray addrArray) {
     jstring ret = NULL;
     jint addr;
@@ -708,7 +712,7 @@
  * Signature: ([bI[bI)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_java_net_Jnet4AddressImpl_isReachable0(JNIEnv *env, jobject this,
+Inet4AddressImpl_isReachable0(JNIEnv *env, jobject this,
                                            jbyteArray addrArray,
                                            jint timeout,
                                            jbyteArray ifArray,
@@ -856,3 +860,15 @@
         return JNI_FALSE;
     }
 }
+
+static JNINativeMethod gMethods[] = {
+  NATIVE_METHOD(Inet4AddressImpl, isReachable0, "([BI[BI)Z"),
+  NATIVE_METHOD(Inet4AddressImpl, getHostByAddr, "([B)Ljava/lang/String;"),
+  NATIVE_METHOD(Inet4AddressImpl, lookupAllHostAddr, "(Ljava/lang/String;)[Ljava/net/InetAddress;"),
+  NATIVE_METHOD(Inet4AddressImpl, getLocalHostName, "()Ljava/lang/String;"),
+
+};
+
+void register_java_net_Inet4AddressImpl(JNIEnv* env) {
+  jniRegisterNativeMethods(env, "java/net/Inet4AddressImpl", gMethods, NELEM(gMethods));
+}
diff --git a/ojluni/src/main/native/Inet6Address.c b/ojluni/src/main/native/Inet6Address.c
index 7b04c67..5a0e2f5 100755
--- a/ojluni/src/main/native/Inet6Address.c
+++ b/ojluni/src/main/native/Inet6Address.c
@@ -27,6 +27,10 @@
 
 #include "java_net_Inet6Address.h"
 #include "net_util.h"
+#include "JNIHelp.h"
+
+#define NATIVE_METHOD(className, functionName, signature) \
+{ #functionName, signature, (void*)(className ## _ ## functionName) }
 
 /************************************************************************
  * Inet6Address
@@ -47,7 +51,7 @@
  * Signature: ()V
  */
 JNIEXPORT void JNICALL
-Java_java_net_Inet6Address_init(JNIEnv *env, jclass cls) {
+Inet6Address_init(JNIEnv *env, jclass cls) {
     jclass c = (*env)->FindClass(env, "java/net/Inet6Address");
     CHECK_NULL(c);
     ia6_class = (*env)->NewGlobalRef(env, c);
@@ -67,3 +71,11 @@
     ia6_ctrID = (*env)->GetMethodID(env, ia6_class, "<init>", "()V");
     CHECK_NULL(ia6_ctrID);
 }
+
+static JNINativeMethod gMethods[] = {
+  NATIVE_METHOD(Inet6Address, init, "()V"),
+};
+
+void register_java_net_Inet6Address(JNIEnv* env) {
+  jniRegisterNativeMethods(env, "java/net/Inet6Address", gMethods, NELEM(gMethods));
+}
diff --git a/ojluni/src/main/native/Inet6AddressImpl.c b/ojluni/src/main/native/Inet6AddressImpl.c
index 4038504..f26a3c0 100755
--- a/ojluni/src/main/native/Inet6AddressImpl.c
+++ b/ojluni/src/main/native/Inet6AddressImpl.c
@@ -46,6 +46,10 @@
 
 #include "java_net_Inet4AddressImpl.h"
 #include "java_net_Inet6AddressImpl.h"
+#include "JNIHelp.h"
+
+#define NATIVE_METHOD(className, functionName, signature) \
+{ #functionName, signature, (void*)(className ## _ ## functionName) }
 
 /* the initial size of our hostent buffers */
 #ifndef NI_MAXHOST
@@ -63,7 +67,7 @@
  * Signature: ()Ljava/lang/String;
  */
 JNIEXPORT jstring JNICALL
-Java_java_net_Inet6AddressImpl_getLocalHostName(JNIEnv *env, jobject this) {
+Inet6AddressImpl_getLocalHostName(JNIEnv *env, jobject this) {
     char hostname[NI_MAXHOST+1];
 
     hostname[0] = '\0';
@@ -137,7 +141,7 @@
  */
 
 JNIEXPORT jobjectArray JNICALL
-Java_java_net_Inet6AddressImpl_lookupAllHostAddr(JNIEnv *env, jobject this,
+Inet6AddressImpl_lookupAllHostAddr(JNIEnv *env, jobject this,
                                                 jstring host) {
     const char *hostname;
     jobjectArray ret = 0;
@@ -378,7 +382,7 @@
  * Signature: (I)Ljava/lang/String;
  */
 JNIEXPORT jstring JNICALL
-Java_java_net_Inet6AddressImpl_getHostByAddr(JNIEnv *env, jobject this,
+Inet6AddressImpl_getHostByAddr(JNIEnv *env, jobject this,
                                             jbyteArray addrArray) {
 
     jstring ret = NULL;
@@ -557,7 +561,7 @@
  * Signature: ([bII[bI)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_java_net_Inet6AddressImpl_isReachable0(JNIEnv *env, jobject this,
+Inet6AddressImpl_isReachable0(JNIEnv *env, jobject this,
                                            jbyteArray addrArray,
                                            jint scope,
                                            jint timeout,
@@ -584,7 +588,7 @@
      */
     sz = (*env)->GetArrayLength(env, addrArray);
     if (sz == 4) {
-      return Java_java_net_Inet4AddressImpl_isReachable0(env, this,
+      return Inet4AddressImpl_isReachable0(env, this,
                                                          addrArray,
                                                          timeout,
                                                          ifArray, ttl);
@@ -717,3 +721,13 @@
     return JNI_FALSE;
 #endif /* AF_INET6 */
 }
+
+static JNINativeMethod gMethods[] = {
+  NATIVE_METHOD(Inet6AddressImpl, isReachable0, "([BII[BII)Z"),
+  NATIVE_METHOD(Inet6AddressImpl, getHostByAddr, "([B)Ljava/lang/String;"),
+  NATIVE_METHOD(Inet6AddressImpl, lookupAllHostAddr, "(Ljava/lang/String;)[Ljava/net/InetAddress;"),
+};
+
+void register_java_net_Inet6AddressImpl(JNIEnv* env) {
+  jniRegisterNativeMethods(env, "java/net/Inet6AddressImpl", gMethods, NELEM(gMethods));
+}
diff --git a/ojluni/src/main/native/InetAddress.c b/ojluni/src/main/native/InetAddress.c
index 3111573..761cd31 100755
--- a/ojluni/src/main/native/InetAddress.c
+++ b/ojluni/src/main/native/InetAddress.c
@@ -27,6 +27,10 @@
 
 #include "java_net_InetAddress.h"
 #include "net_util.h"
+#include "JNIHelp.h"
+
+#define NATIVE_METHOD(className, functionName, signature) \
+{ #functionName, signature, (void*)(className ## _ ## functionName) }
 
 /************************************************************************
  * InetAddress
@@ -46,7 +50,7 @@
  * Signature: ()V
  */
 JNIEXPORT void JNICALL
-Java_java_net_InetAddress_init(JNIEnv *env, jclass cls) {
+InetAddress_init(JNIEnv *env, jclass cls) {
     jclass c = (*env)->FindClass(env,"java/net/InetAddress");
     CHECK_NULL(c);
     ia_class = (*env)->NewGlobalRef(env, c);
@@ -66,3 +70,11 @@
     iac_hostNameID = (*env)->GetFieldID(env, iac_class, "hostName", "Ljava/lang/String;");
     CHECK_NULL(iac_hostNameID);
 }
+
+static JNINativeMethod gMethods[] = {
+  NATIVE_METHOD(InetAddress, init, "()V"),
+};
+
+void register_java_net_InetAddress(JNIEnv* env) {
+  jniRegisterNativeMethods(env, "java/net/InetAddress", gMethods, NELEM(gMethods));
+}
diff --git a/ojluni/src/main/native/InetAddressImplFactory.c b/ojluni/src/main/native/InetAddressImplFactory.c
index feae950..e9ecc9a 100755
--- a/ojluni/src/main/native/InetAddressImplFactory.c
+++ b/ojluni/src/main/native/InetAddressImplFactory.c
@@ -26,6 +26,10 @@
 #include "java_net_InetAddressImplFactory.h"
 
 #include "net_util.h"
+#include "JNIHelp.h"
+
+#define NATIVE_METHOD(className, functionName, signature) \
+{ #functionName, signature, (void*)(className ## _ ## functionName) }
 
 /************************************************************************
  * InetAddressImplFactory
@@ -37,7 +41,7 @@
  * Signature: ()I
  */
 JNIEXPORT jboolean JNICALL
-Java_java_net_InetAddressImplFactory_isIPv6Supported(JNIEnv *env, jclass cls)
+InetAddressImplFactory_isIPv6Supported(JNIEnv *env, jclass cls)
 {
 #ifdef AF_INET6
     if (ipv6_available()) {
@@ -48,3 +52,11 @@
             return JNI_FALSE;
         }
 }
+
+static JNINativeMethod gMethods[] = {
+  NATIVE_METHOD(InetAddressImplFactory, isIPv6Supported, "()Z"),
+};
+
+void register_java_net_InetAddressImplFactory(JNIEnv* env) {
+  jniRegisterNativeMethods(env, "java/net/InetAddressImplFactory", gMethods, NELEM(gMethods));
+}
diff --git a/ojluni/src/main/native/NetworkInterface.c b/ojluni/src/main/native/NetworkInterface.c
index 6a31a61..b05d885 100755
--- a/ojluni/src/main/native/NetworkInterface.c
+++ b/ojluni/src/main/native/NetworkInterface.c
@@ -47,7 +47,7 @@
 
 #ifdef __linux__
 #include <sys/ioctl.h>
-#include <bits/ioctls.h>
+//#include <bits/ioctls.h>
 #include <sys/utsname.h>
 #include <stdio.h>
 #endif
@@ -72,6 +72,10 @@
 #include "jvm.h"
 #include "jni_util.h"
 #include "net_util.h"
+#include "JNIHelp.h"
+
+#define NATIVE_METHOD(className, functionName, signature) \
+{ #functionName, signature, (void*)(className ## _ ## functionName) }
 
 typedef struct _netaddr  {
     struct sockaddr *addr;
@@ -169,7 +173,7 @@
  * Signature: ()V
  */
 JNIEXPORT void JNICALL
-Java_java_net_NetworkInterface_init(JNIEnv *env, jclass cls) {
+NetworkInterface_init(JNIEnv *env, jclass cls) {
     ni_class = (*env)->FindClass(env,"java/net/NetworkInterface");
     ni_class = (*env)->NewGlobalRef(env, ni_class);
     ni_nameID = (*env)->GetFieldID(env, ni_class,"name", "Ljava/lang/String;");
@@ -206,7 +210,7 @@
  * Method:    getByName0
  * Signature: (Ljava/lang/String;)Ljava/net/NetworkInterface;
  */
-JNIEXPORT jobject JNICALL Java_java_net_NetworkInterface_getByName0
+JNIEXPORT jobject JNICALL NetworkInterface_getByName0
     (JNIEnv *env, jclass cls, jstring name) {
 
     netif *ifs, *curr;
@@ -250,7 +254,7 @@
  * Method:    getByIndex0
  * Signature: (Ljava/lang/String;)Ljava/net/NetworkInterface;
  */
-JNIEXPORT jobject JNICALL Java_java_net_NetworkInterface_getByIndex0
+JNIEXPORT jobject JNICALL NetworkInterface_getByIndex0
     (JNIEnv *env, jclass cls, jint index) {
 
     netif *ifs, *curr;
@@ -290,7 +294,7 @@
  * Method:    getByInetAddress0
  * Signature: (Ljava/net/InetAddress;)Ljava/net/NetworkInterface;
  */
-JNIEXPORT jobject JNICALL Java_java_net_NetworkInterface_getByInetAddress0
+JNIEXPORT jobject JNICALL NetworkInterface_getByInetAddress0
     (JNIEnv *env, jclass cls, jobject iaObj) {
 
     netif *ifs, *curr;
@@ -380,7 +384,7 @@
  * Method:    getAll
  * Signature: ()[Ljava/net/NetworkInterface;
  */
-JNIEXPORT jobjectArray JNICALL Java_java_net_NetworkInterface_getAll
+JNIEXPORT jobjectArray JNICALL NetworkInterface_getAll
     (JNIEnv *env, jclass cls) {
 
     netif *ifs, *curr;
@@ -438,7 +442,7 @@
  * Method:    isUp0
  * Signature: (Ljava/lang/String;I)Z
  */
-JNIEXPORT jboolean JNICALL Java_java_net_NetworkInterface_isUp0(JNIEnv *env, jclass cls, jstring name, jint index) {
+JNIEXPORT jboolean JNICALL NetworkInterface_isUp0(JNIEnv *env, jclass cls, jstring name, jint index) {
     int ret = getFlags0(env, name);
     return ((ret & IFF_UP) && (ret & IFF_RUNNING)) ? JNI_TRUE :  JNI_FALSE;
 }
@@ -448,7 +452,7 @@
  * Method:    isP2P0
  * Signature: (Ljava/lang/String;I)Z
  */
-JNIEXPORT jboolean JNICALL Java_java_net_NetworkInterface_isP2P0(JNIEnv *env, jclass cls, jstring name, jint index) {
+JNIEXPORT jboolean JNICALL NetworkInterface_isP2P0(JNIEnv *env, jclass cls, jstring name, jint index) {
     int ret = getFlags0(env, name);
     return (ret & IFF_POINTOPOINT) ? JNI_TRUE :  JNI_FALSE;
 }
@@ -458,9 +462,9 @@
  * Method:    isLoopback0
  * Signature: (Ljava/lang/String;I)Z
  */
-JNIEXPORT jboolean JNICALL Java_java_net_NetworkInterface_isLoopback0(JNIEnv *env, jclass cls, jstring name, jint index) {
-    int ret = getFlags0(env, name);
-    return (ret & IFF_LOOPBACK) ? JNI_TRUE :  JNI_FALSE;
+JNIEXPORT jboolean JNICALL NetworkInterface_isLoopback0(JNIEnv *env, jclass cls, jstring name, jint index) {
+  int ret = getFlags0(env, name);
+  return (ret & IFF_LOOPBACK) ? JNI_TRUE :  JNI_FALSE;
 }
 
 /*
@@ -468,9 +472,9 @@
  * Method:    supportsMulticast0
  * Signature: (Ljava/lang/String;I)Z
  */
-JNIEXPORT jboolean JNICALL Java_java_net_NetworkInterface_supportsMulticast0(JNIEnv *env, jclass cls, jstring name, jint index) {
-    int ret = getFlags0(env, name);
-    return (ret & IFF_MULTICAST) ? JNI_TRUE :  JNI_FALSE;
+JNIEXPORT jboolean JNICALL NetworkInterface_supportsMulticast0(JNIEnv *env, jclass cls, jstring name, jint index) {
+  int ret = getFlags0(env, name);
+  return (ret & IFF_MULTICAST) ? JNI_TRUE :  JNI_FALSE;
 }
 
 /*
@@ -478,50 +482,50 @@
  * Method:    getMacAddr0
  * Signature: ([bLjava/lang/String;I)[b
  */
-JNIEXPORT jbyteArray JNICALL Java_java_net_NetworkInterface_getMacAddr0(JNIEnv *env, jclass class, jbyteArray addrArray, jstring name, jint index) {
-    jint addr;
-    jbyte caddr[4];
-    struct in_addr iaddr;
-    jbyteArray ret = NULL;
-    unsigned char mac[16];
-    int len;
-    int sock;
-    jboolean isCopy;
-    const char* name_utf;
+JNIEXPORT jbyteArray JNICALL NetworkInterface_getMacAddr0(JNIEnv *env, jclass class, jbyteArray addrArray, jstring name, jint index) {
+  jint addr;
+  jbyte caddr[4];
+  struct in_addr iaddr;
+  jbyteArray ret = NULL;
+  unsigned char mac[16];
+  int len;
+  int sock;
+  jboolean isCopy;
+  const char* name_utf;
 
-    name_utf = (*env)->GetStringUTFChars(env, name, &isCopy);
+  name_utf = (*env)->GetStringUTFChars(env, name, &isCopy);
 
-    if ((sock =openSocketWithFallback(env, name_utf)) < 0) {
-       (*env)->ReleaseStringUTFChars(env, name, name_utf);
-       return JNI_FALSE;
+  if ((sock =openSocketWithFallback(env, name_utf)) < 0) {
+    (*env)->ReleaseStringUTFChars(env, name, name_utf);
+    return JNI_FALSE;
+  }
+
+
+  if (!IS_NULL(addrArray)) {
+    (*env)->GetByteArrayRegion(env, addrArray, 0, 4, caddr);
+    addr = ((caddr[0]<<24) & 0xff000000);
+    addr |= ((caddr[1] <<16) & 0xff0000);
+    addr |= ((caddr[2] <<8) & 0xff00);
+    addr |= (caddr[3] & 0xff);
+    iaddr.s_addr = htonl(addr);
+    len = getMacAddress(env, sock, name_utf, &iaddr, mac);
+  } else {
+    len = getMacAddress(env, sock, name_utf,NULL, mac);
+  }
+  if (len > 0) {
+    ret = (*env)->NewByteArray(env, len);
+    if (IS_NULL(ret)) {
+      /* we may have memory to free at the end of this */
+      goto fexit;
     }
+    (*env)->SetByteArrayRegion(env, ret, 0, len, (jbyte *) (mac));
+  }
+fexit:
+  /* release the UTF string and interface list */
+  (*env)->ReleaseStringUTFChars(env, name, name_utf);
 
-
-    if (!IS_NULL(addrArray)) {
-       (*env)->GetByteArrayRegion(env, addrArray, 0, 4, caddr);
-       addr = ((caddr[0]<<24) & 0xff000000);
-       addr |= ((caddr[1] <<16) & 0xff0000);
-       addr |= ((caddr[2] <<8) & 0xff00);
-       addr |= (caddr[3] & 0xff);
-       iaddr.s_addr = htonl(addr);
-       len = getMacAddress(env, sock, name_utf, &iaddr, mac);
-    } else {
-       len = getMacAddress(env, sock, name_utf,NULL, mac);
-    }
-    if (len > 0) {
-       ret = (*env)->NewByteArray(env, len);
-       if (IS_NULL(ret)) {
-          /* we may have memory to free at the end of this */
-          goto fexit;
-       }
-       (*env)->SetByteArrayRegion(env, ret, 0, len, (jbyte *) (mac));
-    }
- fexit:
-   /* release the UTF string and interface list */
-   (*env)->ReleaseStringUTFChars(env, name, name_utf);
-
-   close(sock);
-   return ret;
+  close(sock);
+  return ret;
 }
 
 /*
@@ -530,55 +534,55 @@
  * Signature:   ([bLjava/lang/String;I)I
  */
 
-JNIEXPORT jint JNICALL Java_java_net_NetworkInterface_getMTU0(JNIEnv *env, jclass class, jstring name, jint index) {
-    jboolean isCopy;
-    int ret = -1;
-    int sock;
-    const char* name_utf;
+JNIEXPORT jint JNICALL NetworkInterface_getMTU0(JNIEnv *env, jclass class, jstring name, jint index) {
+  jboolean isCopy;
+  int ret = -1;
+  int sock;
+  const char* name_utf;
 
-    name_utf = (*env)->GetStringUTFChars(env, name, &isCopy);
+  name_utf = (*env)->GetStringUTFChars(env, name, &isCopy);
 
-    if ((sock =openSocketWithFallback(env, name_utf)) < 0) {
-       (*env)->ReleaseStringUTFChars(env, name, name_utf);
-       return JNI_FALSE;
-    }
-
-    ret = getMTU(env, sock, name_utf);
-
+  if ((sock =openSocketWithFallback(env, name_utf)) < 0) {
     (*env)->ReleaseStringUTFChars(env, name, name_utf);
+    return JNI_FALSE;
+  }
 
-    close(sock);
-    return ret;
+  ret = getMTU(env, sock, name_utf);
+
+  (*env)->ReleaseStringUTFChars(env, name, name_utf);
+
+  close(sock);
+  return ret;
 }
 
 /*** Private methods definitions ****/
 
 static int getFlags0(JNIEnv *env, jstring name) {
-    jboolean isCopy;
-    int ret, sock;
-    const char* name_utf;
-    int flags = 0;
+  jboolean isCopy;
+  int ret, sock;
+  const char* name_utf;
+  int flags = 0;
 
-    name_utf = (*env)->GetStringUTFChars(env, name, &isCopy);
+  name_utf = (*env)->GetStringUTFChars(env, name, &isCopy);
 
-    if ((sock = openSocketWithFallback(env, name_utf)) < 0) {
-        (*env)->ReleaseStringUTFChars(env, name, name_utf);
-         return -1;
-    }
-
-    name_utf = (*env)->GetStringUTFChars(env, name, &isCopy);
-
-    ret = getFlags(sock, name_utf, &flags);
-
-    close(sock);
+  if ((sock = openSocketWithFallback(env, name_utf)) < 0) {
     (*env)->ReleaseStringUTFChars(env, name, name_utf);
+    return -1;
+  }
 
-    if (ret < 0) {
-        NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "IOCTL  SIOCGLIFFLAGS failed");
-        return -1;
-    }
+  name_utf = (*env)->GetStringUTFChars(env, name, &isCopy);
 
-    return flags;
+  ret = getFlags(sock, name_utf, &flags);
+
+  close(sock);
+  (*env)->ReleaseStringUTFChars(env, name, name_utf);
+
+  if (ret < 0) {
+    NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "IOCTL  SIOCGLIFFLAGS failed");
+    return -1;
+  }
+
+  return flags;
 }
 
 
@@ -590,442 +594,442 @@
  * interface.
  */
 jobject createNetworkInterface(JNIEnv *env, netif *ifs) {
-    jobject netifObj;
-    jobject name;
-    jobjectArray addrArr;
-    jobjectArray bindArr;
-    jobjectArray childArr;
-    netaddr *addrs;
-    jint addr_index, addr_count, bind_index;
-    jint child_count, child_index;
-    netaddr *addrP;
-    netif *childP;
-    jobject tmp;
+  jobject netifObj;
+  jobject name;
+  jobjectArray addrArr;
+  jobjectArray bindArr;
+  jobjectArray childArr;
+  netaddr *addrs;
+  jint addr_index, addr_count, bind_index;
+  jint child_count, child_index;
+  netaddr *addrP;
+  netif *childP;
+  jobject tmp;
 
-    /*
-     * Create a NetworkInterface object and populate it
-     */
-    netifObj = (*env)->NewObject(env, ni_class, ni_ctrID);
-    name = (*env)->NewStringUTF(env, ifs->name);
-    if (netifObj == NULL || name == NULL) {
-        return NULL;
-    }
-    (*env)->SetObjectField(env, netifObj, ni_nameID, name);
-    (*env)->SetObjectField(env, netifObj, ni_descID, name);
-    (*env)->SetIntField(env, netifObj, ni_indexID, ifs->index);
-    (*env)->SetBooleanField(env, netifObj, ni_virutalID, ifs->virtual ? JNI_TRUE : JNI_FALSE);
+  /*
+   * Create a NetworkInterface object and populate it
+   */
+  netifObj = (*env)->NewObject(env, ni_class, ni_ctrID);
+  name = (*env)->NewStringUTF(env, ifs->name);
+  if (netifObj == NULL || name == NULL) {
+    return NULL;
+  }
+  (*env)->SetObjectField(env, netifObj, ni_nameID, name);
+  (*env)->SetObjectField(env, netifObj, ni_descID, name);
+  (*env)->SetIntField(env, netifObj, ni_indexID, ifs->index);
+  (*env)->SetBooleanField(env, netifObj, ni_virutalID, ifs->virtual ? JNI_TRUE : JNI_FALSE);
 
-    /*
-     * Count the number of address on this interface
-     */
-    addr_count = 0;
-    addrP = ifs->addr;
-    while (addrP != NULL) {
-        addr_count++;
-        addrP = addrP->next;
-    }
+  /*
+   * Count the number of address on this interface
+   */
+  addr_count = 0;
+  addrP = ifs->addr;
+  while (addrP != NULL) {
+    addr_count++;
+    addrP = addrP->next;
+  }
 
-    /*
-     * Create the array of InetAddresses
-     */
-    addrArr = (*env)->NewObjectArray(env, addr_count,  ni_iacls, NULL);
-    if (addrArr == NULL) {
-        return NULL;
-    }
+  /*
+   * Create the array of InetAddresses
+   */
+  addrArr = (*env)->NewObjectArray(env, addr_count,  ni_iacls, NULL);
+  if (addrArr == NULL) {
+    return NULL;
+  }
 
-    bindArr = (*env)->NewObjectArray(env, addr_count, ni_ibcls, NULL);
-    if (bindArr == NULL) {
-       return NULL;
-    }
-    addrP = ifs->addr;
-    addr_index = 0;
-    bind_index = 0;
-    while (addrP != NULL) {
-        jobject iaObj = NULL;
-        jobject ibObj = NULL;
+  bindArr = (*env)->NewObjectArray(env, addr_count, ni_ibcls, NULL);
+  if (bindArr == NULL) {
+    return NULL;
+  }
+  addrP = ifs->addr;
+  addr_index = 0;
+  bind_index = 0;
+  while (addrP != NULL) {
+    jobject iaObj = NULL;
+    jobject ibObj = NULL;
 
-        if (addrP->family == AF_INET) {
-            iaObj = (*env)->NewObject(env, ni_ia4cls, ni_ia4ctrID);
-            if (iaObj) {
-                 setInetAddress_addr(env, iaObj, htonl(((struct sockaddr_in*)addrP->addr)->sin_addr.s_addr));
-            }
-            ibObj = (*env)->NewObject(env, ni_ibcls, ni_ibctrID);
-            if (ibObj) {
-                 (*env)->SetObjectField(env, ibObj, ni_ibaddressID, iaObj);
-                 if (addrP->brdcast) {
-                    jobject ia2Obj = NULL;
-                    ia2Obj = (*env)->NewObject(env, ni_ia4cls, ni_ia4ctrID);
-                    if (ia2Obj) {
-                       setInetAddress_addr(env, ia2Obj, htonl(((struct sockaddr_in*)addrP->brdcast)->sin_addr.s_addr));
-                       (*env)->SetObjectField(env, ibObj, ni_ib4broadcastID, ia2Obj);
-                       (*env)->SetShortField(env, ibObj, ni_ib4maskID, addrP->mask);
-                    }
-                 }
-                 (*env)->SetObjectArrayElement(env, bindArr, bind_index++, ibObj);
-            }
+    if (addrP->family == AF_INET) {
+      iaObj = (*env)->NewObject(env, ni_ia4cls, ni_ia4ctrID);
+      if (iaObj) {
+        setInetAddress_addr(env, iaObj, htonl(((struct sockaddr_in*)addrP->addr)->sin_addr.s_addr));
+      }
+      ibObj = (*env)->NewObject(env, ni_ibcls, ni_ibctrID);
+      if (ibObj) {
+        (*env)->SetObjectField(env, ibObj, ni_ibaddressID, iaObj);
+        if (addrP->brdcast) {
+          jobject ia2Obj = NULL;
+          ia2Obj = (*env)->NewObject(env, ni_ia4cls, ni_ia4ctrID);
+          if (ia2Obj) {
+            setInetAddress_addr(env, ia2Obj, htonl(((struct sockaddr_in*)addrP->brdcast)->sin_addr.s_addr));
+            (*env)->SetObjectField(env, ibObj, ni_ib4broadcastID, ia2Obj);
+            (*env)->SetShortField(env, ibObj, ni_ib4maskID, addrP->mask);
+          }
         }
+        (*env)->SetObjectArrayElement(env, bindArr, bind_index++, ibObj);
+      }
+    }
 
 #ifdef AF_INET6
-        if (addrP->family == AF_INET6) {
-            int scope=0;
-            iaObj = (*env)->NewObject(env, ni_ia6cls, ni_ia6ctrID);
-            if (iaObj) {
-                jbyteArray ipaddress = (*env)->NewByteArray(env, 16);
-                if (ipaddress == NULL) {
-                    return NULL;
-                }
-                (*env)->SetByteArrayRegion(env, ipaddress, 0, 16,
-                                                                        (jbyte *)&(((struct sockaddr_in6*)addrP->addr)->sin6_addr));
-
-                scope = ((struct sockaddr_in6*)addrP->addr)->sin6_scope_id;
-
-                if (scope != 0) { /* zero is default value, no need to set */
-                    (*env)->SetIntField(env, iaObj, ia6_scopeidID, scope);
-                    (*env)->SetBooleanField(env, iaObj, ia6_scopeidsetID, JNI_TRUE);
-                    (*env)->SetObjectField(env, iaObj, ia6_scopeifnameID, netifObj);
-                }
-                (*env)->SetObjectField(env, iaObj, ni_ia6ipaddressID, ipaddress);
-            }
-            ibObj = (*env)->NewObject(env, ni_ibcls, ni_ibctrID);
-            if (ibObj) {
-                (*env)->SetObjectField(env, ibObj, ni_ibaddressID, iaObj);
-                (*env)->SetShortField(env, ibObj, ni_ib4maskID, addrP->mask);
-                (*env)->SetObjectArrayElement(env, bindArr, bind_index++, ibObj);
-            }
+    if (addrP->family == AF_INET6) {
+      int scope=0;
+      iaObj = (*env)->NewObject(env, ni_ia6cls, ni_ia6ctrID);
+      if (iaObj) {
+        jbyteArray ipaddress = (*env)->NewByteArray(env, 16);
+        if (ipaddress == NULL) {
+          return NULL;
         }
+        (*env)->SetByteArrayRegion(env, ipaddress, 0, 16,
+                                   (jbyte *)&(((struct sockaddr_in6*)addrP->addr)->sin6_addr));
+
+        scope = ((struct sockaddr_in6*)addrP->addr)->sin6_scope_id;
+
+        if (scope != 0) { /* zero is default value, no need to set */
+          (*env)->SetIntField(env, iaObj, ia6_scopeidID, scope);
+          (*env)->SetBooleanField(env, iaObj, ia6_scopeidsetID, JNI_TRUE);
+          (*env)->SetObjectField(env, iaObj, ia6_scopeifnameID, netifObj);
+        }
+        (*env)->SetObjectField(env, iaObj, ni_ia6ipaddressID, ipaddress);
+      }
+      ibObj = (*env)->NewObject(env, ni_ibcls, ni_ibctrID);
+      if (ibObj) {
+        (*env)->SetObjectField(env, ibObj, ni_ibaddressID, iaObj);
+        (*env)->SetShortField(env, ibObj, ni_ib4maskID, addrP->mask);
+        (*env)->SetObjectArrayElement(env, bindArr, bind_index++, ibObj);
+      }
+    }
 #endif
 
-        if (iaObj == NULL) {
-            return NULL;
-        }
-
-        (*env)->SetObjectArrayElement(env, addrArr, addr_index++, iaObj);
-        addrP = addrP->next;
+    if (iaObj == NULL) {
+      return NULL;
     }
 
-    /*
-     * See if there is any virtual interface attached to this one.
-     */
-    child_count = 0;
-    childP = ifs->childs;
-    while (childP) {
-        child_count++;
-        childP = childP->next;
-    }
+    (*env)->SetObjectArrayElement(env, addrArr, addr_index++, iaObj);
+    addrP = addrP->next;
+  }
 
-    childArr = (*env)->NewObjectArray(env, child_count, ni_class, NULL);
-    if (childArr == NULL) {
-        return NULL;
-    }
+  /*
+   * See if there is any virtual interface attached to this one.
+   */
+  child_count = 0;
+  childP = ifs->childs;
+  while (childP) {
+    child_count++;
+    childP = childP->next;
+  }
 
-    /*
-     * Create the NetworkInterface instances for the sub-interfaces as
-     * well.
-     */
-    child_index = 0;
-    childP = ifs->childs;
-    while(childP) {
-      tmp = createNetworkInterface(env, childP);
-      if (tmp == NULL) {
-         return NULL;
-      }
-      (*env)->SetObjectField(env, tmp, ni_parentID, netifObj);
-      (*env)->SetObjectArrayElement(env, childArr, child_index++, tmp);
-      childP = childP->next;
-    }
-    (*env)->SetObjectField(env, netifObj, ni_addrsID, addrArr);
-    (*env)->SetObjectField(env, netifObj, ni_bindsID, bindArr);
-    (*env)->SetObjectField(env, netifObj, ni_childsID, childArr);
+  childArr = (*env)->NewObjectArray(env, child_count, ni_class, NULL);
+  if (childArr == NULL) {
+    return NULL;
+  }
 
-    /* return the NetworkInterface */
-    return netifObj;
+  /*
+   * Create the NetworkInterface instances for the sub-interfaces as
+   * well.
+   */
+  child_index = 0;
+  childP = ifs->childs;
+  while(childP) {
+    tmp = createNetworkInterface(env, childP);
+    if (tmp == NULL) {
+      return NULL;
+    }
+    (*env)->SetObjectField(env, tmp, ni_parentID, netifObj);
+    (*env)->SetObjectArrayElement(env, childArr, child_index++, tmp);
+    childP = childP->next;
+  }
+  (*env)->SetObjectField(env, netifObj, ni_addrsID, addrArr);
+  (*env)->SetObjectField(env, netifObj, ni_bindsID, bindArr);
+  (*env)->SetObjectField(env, netifObj, ni_childsID, childArr);
+
+  /* return the NetworkInterface */
+  return netifObj;
 }
 
 /*
  * Enumerates all interfaces
  */
 static netif *enumInterfaces(JNIEnv *env) {
-    netif *ifs;
-    int sock;
+  netif *ifs;
+  int sock;
 
-    /*
-     * Enumerate IPv4 addresses
-     */
+  /*
+   * Enumerate IPv4 addresses
+   */
 
-    sock = openSocket(env, AF_INET);
-    if (sock < 0 && (*env)->ExceptionOccurred(env)) {
-        return NULL;
-    }
+  sock = openSocket(env, AF_INET);
+  if (sock < 0 && (*env)->ExceptionOccurred(env)) {
+    return NULL;
+  }
 
-    ifs = enumIPv4Interfaces(env, sock, NULL);
-    close(sock);
+  ifs = enumIPv4Interfaces(env, sock, NULL);
+  close(sock);
 
-    if (ifs == NULL && (*env)->ExceptionOccurred(env)) {
-        return NULL;
-    }
+  if (ifs == NULL && (*env)->ExceptionOccurred(env)) {
+    return NULL;
+  }
 
-    /* return partial list if exception occure in the middle of process ???*/
+  /* return partial list if exception occure in the middle of process ???*/
 
-    /*
-     * If IPv6 is available then enumerate IPv6 addresses.
-     */
+  /*
+   * If IPv6 is available then enumerate IPv6 addresses.
+   */
 #ifdef AF_INET6
 
-        /* User can disable ipv6 expicitly by -Djava.net.preferIPv4Stack=true,
-         * so we have to call ipv6_available()
-         */
-        if (ipv6_available()) {
+  /* User can disable ipv6 expicitly by -Djava.net.preferIPv4Stack=true,
+   * so we have to call ipv6_available()
+   */
+  if (ipv6_available()) {
 
-           sock =  openSocket(env, AF_INET6);
-           if (sock < 0 && (*env)->ExceptionOccurred(env)) {
-               freeif(ifs);
-               return NULL;
-           }
+    sock =  openSocket(env, AF_INET6);
+    if (sock < 0 && (*env)->ExceptionOccurred(env)) {
+      freeif(ifs);
+      return NULL;
+    }
 
-           ifs = enumIPv6Interfaces(env, sock, ifs);
-           close(sock);
+    ifs = enumIPv6Interfaces(env, sock, ifs);
+    close(sock);
 
-           if ((*env)->ExceptionOccurred(env)) {
-              freeif(ifs);
-              return NULL;
-           }
+    if ((*env)->ExceptionOccurred(env)) {
+      freeif(ifs);
+      return NULL;
+    }
 
-       }
+  }
 #endif
 
-    return ifs;
+  return ifs;
 }
 
 #define CHECKED_MALLOC3(_pointer,_type,_size) \
-       do{ \
-        _pointer = (_type)malloc( _size ); \
-        if (_pointer == NULL) { \
-            JNU_ThrowOutOfMemoryError(env, "Native heap allocation failed"); \
-            return ifs; /* return untouched list */ \
-        } \
-       } while(0)
+    do{ \
+      _pointer = (_type)malloc( _size ); \
+      if (_pointer == NULL) { \
+        JNU_ThrowOutOfMemoryError(env, "Native heap allocation failed"); \
+        return ifs; /* return untouched list */ \
+      } \
+    } while(0)
 
 
 /*
  * Free an interface list (including any attached addresses)
  */
 void freeif(netif *ifs) {
-    netif *currif = ifs;
-    netif *child = NULL;
+  netif *currif = ifs;
+  netif *child = NULL;
 
-    while (currif != NULL) {
-        netaddr *addrP = currif->addr;
-        while (addrP != NULL) {
-            netaddr *next = addrP->next;
-            free(addrP);
-            addrP = next;
-         }
-
-            /*
-            * Don't forget to free the sub-interfaces.
-            */
-          if (currif->childs != NULL) {
-                freeif(currif->childs);
-          }
-
-          ifs = currif->next;
-          free(currif);
-          currif = ifs;
+  while (currif != NULL) {
+    netaddr *addrP = currif->addr;
+    while (addrP != NULL) {
+      netaddr *next = addrP->next;
+      free(addrP);
+      addrP = next;
     }
+
+    /*
+     * Don't forget to free the sub-interfaces.
+     */
+    if (currif->childs != NULL) {
+      freeif(currif->childs);
+    }
+
+    ifs = currif->next;
+    free(currif);
+    currif = ifs;
+  }
 }
 
 netif *addif(JNIEnv *env, int sock, const char * if_name,
              netif *ifs, struct sockaddr* ifr_addrP, int family,
              short prefix)
 {
-    netif *currif = ifs, *parent;
-    netaddr *addrP;
+  netif *currif = ifs, *parent;
+  netaddr *addrP;
 
 #ifdef LIFNAMSIZ
-    int ifnam_size = LIFNAMSIZ;
-    char name[LIFNAMSIZ], vname[LIFNAMSIZ];
+  int ifnam_size = LIFNAMSIZ;
+  char name[LIFNAMSIZ], vname[LIFNAMSIZ];
 #else
-    int ifnam_size = IFNAMSIZ;
-    char name[IFNAMSIZ], vname[IFNAMSIZ];
+  int ifnam_size = IFNAMSIZ;
+  char name[IFNAMSIZ], vname[IFNAMSIZ];
 #endif
 
-    char  *name_colonP;
-    int mask;
-    int isVirtual = 0;
-    int addr_size;
-    int flags = 0;
+  char  *name_colonP;
+  int mask;
+  int isVirtual = 0;
+  int addr_size;
+  int flags = 0;
 
-    /*
-     * If the interface name is a logical interface then we
-     * remove the unit number so that we have the physical
-     * interface (eg: hme0:1 -> hme0). NetworkInterface
-     * currently doesn't have any concept of physical vs.
-     * logical interfaces.
-     */
-    strncpy(name, if_name, ifnam_size);
-    name[ifnam_size - 1] = '\0';
-    *vname = 0;
+  /*
+   * If the interface name is a logical interface then we
+   * remove the unit number so that we have the physical
+   * interface (eg: hme0:1 -> hme0). NetworkInterface
+   * currently doesn't have any concept of physical vs.
+   * logical interfaces.
+   */
+  strncpy(name, if_name, ifnam_size);
+  name[ifnam_size - 1] = '\0';
+  *vname = 0;
 
-    /*
-     * Create and populate the netaddr node. If allocation fails
-     * return an un-updated list.
-     */
-    /*Allocate for addr and brdcast at once*/
+  /*
+   * Create and populate the netaddr node. If allocation fails
+   * return an un-updated list.
+   */
+  /*Allocate for addr and brdcast at once*/
 
 #ifdef AF_INET6
-    addr_size = (family == AF_INET) ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6);
+  addr_size = (family == AF_INET) ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6);
 #else
-    addr_size = sizeof(struct sockaddr_in);
+  addr_size = sizeof(struct sockaddr_in);
 #endif
 
-    CHECKED_MALLOC3(addrP, netaddr *, sizeof(netaddr)+2*addr_size);
-    addrP->addr = (struct sockaddr *)( (char *) addrP+sizeof(netaddr) );
-    memcpy(addrP->addr, ifr_addrP, addr_size);
+  CHECKED_MALLOC3(addrP, netaddr *, sizeof(netaddr)+2*addr_size);
+  addrP->addr = (struct sockaddr *)( (char *) addrP+sizeof(netaddr) );
+  memcpy(addrP->addr, ifr_addrP, addr_size);
 
-    addrP->family = family;
-    addrP->brdcast = NULL;
-    addrP->mask = prefix;
-    addrP->next = 0;
-    if (family == AF_INET) {
-      /*
-       * Deal with brodcast addr & subnet mask
-       */
-       struct sockaddr * brdcast_to = (struct sockaddr *) ((char *) addrP + sizeof(netaddr) + addr_size);
-       addrP->brdcast = getBroadcast(env, sock, name,  brdcast_to );
-
-       if (addrP->brdcast && (mask = getSubnet(env, sock, name)) != -1) {
-           addrP->mask = mask;
-       }
-     }
-
-    /**
-     * Deal with virtual interface with colon notaion e.g. eth0:1
-     */
-    name_colonP = strchr(name, ':');
-    if (name_colonP != NULL) {
-      /**
-       * This is a virtual interface. If we are able to access the parent
-       * we need to create a new entry if it doesn't exist yet *and* update
-       * the 'parent' interface with the new records.
-       */
-        *name_colonP = 0;
-        if (getFlags(sock, name, &flags) < 0 || flags < 0) {
-            // failed to access parent interface do not create parent.
-            // We are a virtual interface with no parent.
-            isVirtual = 1;
-            *name_colonP = ':';
-        }
-        else{
-           // Got access to parent, so create it if necessary.
-           // Save original name to vname and truncate name by ':'
-            memcpy(vname, name, sizeof(vname) );
-            vname[name_colonP - name] = ':';
-        }
-    }
-
+  addrP->family = family;
+  addrP->brdcast = NULL;
+  addrP->mask = prefix;
+  addrP->next = 0;
+  if (family == AF_INET) {
     /*
-     * Check if this is a "new" interface. Use the interface
-     * name for matching because index isn't supported on
-     * Solaris 2.6 & 7.
+     * Deal with brodcast addr & subnet mask
      */
+    struct sockaddr * brdcast_to = (struct sockaddr *) ((char *) addrP + sizeof(netaddr) + addr_size);
+    addrP->brdcast = getBroadcast(env, sock, name,  brdcast_to );
+
+    if (addrP->brdcast && (mask = getSubnet(env, sock, name)) != -1) {
+      addrP->mask = mask;
+    }
+  }
+
+  /**
+   * Deal with virtual interface with colon notaion e.g. eth0:1
+   */
+  name_colonP = strchr(name, ':');
+  if (name_colonP != NULL) {
+    /**
+     * This is a virtual interface. If we are able to access the parent
+     * we need to create a new entry if it doesn't exist yet *and* update
+     * the 'parent' interface with the new records.
+     */
+    *name_colonP = 0;
+    if (getFlags(sock, name, &flags) < 0 || flags < 0) {
+      // failed to access parent interface do not create parent.
+      // We are a virtual interface with no parent.
+      isVirtual = 1;
+      *name_colonP = ':';
+    }
+    else{
+      // Got access to parent, so create it if necessary.
+      // Save original name to vname and truncate name by ':'
+      memcpy(vname, name, sizeof(vname) );
+      vname[name_colonP - name] = ':';
+    }
+  }
+
+  /*
+   * Check if this is a "new" interface. Use the interface
+   * name for matching because index isn't supported on
+   * Solaris 2.6 & 7.
+   */
+  while (currif != NULL) {
+    if (strcmp(name, currif->name) == 0) {
+      break;
+    }
+    currif = currif->next;
+  }
+
+  /*
+   * If "new" then create an netif structure and
+   * insert it onto the list.
+   */
+  if (currif == NULL) {
+    CHECKED_MALLOC3(currif, netif *, sizeof(netif) + ifnam_size);
+    currif->name = (char *) currif+sizeof(netif);
+    strncpy(currif->name, name, ifnam_size);
+    currif->name[ifnam_size - 1] = '\0';
+    currif->index = getIndex(sock, name);
+    currif->addr = NULL;
+    currif->childs = NULL;
+    currif->virtual = isVirtual;
+    currif->next = ifs;
+    ifs = currif;
+  }
+
+  /*
+   * Finally insert the address on the interface
+   */
+  addrP->next = currif->addr;
+  currif->addr = addrP;
+
+  parent = currif;
+
+  /**
+   * Let's deal with the virtual interface now.
+   */
+  if (vname[0]) {
+    netaddr *tmpaddr;
+
+    currif = parent->childs;
+
     while (currif != NULL) {
-        if (strcmp(name, currif->name) == 0) {
-            break;
-        }
-        currif = currif->next;
+      if (strcmp(vname, currif->name) == 0) {
+        break;
+      }
+      currif = currif->next;
     }
 
-    /*
-     * If "new" then create an netif structure and
-     * insert it onto the list.
-     */
     if (currif == NULL) {
-         CHECKED_MALLOC3(currif, netif *, sizeof(netif) + ifnam_size);
-         currif->name = (char *) currif+sizeof(netif);
-         strncpy(currif->name, name, ifnam_size);
-         currif->name[ifnam_size - 1] = '\0';
-         currif->index = getIndex(sock, name);
-         currif->addr = NULL;
-         currif->childs = NULL;
-         currif->virtual = isVirtual;
-         currif->next = ifs;
-         ifs = currif;
+      CHECKED_MALLOC3(currif, netif *, sizeof(netif) + ifnam_size);
+      currif->name = (char *) currif + sizeof(netif);
+      strncpy(currif->name, vname, ifnam_size);
+      currif->name[ifnam_size - 1] = '\0';
+      currif->index = getIndex(sock, vname);
+      currif->addr = NULL;
+      /* Need to duplicate the addr entry? */
+      currif->virtual = 1;
+      currif->childs = NULL;
+      currif->next = parent->childs;
+      parent->childs = currif;
     }
 
-    /*
-     * Finally insert the address on the interface
-     */
-    addrP->next = currif->addr;
-    currif->addr = addrP;
-
-    parent = currif;
-
-    /**
-     * Let's deal with the virtual interface now.
-     */
-    if (vname[0]) {
-        netaddr *tmpaddr;
-
-        currif = parent->childs;
-
-        while (currif != NULL) {
-            if (strcmp(vname, currif->name) == 0) {
-                break;
-            }
-            currif = currif->next;
-        }
-
-        if (currif == NULL) {
-            CHECKED_MALLOC3(currif, netif *, sizeof(netif) + ifnam_size);
-            currif->name = (char *) currif + sizeof(netif);
-            strncpy(currif->name, vname, ifnam_size);
-            currif->name[ifnam_size - 1] = '\0';
-            currif->index = getIndex(sock, vname);
-            currif->addr = NULL;
-           /* Need to duplicate the addr entry? */
-            currif->virtual = 1;
-            currif->childs = NULL;
-            currif->next = parent->childs;
-            parent->childs = currif;
-        }
-
-        CHECKED_MALLOC3(tmpaddr, netaddr *, sizeof(netaddr)+2*addr_size);
-        memcpy(tmpaddr, addrP, sizeof(netaddr));
-        if (addrP->addr != NULL) {
-            tmpaddr->addr = (struct sockaddr *) ( (char*)tmpaddr + sizeof(netaddr) ) ;
-            memcpy(tmpaddr->addr, addrP->addr, addr_size);
-        }
-
-        if (addrP->brdcast != NULL) {
-            tmpaddr->brdcast = (struct sockaddr *) ((char *) tmpaddr + sizeof(netaddr)+addr_size);
-            memcpy(tmpaddr->brdcast, addrP->brdcast, addr_size);
-        }
-
-        tmpaddr->next = currif->addr;
-        currif->addr = tmpaddr;
+    CHECKED_MALLOC3(tmpaddr, netaddr *, sizeof(netaddr)+2*addr_size);
+    memcpy(tmpaddr, addrP, sizeof(netaddr));
+    if (addrP->addr != NULL) {
+      tmpaddr->addr = (struct sockaddr *) ( (char*)tmpaddr + sizeof(netaddr) ) ;
+      memcpy(tmpaddr->addr, addrP->addr, addr_size);
     }
 
-    return ifs;
+    if (addrP->brdcast != NULL) {
+      tmpaddr->brdcast = (struct sockaddr *) ((char *) tmpaddr + sizeof(netaddr)+addr_size);
+      memcpy(tmpaddr->brdcast, addrP->brdcast, addr_size);
+    }
+
+    tmpaddr->next = currif->addr;
+    currif->addr = tmpaddr;
+  }
+
+  return ifs;
 }
 
 /* Open socket for further ioct calls
  * proto is AF_INET/AF_INET6
  */
 static int  openSocket(JNIEnv *env, int proto){
-    int sock;
+  int sock;
 
-    if ((sock = JVM_Socket(proto, SOCK_DGRAM, 0)) < 0) {
-        /*
-         * If EPROTONOSUPPORT is returned it means we don't have
-         * support  for this proto so don't throw an exception.
-         */
-        if (errno != EPROTONOSUPPORT) {
-            NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException", "Socket creation failed");
-        }
-        return -1;
+  if ((sock = JVM_Socket(proto, SOCK_DGRAM, 0)) < 0) {
+    /*
+     * If EPROTONOSUPPORT is returned it means we don't have
+     * support  for this proto so don't throw an exception.
+     */
+    if (errno != EPROTONOSUPPORT) {
+      NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException", "Socket creation failed");
     }
+    return -1;
+  }
 
-    return sock;
+  return sock;
 }
 
 
@@ -1037,85 +1041,85 @@
 
 #ifdef AF_INET6
 static int openSocketWithFallback(JNIEnv *env, const char *ifname){
-    int sock;
-    struct ifreq if2;
+  int sock;
+  struct ifreq if2;
 
-     if ((sock = JVM_Socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
-         if (errno == EPROTONOSUPPORT){
-              if ( (sock = JVM_Socket(AF_INET6, SOCK_DGRAM, 0)) < 0 ){
-                 NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException", "IPV6 Socket creation failed");
-                 return -1;
-              }
-         }
-         else{ // errno is not NOSUPPORT
-             NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException", "IPV4 Socket creation failed");
-             return -1;
-         }
-   }
+  if ((sock = JVM_Socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
+    if (errno == EPROTONOSUPPORT){
+      if ( (sock = JVM_Socket(AF_INET6, SOCK_DGRAM, 0)) < 0 ){
+        NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException", "IPV6 Socket creation failed");
+        return -1;
+      }
+    }
+    else{ // errno is not NOSUPPORT
+      NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException", "IPV4 Socket creation failed");
+      return -1;
+    }
+  }
 
-     /* Linux starting from 2.6.? kernel allows ioctl call with either IPv4 or IPv6 socket regardless of type
-        of address of an interface */
+  /* Linux starting from 2.6.? kernel allows ioctl call with either IPv4 or IPv6 socket regardless of type
+     of address of an interface */
 
-       return sock;
+  return sock;
 }
 
 #else
 static int openSocketWithFallback(JNIEnv *env, const char *ifname){
-    return openSocket(env,AF_INET);
+  return openSocket(env,AF_INET);
 }
 #endif
 
 static netif *enumIPv4Interfaces(JNIEnv *env, int sock, netif *ifs) {
-    struct ifconf ifc;
-    struct ifreq *ifreqP;
-    char *buf;
-    int numifs;
-    unsigned i;
+  struct ifconf ifc;
+  struct ifreq *ifreqP;
+  char *buf;
+  int numifs;
+  unsigned i;
 
 
-    /* need to do a dummy SIOCGIFCONF to determine the buffer size.
-     * SIOCGIFCOUNT doesn't work
-     */
-    ifc.ifc_buf = NULL;
-    if (ioctl(sock, SIOCGIFCONF, (char *)&ifc) < 0) {
-        NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException", "ioctl SIOCGIFCONF failed");
-        return ifs;
-    }
-
-    CHECKED_MALLOC3(buf,char *, ifc.ifc_len);
-
-    ifc.ifc_buf = buf;
-    if (ioctl(sock, SIOCGIFCONF, (char *)&ifc) < 0) {
-        NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException", "ioctl SIOCGIFCONF failed");
-        (void) free(buf);
-        return ifs;
-    }
-
-    /*
-     * Iterate through each interface
-     */
-    ifreqP = ifc.ifc_req;
-    for (i=0; i<ifc.ifc_len/sizeof (struct ifreq); i++, ifreqP++) {
-        /*
-         * Add to the list
-         */
-        ifs = addif(env, sock, ifreqP->ifr_name, ifs, (struct sockaddr *) & (ifreqP->ifr_addr), AF_INET, 0);
-
-        /*
-         * If an exception occurred then free the list
-         */
-        if ((*env)->ExceptionOccurred(env)) {
-            free(buf);
-            freeif(ifs);
-            return NULL;
-        }
-    }
-
-    /*
-     * Free socket and buffer
-     */
-    free(buf);
+  /* need to do a dummy SIOCGIFCONF to determine the buffer size.
+   * SIOCGIFCOUNT doesn't work
+   */
+  ifc.ifc_buf = NULL;
+  if (ioctl(sock, SIOCGIFCONF, (char *)&ifc) < 0) {
+    NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException", "ioctl SIOCGIFCONF failed");
     return ifs;
+  }
+
+  CHECKED_MALLOC3(buf,char *, ifc.ifc_len);
+
+  ifc.ifc_buf = buf;
+  if (ioctl(sock, SIOCGIFCONF, (char *)&ifc) < 0) {
+    NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException", "ioctl SIOCGIFCONF failed");
+    (void) free(buf);
+    return ifs;
+  }
+
+  /*
+   * Iterate through each interface
+   */
+  ifreqP = ifc.ifc_req;
+  for (i=0; i<ifc.ifc_len/sizeof (struct ifreq); i++, ifreqP++) {
+    /*
+     * Add to the list
+     */
+    ifs = addif(env, sock, ifreqP->ifr_name, ifs, (struct sockaddr *) & (ifreqP->ifr_addr), AF_INET, 0);
+
+    /*
+     * If an exception occurred then free the list
+     */
+    if ((*env)->ExceptionOccurred(env)) {
+      free(buf);
+      freeif(ifs);
+      return NULL;
+    }
+  }
+
+  /*
+   * Free socket and buffer
+   */
+  free(buf);
+  return ifs;
 }
 
 
@@ -1125,61 +1129,61 @@
 
 #ifdef AF_INET6
 static netif *enumIPv6Interfaces(JNIEnv *env, int sock, netif *ifs) {
-    FILE *f;
-    char addr6[40], devname[21];
-    char addr6p[8][5];
-    int plen, scope, dad_status, if_idx;
-    uint8_t ipv6addr[16];
+  FILE *f;
+  char addr6[40], devname[21];
+  char addr6p[8][5];
+  int plen, scope, dad_status, if_idx;
+  uint8_t ipv6addr[16];
 
-    if ((f = fopen(_PATH_PROCNET_IFINET6, "r")) != NULL) {
-        while (fscanf(f, "%4s%4s%4s%4s%4s%4s%4s%4s %08x %02x %02x %02x %20s\n",
-                         addr6p[0], addr6p[1], addr6p[2], addr6p[3], addr6p[4], addr6p[5], addr6p[6], addr6p[7],
-                         &if_idx, &plen, &scope, &dad_status, devname) != EOF) {
+  if ((f = fopen(_PATH_PROCNET_IFINET6, "r")) != NULL) {
+    while (fscanf(f, "%4s%4s%4s%4s%4s%4s%4s%4s %08x %02x %02x %02x %20s\n",
+                  addr6p[0], addr6p[1], addr6p[2], addr6p[3], addr6p[4], addr6p[5], addr6p[6], addr6p[7],
+                  &if_idx, &plen, &scope, &dad_status, devname) != EOF) {
 
-            struct netif *ifs_ptr = NULL;
-            struct netif *last_ptr = NULL;
-            struct sockaddr_in6 addr;
+      struct netif *ifs_ptr = NULL;
+      struct netif *last_ptr = NULL;
+      struct sockaddr_in6 addr;
 
-            sprintf(addr6, "%s:%s:%s:%s:%s:%s:%s:%s",
-                           addr6p[0], addr6p[1], addr6p[2], addr6p[3], addr6p[4], addr6p[5], addr6p[6], addr6p[7]);
-            inet_pton(AF_INET6, addr6, ipv6addr);
+      sprintf(addr6, "%s:%s:%s:%s:%s:%s:%s:%s",
+              addr6p[0], addr6p[1], addr6p[2], addr6p[3], addr6p[4], addr6p[5], addr6p[6], addr6p[7]);
+      inet_pton(AF_INET6, addr6, ipv6addr);
 
-            memset(&addr, 0, sizeof(struct sockaddr_in6));
-            memcpy((void*)addr.sin6_addr.s6_addr, (const void*)ipv6addr, 16);
+      memset(&addr, 0, sizeof(struct sockaddr_in6));
+      memcpy((void*)addr.sin6_addr.s6_addr, (const void*)ipv6addr, 16);
 
-            addr.sin6_scope_id = if_idx;
+      addr.sin6_scope_id = if_idx;
 
-            ifs = addif(env, sock, devname, ifs, (struct sockaddr *)&addr, AF_INET6, plen);
+      ifs = addif(env, sock, devname, ifs, (struct sockaddr *)&addr, AF_INET6, plen);
 
 
-            /*
-             * If an exception occurred then return the list as is.
-             */
-            if ((*env)->ExceptionOccurred(env)) {
-                fclose(f);
-                return ifs;
-            }
-       }
-       fclose(f);
+      /*
+       * If an exception occurred then return the list as is.
+       */
+      if ((*env)->ExceptionOccurred(env)) {
+        fclose(f);
+        return ifs;
+      }
     }
-    return ifs;
+    fclose(f);
+  }
+  return ifs;
 }
 #endif
 
 
 static int getIndex(int sock, const char *name){
-     /*
-      * Try to get the interface index
-      * (Not supported on Solaris 2.6 or 7)
-      */
-    struct ifreq if2;
-    strcpy(if2.ifr_name, name);
+  /*
+   * Try to get the interface index
+   * (Not supported on Solaris 2.6 or 7)
+   */
+  struct ifreq if2;
+  strcpy(if2.ifr_name, name);
 
-    if (ioctl(sock, SIOCGIFINDEX, (char *)&if2) < 0) {
-        return -1;
-    }
+  if (ioctl(sock, SIOCGIFINDEX, (char *)&if2) < 0) {
+    return -1;
+  }
 
-    return if2.ifr_ifindex;
+  return if2.ifr_ifindex;
 }
 
 /**
@@ -1195,19 +1199,19 @@
 
   /* Let's make sure the interface does have a broadcast address */
   if (ioctl(sock, SIOCGIFFLAGS, (char *)&if2)  < 0) {
-      NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "IOCTL  SIOCGIFFLAGS failed");
-      return ret;
+    NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "IOCTL  SIOCGIFFLAGS failed");
+    return ret;
   }
 
   if (if2.ifr_flags & IFF_BROADCAST) {
-      /* It does, let's retrieve it*/
-      if (ioctl(sock, SIOCGIFBRDADDR, (char *)&if2) < 0) {
-          NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "IOCTL SIOCGIFBRDADDR failed");
-          return ret;
-      }
+    /* It does, let's retrieve it*/
+    if (ioctl(sock, SIOCGIFBRDADDR, (char *)&if2) < 0) {
+      NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "IOCTL SIOCGIFBRDADDR failed");
+      return ret;
+    }
 
-      ret = brdcast_store;
-      memcpy(ret, &if2.ifr_broadaddr, sizeof(struct sockaddr));
+    ret = brdcast_store;
+    memcpy(ret, &if2.ifr_broadaddr, sizeof(struct sockaddr));
   }
 
   return ret;
@@ -1218,26 +1222,26 @@
  * interface, if it has one, otherwise return -1.
  */
 static short getSubnet(JNIEnv *env, int sock, const char *ifname) {
-    unsigned int mask;
-    short ret;
-    struct ifreq if2;
+  unsigned int mask;
+  short ret;
+  struct ifreq if2;
 
-    memset((char *) &if2, 0, sizeof(if2));
-    strcpy(if2.ifr_name, ifname);
+  memset((char *) &if2, 0, sizeof(if2));
+  strcpy(if2.ifr_name, ifname);
 
-    if (ioctl(sock, SIOCGIFNETMASK, (char *)&if2) < 0) {
-        NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "IOCTL SIOCGIFNETMASK failed");
-        return -1;
-    }
+  if (ioctl(sock, SIOCGIFNETMASK, (char *)&if2) < 0) {
+    NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "IOCTL SIOCGIFNETMASK failed");
+    return -1;
+  }
 
-    mask = ntohl(((struct sockaddr_in*)&(if2.ifr_addr))->sin_addr.s_addr);
-    ret = 0;
-    while (mask) {
-       mask <<= 1;
-       ret++;
-    }
+  mask = ntohl(((struct sockaddr_in*)&(if2.ifr_addr))->sin_addr.s_addr);
+  ret = 0;
+  while (mask) {
+    mask <<= 1;
+    ret++;
+  }
 
-    return ret;
+  return ret;
 }
 
 /**
@@ -1246,41 +1250,41 @@
  * MAC address. Returns -1 if there is no hardware address on that interface.
  */
 static int getMacAddress(JNIEnv *env, int sock, const char* ifname, const struct in_addr* addr, unsigned char *buf) {
-    static struct ifreq ifr;
-    int i;
+  static struct ifreq ifr;
+  int i;
 
-    strcpy(ifr.ifr_name, ifname);
-    if (ioctl(sock, SIOCGIFHWADDR, &ifr) < 0) {
-        NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "IOCTL SIOCGIFHWADDR failed");
-        return -1;
-    }
-
-    memcpy(buf, &ifr.ifr_hwaddr.sa_data, IFHWADDRLEN);
-
-   /*
-    * All bytes to 0 means no hardware address.
-    */
-
-    for (i = 0; i < IFHWADDRLEN; i++) {
-        if (buf[i] != 0)
-            return IFHWADDRLEN;
-    }
-
+  strcpy(ifr.ifr_name, ifname);
+  if (ioctl(sock, SIOCGIFHWADDR, &ifr) < 0) {
+    NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "IOCTL SIOCGIFHWADDR failed");
     return -1;
+  }
+
+  memcpy(buf, &ifr.ifr_hwaddr.sa_data, IFHWADDRLEN);
+
+  /*
+   * All bytes to 0 means no hardware address.
+   */
+
+  for (i = 0; i < IFHWADDRLEN; i++) {
+    if (buf[i] != 0)
+      return IFHWADDRLEN;
+  }
+
+  return -1;
 }
 
 static int getMTU(JNIEnv *env, int sock,  const char *ifname) {
-    struct ifreq if2;
+  struct ifreq if2;
 
-    memset((char *) &if2, 0, sizeof(if2));
-    strcpy(if2.ifr_name, ifname);
+  memset((char *) &if2, 0, sizeof(if2));
+  strcpy(if2.ifr_name, ifname);
 
-    if (ioctl(sock, SIOCGIFMTU, (char *)&if2) < 0) {
-        NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "IOCTL SIOCGIFMTU failed");
-        return -1;
-    }
+  if (ioctl(sock, SIOCGIFMTU, (char *)&if2) < 0) {
+    NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "IOCTL SIOCGIFMTU failed");
+    return -1;
+  }
 
-    return  if2.ifr_mtu;
+  return  if2.ifr_mtu;
 }
 
 static int getFlags(int sock, const char *ifname, int *flags) {
@@ -1290,13 +1294,13 @@
   strcpy(if2.ifr_name, ifname);
 
   if (ioctl(sock, SIOCGIFFLAGS, (char *)&if2) < 0){
-      return -1;
+    return -1;
   }
 
   if (sizeof(if2.ifr_flags) == sizeof(short)) {
-      *flags = (if2.ifr_flags & 0xffff);
+    *flags = (if2.ifr_flags & 0xffff);
   } else {
-      *flags = if2.ifr_flags;
+    *flags = if2.ifr_flags;
   }
   return 0;
 }
@@ -1311,52 +1315,52 @@
 
 #ifdef AF_INET6
 static int openSocketWithFallback(JNIEnv *env, const char *ifname){
-    int sock, alreadyV6 = 0;
-    struct lifreq if2;
+  int sock, alreadyV6 = 0;
+  struct lifreq if2;
 
-     if ((sock = JVM_Socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
-         if (errno == EPROTONOSUPPORT){
-              if ( (sock = JVM_Socket(AF_INET6, SOCK_DGRAM, 0)) < 0 ){
-                 NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException", "IPV6 Socket creation failed");
-                 return -1;
-              }
+  if ((sock = JVM_Socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
+    if (errno == EPROTONOSUPPORT){
+      if ( (sock = JVM_Socket(AF_INET6, SOCK_DGRAM, 0)) < 0 ){
+        NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException", "IPV6 Socket creation failed");
+        return -1;
+      }
 
-              alreadyV6=1;
-         }
-         else{ // errno is not NOSUPPORT
-             NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException", "IPV4 Socket creation failed");
-             return -1;
-         }
-   }
-
-     /**
-      * Solaris requires that we have IPv6 socket to query an
-      * interface without IPv4 address - check it here
-      * POSIX 1 require the kernell to return ENOTTY if the call is
-      * unappropriate for device e.g. NETMASK for device having IPv6
-      * only address but not all devices follows the standart so
-      * fallback on any error.  It's not an ecology friendly but more
-      * reliable.
-      */
-
-    if (! alreadyV6 ){
-        memset((char *) &if2, 0, sizeof(if2));
-        strcpy(if2.lifr_name, ifname);
-        if (ioctl(sock, SIOCGLIFNETMASK, (char *)&if2) < 0) {
-                close(sock);
-                if ( (sock = JVM_Socket(AF_INET6, SOCK_DGRAM, 0)) < 0 ){
-                      NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException", "IPV6 Socket creation failed");
-                      return -1;
-                }
-        }
+      alreadyV6=1;
     }
+    else{ // errno is not NOSUPPORT
+      NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException", "IPV4 Socket creation failed");
+      return -1;
+    }
+  }
 
-    return sock;
+  /**
+   * Solaris requires that we have IPv6 socket to query an
+   * interface without IPv4 address - check it here
+   * POSIX 1 require the kernell to return ENOTTY if the call is
+   * unappropriate for device e.g. NETMASK for device having IPv6
+   * only address but not all devices follows the standart so
+   * fallback on any error.  It's not an ecology friendly but more
+   * reliable.
+   */
+
+  if (! alreadyV6 ){
+    memset((char *) &if2, 0, sizeof(if2));
+    strcpy(if2.lifr_name, ifname);
+    if (ioctl(sock, SIOCGLIFNETMASK, (char *)&if2) < 0) {
+      close(sock);
+      if ( (sock = JVM_Socket(AF_INET6, SOCK_DGRAM, 0)) < 0 ){
+        NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException", "IPV6 Socket creation failed");
+        return -1;
+      }
+    }
+  }
+
+  return sock;
 }
 
 #else
 static int openSocketWithFallback(JNIEnv *env, const char *ifname){
-    return openSocket(env,AF_INET);
+  return openSocket(env,AF_INET);
 }
 #endif
 
@@ -1366,105 +1370,105 @@
  */
 
 static netif *enumIPv4Interfaces(JNIEnv *env, int sock, netif *ifs) {
-     return enumIPvXInterfaces(env,sock, ifs, AF_INET);
+  return enumIPvXInterfaces(env,sock, ifs, AF_INET);
 }
 
 #ifdef AF_INET6
 static netif *enumIPv6Interfaces(JNIEnv *env, int sock, netif *ifs) {
-    return enumIPvXInterfaces(env,sock, ifs, AF_INET6);
+  return enumIPvXInterfaces(env,sock, ifs, AF_INET6);
 }
 #endif
 
 /*
    Enumerates and returns all interfaces on Solaris
    use the same code for IPv4 and IPv6
- */
+   */
 static netif *enumIPvXInterfaces(JNIEnv *env, int sock, netif *ifs, int family) {
-    struct lifconf ifc;
-    struct lifreq *ifr;
-    int n;
-    char *buf;
-    struct lifnum numifs;
-    unsigned bufsize;
+  struct lifconf ifc;
+  struct lifreq *ifr;
+  int n;
+  char *buf;
+  struct lifnum numifs;
+  unsigned bufsize;
 
-    /*
-     * Get the interface count
-     */
-    numifs.lifn_family = family;
-    numifs.lifn_flags = 0;
-    if (ioctl(sock, SIOCGLIFNUM, (char *)&numifs) < 0) {
-        NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException", "ioctl SIOCGLIFNUM failed");
-        return ifs;
-    }
+  /*
+   * Get the interface count
+   */
+  numifs.lifn_family = family;
+  numifs.lifn_flags = 0;
+  if (ioctl(sock, SIOCGLIFNUM, (char *)&numifs) < 0) {
+    NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException", "ioctl SIOCGLIFNUM failed");
+    return ifs;
+  }
 
-    /*
-     *  Enumerate the interface configurations
-     */
-    bufsize = numifs.lifn_count * sizeof (struct lifreq);
-    CHECKED_MALLOC3(buf, char *, bufsize);
+  /*
+   *  Enumerate the interface configurations
+   */
+  bufsize = numifs.lifn_count * sizeof (struct lifreq);
+  CHECKED_MALLOC3(buf, char *, bufsize);
 
-    ifc.lifc_family = family;
-    ifc.lifc_flags = 0;
-    ifc.lifc_len = bufsize;
-    ifc.lifc_buf = buf;
-    if (ioctl(sock, SIOCGLIFCONF, (char *)&ifc) < 0) {
-        NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException", "ioctl SIOCGLIFCONF failed");
-        free(buf);
-        return ifs;
-    }
-
-    /*
-     * Iterate through each interface
-     */
-    ifr = ifc.lifc_req;
-    for (n=0; n<numifs.lifn_count; n++, ifr++) {
-        int index = -1;
-        struct lifreq if2;
-
-        /*
-        * Ignore either IPv4 or IPv6 addresses
-        */
-        if (ifr->lifr_addr.ss_family != family) {
-            continue;
-        }
-
-#ifdef AF_INET6
-        if (ifr->lifr_addr.ss_family == AF_INET6) {
-            struct sockaddr_in6 *s6= (struct sockaddr_in6 *)&(ifr->lifr_addr);
-            s6->sin6_scope_id = getIndex(sock, ifr->lifr_name);
-        }
-#endif
-
-        /* add to the list */
-        ifs = addif(env, sock,ifr->lifr_name, ifs, (struct sockaddr *)&(ifr->lifr_addr),family, (short) ifr->lifr_addrlen);
-
-        /*
-        * If an exception occurred we return immediately
-        */
-        if ((*env)->ExceptionOccurred(env)) {
-            free(buf);
-            return ifs;
-        }
-
-   }
-
+  ifc.lifc_family = family;
+  ifc.lifc_flags = 0;
+  ifc.lifc_len = bufsize;
+  ifc.lifc_buf = buf;
+  if (ioctl(sock, SIOCGLIFCONF, (char *)&ifc) < 0) {
+    NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException", "ioctl SIOCGLIFCONF failed");
     free(buf);
     return ifs;
+  }
+
+  /*
+   * Iterate through each interface
+   */
+  ifr = ifc.lifc_req;
+  for (n=0; n<numifs.lifn_count; n++, ifr++) {
+    int index = -1;
+    struct lifreq if2;
+
+    /*
+     * Ignore either IPv4 or IPv6 addresses
+     */
+    if (ifr->lifr_addr.ss_family != family) {
+      continue;
+    }
+
+#ifdef AF_INET6
+    if (ifr->lifr_addr.ss_family == AF_INET6) {
+      struct sockaddr_in6 *s6= (struct sockaddr_in6 *)&(ifr->lifr_addr);
+      s6->sin6_scope_id = getIndex(sock, ifr->lifr_name);
+    }
+#endif
+
+    /* add to the list */
+    ifs = addif(env, sock,ifr->lifr_name, ifs, (struct sockaddr *)&(ifr->lifr_addr),family, (short) ifr->lifr_addrlen);
+
+    /*
+     * If an exception occurred we return immediately
+     */
+    if ((*env)->ExceptionOccurred(env)) {
+      free(buf);
+      return ifs;
+    }
+
+  }
+
+  free(buf);
+  return ifs;
 }
 
 static int getIndex(int sock, const char *name){
-   /*
-    * Try to get the interface index
-    * (Not supported on Solaris 2.6 or 7)
-    */
-    struct lifreq if2;
-    strcpy(if2.lifr_name, name);
+  /*
+   * Try to get the interface index
+   * (Not supported on Solaris 2.6 or 7)
+   */
+  struct lifreq if2;
+  strcpy(if2.lifr_name, name);
 
-    if (ioctl(sock, SIOCGLIFINDEX, (char *)&if2) < 0) {
-        return -1;
-    }
+  if (ioctl(sock, SIOCGLIFINDEX, (char *)&if2) < 0) {
+    return -1;
+  }
 
-    return if2.lifr_index;
+  return if2.lifr_index;
 }
 
 /**
@@ -1472,30 +1476,30 @@
  * Returns 0 if it doesn't have one.
  */
 static struct sockaddr *getBroadcast(JNIEnv *env, int sock, const char *ifname, struct sockaddr *brdcast_store) {
-    struct sockaddr *ret = NULL;
-    struct lifreq if2;
+  struct sockaddr *ret = NULL;
+  struct lifreq if2;
 
-    memset((char *) &if2, 0, sizeof(if2));
-    strcpy(if2.lifr_name, ifname);
+  memset((char *) &if2, 0, sizeof(if2));
+  strcpy(if2.lifr_name, ifname);
 
-    /* Let's make sure the interface does have a broadcast address */
-    if (ioctl(sock, SIOCGLIFFLAGS, (char *)&if2)  < 0) {
-        NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "IOCTL  SIOCGLIFFLAGS failed");
-        return ret;
-    }
-
-    if (if2.lifr_flags & IFF_BROADCAST) {
-        /* It does, let's retrieve it*/
-        if (ioctl(sock, SIOCGLIFBRDADDR, (char *)&if2) < 0) {
-            NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "IOCTL SIOCGLIFBRDADDR failed");
-            return ret;
-        }
-
-        ret = brdcast_store;
-        memcpy(ret, &if2.lifr_broadaddr, sizeof(struct sockaddr));
-    }
-
+  /* Let's make sure the interface does have a broadcast address */
+  if (ioctl(sock, SIOCGLIFFLAGS, (char *)&if2)  < 0) {
+    NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "IOCTL  SIOCGLIFFLAGS failed");
     return ret;
+  }
+
+  if (if2.lifr_flags & IFF_BROADCAST) {
+    /* It does, let's retrieve it*/
+    if (ioctl(sock, SIOCGLIFBRDADDR, (char *)&if2) < 0) {
+      NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "IOCTL SIOCGLIFBRDADDR failed");
+      return ret;
+    }
+
+    ret = brdcast_store;
+    memcpy(ret, &if2.lifr_broadaddr, sizeof(struct sockaddr));
+  }
+
+  return ret;
 }
 
 /**
@@ -1503,27 +1507,27 @@
  * interface, if it has one, otherwise return -1.
  */
 static short getSubnet(JNIEnv *env, int sock, const char *ifname) {
-    unsigned int mask;
-    short ret;
-    struct lifreq if2;
+  unsigned int mask;
+  short ret;
+  struct lifreq if2;
 
-    memset((char *) &if2, 0, sizeof(if2));
-    strcpy(if2.lifr_name, ifname);
+  memset((char *) &if2, 0, sizeof(if2));
+  strcpy(if2.lifr_name, ifname);
 
-    if (ioctl(sock, SIOCGLIFNETMASK, (char *)&if2) < 0) {
-        NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "IOCTL SIOCGLIFNETMASK failed");
-        return -1;
-    }
+  if (ioctl(sock, SIOCGLIFNETMASK, (char *)&if2) < 0) {
+    NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "IOCTL SIOCGLIFNETMASK failed");
+    return -1;
+  }
 
-    mask = ntohl(((struct sockaddr_in*)&(if2.lifr_addr))->sin_addr.s_addr);
-    ret = 0;
+  mask = ntohl(((struct sockaddr_in*)&(if2.lifr_addr))->sin_addr.s_addr);
+  ret = 0;
 
-    while (mask) {
-       mask <<= 1;
-       ret++;
-    }
+  while (mask) {
+    mask <<= 1;
+    ret++;
+  }
 
-    return ret;
+  return ret;
 }
 
 
@@ -1536,56 +1540,56 @@
  * privileges (i.e. be root).
  */
 static int getMacFromDevice(JNIEnv *env, const char* ifname, unsigned char* retbuf) {
-    char style1dev[MAXPATHLEN];
-    int fd;
-    dl_phys_addr_req_t dlpareq;
-    dl_phys_addr_ack_t *dlpaack;
-    struct strbuf msg;
-    char buf[128];
-    int flags = 0;
+  char style1dev[MAXPATHLEN];
+  int fd;
+  dl_phys_addr_req_t dlpareq;
+  dl_phys_addr_ack_t *dlpaack;
+  struct strbuf msg;
+  char buf[128];
+  int flags = 0;
 
-   /**
-    * Device is in /dev
-    * e.g.: /dev/bge0
-    */
-    strcpy(style1dev, DEV_PREFIX);
-    strcat(style1dev, ifname);
-    if ((fd = open(style1dev, O_RDWR)) < 0) {
-        /*
-         * Can't open it. We probably are missing the privilege.
-         * We'll have to try something else
-         */
-         return 0;
-    }
+  /**
+   * Device is in /dev
+   * e.g.: /dev/bge0
+   */
+  strcpy(style1dev, DEV_PREFIX);
+  strcat(style1dev, ifname);
+  if ((fd = open(style1dev, O_RDWR)) < 0) {
+    /*
+     * Can't open it. We probably are missing the privilege.
+     * We'll have to try something else
+     */
+    return 0;
+  }
 
-    dlpareq.dl_primitive = DL_PHYS_ADDR_REQ;
-    dlpareq.dl_addr_type = DL_CURR_PHYS_ADDR;
+  dlpareq.dl_primitive = DL_PHYS_ADDR_REQ;
+  dlpareq.dl_addr_type = DL_CURR_PHYS_ADDR;
 
-    msg.buf = (char *)&dlpareq;
-    msg.len = DL_PHYS_ADDR_REQ_SIZE;
+  msg.buf = (char *)&dlpareq;
+  msg.len = DL_PHYS_ADDR_REQ_SIZE;
 
-    if (putmsg(fd, &msg, NULL, 0) < 0) {
-        NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "putmsg failed");
-        return -1;
-    }
+  if (putmsg(fd, &msg, NULL, 0) < 0) {
+    NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "putmsg failed");
+    return -1;
+  }
 
-    dlpaack = (dl_phys_addr_ack_t *)buf;
+  dlpaack = (dl_phys_addr_ack_t *)buf;
 
-    msg.buf = (char *)buf;
-    msg.len = 0;
-    msg.maxlen = sizeof (buf);
-    if (getmsg(fd, &msg, NULL, &flags) < 0) {
-        NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "getmsg failed");
-        return -1;
-    }
+  msg.buf = (char *)buf;
+  msg.len = 0;
+  msg.maxlen = sizeof (buf);
+  if (getmsg(fd, &msg, NULL, &flags) < 0) {
+    NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "getmsg failed");
+    return -1;
+  }
 
-    if (msg.len < DL_PHYS_ADDR_ACK_SIZE || dlpaack->dl_primitive != DL_PHYS_ADDR_ACK) {
-        JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Couldn't obtain phys addr\n");
-        return -1;
-    }
+  if (msg.len < DL_PHYS_ADDR_ACK_SIZE || dlpaack->dl_primitive != DL_PHYS_ADDR_ACK) {
+    JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Couldn't obtain phys addr\n");
+    return -1;
+  }
 
-    memcpy(retbuf, &buf[dlpaack->dl_addr_offset], dlpaack->dl_addr_length);
-    return dlpaack->dl_addr_length;
+  memcpy(retbuf, &buf[dlpaack->dl_addr_offset], dlpaack->dl_addr_length);
+  return dlpaack->dl_addr_length;
 }
 
 /**
@@ -1594,95 +1598,95 @@
  * MAC address. Returns -1 if there is no hardware address on that interface.
  */
 static int getMacAddress(JNIEnv *env, int sock, const char *ifname,  const struct in_addr* addr, unsigned char *buf) {
-    struct arpreq arpreq;
-    struct sockaddr_in* sin;
-    struct sockaddr_in ipAddr;
-    int len, i;
-    struct lifreq lif;
+  struct arpreq arpreq;
+  struct sockaddr_in* sin;
+  struct sockaddr_in ipAddr;
+  int len, i;
+  struct lifreq lif;
 
-    /* First, try the new (S11) SIOCGLIFHWADDR ioctl(). If that fails
-     * try the old way.
-     */
-    memset(&lif, 0, sizeof(lif));
-    strlcpy(lif.lifr_name, ifname, sizeof(lif.lifr_name));
+  /* First, try the new (S11) SIOCGLIFHWADDR ioctl(). If that fails
+   * try the old way.
+   */
+  memset(&lif, 0, sizeof(lif));
+  strlcpy(lif.lifr_name, ifname, sizeof(lif.lifr_name));
 
-    if (ioctl(sock, SIOCGLIFHWADDR, &lif) != -1) {
-        struct sockaddr_dl *sp;
-        sp = (struct sockaddr_dl *)&lif.lifr_addr;
-        memcpy(buf, &sp->sdl_data[0], sp->sdl_alen);
-        return sp->sdl_alen;
+  if (ioctl(sock, SIOCGLIFHWADDR, &lif) != -1) {
+    struct sockaddr_dl *sp;
+    sp = (struct sockaddr_dl *)&lif.lifr_addr;
+    memcpy(buf, &sp->sdl_data[0], sp->sdl_alen);
+    return sp->sdl_alen;
+  }
+
+  /**
+   * On Solaris we have to use DLPI, but it will only work if we have
+   * privileged access (i.e. root). If that fails, we try a lookup
+   * in the ARP table, which requires an IPv4 address.
+   */
+  if ((len = getMacFromDevice(env, ifname, buf))  == 0) {
+    /*DLPI failed - trying to do arp lookup*/
+
+    if (addr == NULL) {
+      /**
+       * No IPv4 address for that interface, so can't do an ARP lookup.
+       */
+      return -1;
     }
 
-   /**
-    * On Solaris we have to use DLPI, but it will only work if we have
-    * privileged access (i.e. root). If that fails, we try a lookup
-    * in the ARP table, which requires an IPv4 address.
-    */
-    if ((len = getMacFromDevice(env, ifname, buf))  == 0) {
-        /*DLPI failed - trying to do arp lookup*/
+    len = 6; //???
 
-        if (addr == NULL) {
-            /**
-             * No IPv4 address for that interface, so can't do an ARP lookup.
-             */
-             return -1;
-         }
+    sin = (struct sockaddr_in *) &arpreq.arp_pa;
+    memset((char *) &arpreq, 0, sizeof(struct arpreq));
+    ipAddr.sin_port = 0;
+    ipAddr.sin_family = AF_INET;
+    memcpy(&ipAddr.sin_addr, addr, sizeof(struct in_addr));
+    memcpy(&arpreq.arp_pa, &ipAddr, sizeof(struct sockaddr_in));
+    arpreq.arp_flags= ATF_PUBL;
 
-         len = 6; //???
-
-         sin = (struct sockaddr_in *) &arpreq.arp_pa;
-         memset((char *) &arpreq, 0, sizeof(struct arpreq));
-         ipAddr.sin_port = 0;
-         ipAddr.sin_family = AF_INET;
-         memcpy(&ipAddr.sin_addr, addr, sizeof(struct in_addr));
-         memcpy(&arpreq.arp_pa, &ipAddr, sizeof(struct sockaddr_in));
-         arpreq.arp_flags= ATF_PUBL;
-
-         if (ioctl(sock, SIOCGARP, &arpreq) < 0) {
-             return -1;
-         }
-
-         memcpy(buf, &arpreq.arp_ha.sa_data[0], len );
+    if (ioctl(sock, SIOCGARP, &arpreq) < 0) {
+      return -1;
     }
 
-    /*
-     * All bytes to 0 means no hardware address.
-     */
+    memcpy(buf, &arpreq.arp_ha.sa_data[0], len );
+  }
 
-    for (i = 0; i < len; i++) {
-      if (buf[i] != 0)
-         return len;
-    }
+  /*
+   * All bytes to 0 means no hardware address.
+   */
 
-    return -1;
+  for (i = 0; i < len; i++) {
+    if (buf[i] != 0)
+      return len;
+  }
+
+  return -1;
 }
 
 static int getMTU(JNIEnv *env, int sock,  const char *ifname) {
-    struct lifreq if2;
+  struct lifreq if2;
 
-    memset((char *) &if2, 0, sizeof(if2));
-    strcpy(if2.lifr_name, ifname);
+  memset((char *) &if2, 0, sizeof(if2));
+  strcpy(if2.lifr_name, ifname);
 
-    if (ioctl(sock, SIOCGLIFMTU, (char *)&if2) < 0) {
-        NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "IOCTL SIOCGLIFMTU failed");
-        return -1;
-    }
+  if (ioctl(sock, SIOCGLIFMTU, (char *)&if2) < 0) {
+    NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "IOCTL SIOCGLIFMTU failed");
+    return -1;
+  }
 
-    return  if2.lifr_mtu;
+  return  if2.lifr_mtu;
 }
 
 
 static int getFlags(int sock, const char *ifname, int *flags) {
-     struct   lifreq lifr;
-     memset((caddr_t)&lifr, 0, sizeof(lifr));
-     strcpy((caddr_t)&(lifr.lifr_name), ifname);
+  struct   lifreq lifr;
+  memset((caddr_t)&lifr, 0, sizeof(lifr));
+  strcpy((caddr_t)&(lifr.lifr_name), ifname);
 
-     if (ioctl(sock, SIOCGLIFFLAGS, (char *)&lifr) < 0) {
-         return -1;
-     }
+  if (ioctl(sock, SIOCGLIFFLAGS, (char *)&lifr) < 0) {
+    return -1;
+  }
 
-     *flags = lifr.lifr_flags;
-     return 0;
+  *flags = lifr.lifr_flags;
+  return 0;
 }
 
 
@@ -1697,28 +1701,28 @@
 
 #ifdef AF_INET6
 static int openSocketWithFallback(JNIEnv *env, const char *ifname){
-    int sock;
-    struct ifreq if2;
+  int sock;
+  struct ifreq if2;
 
-     if ((sock = JVM_Socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
-         if (errno == EPROTONOSUPPORT){
-              if ( (sock = JVM_Socket(AF_INET6, SOCK_DGRAM, 0)) < 0 ){
-                 NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException", "IPV6 Socket creation failed");
-                 return -1;
-              }
-         }
-         else{ // errno is not NOSUPPORT
-             NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException", "IPV4 Socket creation failed");
-             return -1;
-         }
-   }
+  if ((sock = JVM_Socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
+    if (errno == EPROTONOSUPPORT){
+      if ( (sock = JVM_Socket(AF_INET6, SOCK_DGRAM, 0)) < 0 ){
+        NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException", "IPV6 Socket creation failed");
+        return -1;
+      }
+    }
+    else{ // errno is not NOSUPPORT
+      NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException", "IPV4 Socket creation failed");
+      return -1;
+    }
+  }
 
-   return sock;
+  return sock;
 }
 
 #else
 static int openSocketWithFallback(JNIEnv *env, const char *ifname){
-    return openSocket(env,AF_INET);
+  return openSocket(env,AF_INET);
 }
 #endif
 
@@ -1726,42 +1730,42 @@
  * Enumerates and returns all IPv4 interfaces
  */
 static netif *enumIPv4Interfaces(JNIEnv *env, int sock, netif *ifs) {
-    struct ifaddrs *ifa, *origifa;
+  struct ifaddrs *ifa, *origifa;
 
-    if (getifaddrs(&origifa) != 0) {
-        NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException",
-                         "getifaddrs() function failed");
-        return ifs;
-    }
+  if (getifaddrs(&origifa) != 0) {
+    NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException",
+                                 "getifaddrs() function failed");
+    return ifs;
+  }
 
-    for (ifa = origifa; ifa != NULL; ifa = ifa->ifa_next) {
-
-        /*
-         * Skip non-AF_INET entries.
-         */
-        if (ifa->ifa_addr == NULL || ifa->ifa_addr->sa_family != AF_INET)
-            continue;
-
-        /*
-         * Add to the list.
-         */
-        ifs = addif(env, sock, ifa->ifa_name, ifs, ifa->ifa_addr, AF_INET, 0);
-
-        /*
-         * If an exception occurred then free the list.
-         */
-        if ((*env)->ExceptionOccurred(env)) {
-            freeifaddrs(origifa);
-            freeif(ifs);
-            return NULL;
-        }
-    }
+  for (ifa = origifa; ifa != NULL; ifa = ifa->ifa_next) {
 
     /*
-     * Free socket and buffer
+     * Skip non-AF_INET entries.
      */
-    freeifaddrs(origifa);
-    return ifs;
+    if (ifa->ifa_addr == NULL || ifa->ifa_addr->sa_family != AF_INET)
+      continue;
+
+    /*
+     * Add to the list.
+     */
+    ifs = addif(env, sock, ifa->ifa_name, ifs, ifa->ifa_addr, AF_INET, 0);
+
+    /*
+     * If an exception occurred then free the list.
+     */
+    if ((*env)->ExceptionOccurred(env)) {
+      freeifaddrs(origifa);
+      freeif(ifs);
+      return NULL;
+    }
+  }
+
+  /*
+   * Free socket and buffer
+   */
+  freeifaddrs(origifa);
+  return ifs;
 }
 
 
@@ -1775,102 +1779,102 @@
  */
 static
 int prefix(void *val, int size) {
-    u_char *name = (u_char *)val;
-    int byte, bit, plen = 0;
+  u_char *name = (u_char *)val;
+  int byte, bit, plen = 0;
 
-    for (byte = 0; byte < size; byte++, plen += 8)
-        if (name[byte] != 0xff)
-            break;
-    if (byte == size)
-        return (plen);
-    for (bit = 7; bit != 0; bit--, plen++)
-        if (!(name[byte] & (1 << bit)))
-            break;
-    for (; bit != 0; bit--)
-        if (name[byte] & (1 << bit))
-            return (0);
-    byte++;
-    for (; byte < size; byte++)
-        if (name[byte])
-            return (0);
+  for (byte = 0; byte < size; byte++, plen += 8)
+    if (name[byte] != 0xff)
+      break;
+  if (byte == size)
     return (plen);
+  for (bit = 7; bit != 0; bit--, plen++)
+    if (!(name[byte] & (1 << bit)))
+      break;
+  for (; bit != 0; bit--)
+    if (name[byte] & (1 << bit))
+      return (0);
+  byte++;
+  for (; byte < size; byte++)
+    if (name[byte])
+      return (0);
+  return (plen);
 }
 
 /*
  * Enumerates and returns all IPv6 interfaces on BSD
  */
 static netif *enumIPv6Interfaces(JNIEnv *env, int sock, netif *ifs) {
-    struct ifaddrs *ifa, *origifa;
-    struct sockaddr_in6 *sin6;
-    struct in6_ifreq ifr6;
+  struct ifaddrs *ifa, *origifa;
+  struct sockaddr_in6 *sin6;
+  struct in6_ifreq ifr6;
 
-    if (getifaddrs(&origifa) != 0) {
-        NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException",
-                         "getifaddrs() function failed");
-        return ifs;
-    }
+  if (getifaddrs(&origifa) != 0) {
+    NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException",
+                                 "getifaddrs() function failed");
+    return ifs;
+  }
 
-    for (ifa = origifa; ifa != NULL; ifa = ifa->ifa_next) {
-
-        /*
-         * Skip non-AF_INET6 entries.
-         */
-        if (ifa->ifa_addr == NULL || ifa->ifa_addr->sa_family != AF_INET6)
-            continue;
-
-        memset(&ifr6, 0, sizeof(ifr6));
-        strlcpy(ifr6.ifr_name, ifa->ifa_name, sizeof(ifr6.ifr_name));
-        memcpy(&ifr6.ifr_addr, ifa->ifa_addr, MIN(sizeof(ifr6.ifr_addr), ifa->ifa_addr->sa_len));
-
-        if (ioctl(sock, SIOCGIFNETMASK_IN6, (caddr_t)&ifr6) < 0) {
-            NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException",
-                             "ioctl SIOCGIFNETMASK_IN6 failed");
-            freeifaddrs(origifa);
-            freeif(ifs);
-            return NULL;
-        }
-
-        /* Add to the list.  */
-        sin6 = (struct sockaddr_in6 *)&ifr6.ifr_addr;
-        ifs = addif(env, sock, ifa->ifa_name, ifs, ifa->ifa_addr, AF_INET6,
-                    prefix(&sin6->sin6_addr, sizeof(struct in6_addr)));
-
-        /* If an exception occurred then free the list.  */
-        if ((*env)->ExceptionOccurred(env)) {
-            freeifaddrs(origifa);
-            freeif(ifs);
-            return NULL;
-        }
-    }
+  for (ifa = origifa; ifa != NULL; ifa = ifa->ifa_next) {
 
     /*
-     * Free socket and ifaddrs buffer
+     * Skip non-AF_INET6 entries.
      */
-    freeifaddrs(origifa);
-    return ifs;
+    if (ifa->ifa_addr == NULL || ifa->ifa_addr->sa_family != AF_INET6)
+      continue;
+
+    memset(&ifr6, 0, sizeof(ifr6));
+    strlcpy(ifr6.ifr_name, ifa->ifa_name, sizeof(ifr6.ifr_name));
+    memcpy(&ifr6.ifr_addr, ifa->ifa_addr, MIN(sizeof(ifr6.ifr_addr), ifa->ifa_addr->sa_len));
+
+    if (ioctl(sock, SIOCGIFNETMASK_IN6, (caddr_t)&ifr6) < 0) {
+      NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException",
+                                   "ioctl SIOCGIFNETMASK_IN6 failed");
+      freeifaddrs(origifa);
+      freeif(ifs);
+      return NULL;
+    }
+
+    /* Add to the list.  */
+    sin6 = (struct sockaddr_in6 *)&ifr6.ifr_addr;
+    ifs = addif(env, sock, ifa->ifa_name, ifs, ifa->ifa_addr, AF_INET6,
+                prefix(&sin6->sin6_addr, sizeof(struct in6_addr)));
+
+    /* If an exception occurred then free the list.  */
+    if ((*env)->ExceptionOccurred(env)) {
+      freeifaddrs(origifa);
+      freeif(ifs);
+      return NULL;
+    }
+  }
+
+  /*
+   * Free socket and ifaddrs buffer
+   */
+  freeifaddrs(origifa);
+  return ifs;
 }
 #endif
 
 static int getIndex(int sock, const char *name){
 #ifdef __FreeBSD__
-     /*
-      * Try to get the interface index
-      * (Not supported on Solaris 2.6 or 7)
-      */
-    struct ifreq if2;
-    strcpy(if2.ifr_name, name);
+  /*
+   * Try to get the interface index
+   * (Not supported on Solaris 2.6 or 7)
+   */
+  struct ifreq if2;
+  strcpy(if2.ifr_name, name);
 
-    if (ioctl(sock, SIOCGIFINDEX, (char *)&if2) < 0) {
-        return -1;
-    }
+  if (ioctl(sock, SIOCGIFINDEX, (char *)&if2) < 0) {
+    return -1;
+  }
 
-    return if2.ifr_index;
+  return if2.ifr_index;
 #else
-    /*
-     * Try to get the interface index using BSD specific if_nametoindex
-     */
-    int index = if_nametoindex(name);
-    return (index == 0) ? -1 : index;
+  /*
+   * Try to get the interface index using BSD specific if_nametoindex
+   */
+  int index = if_nametoindex(name);
+  return (index == 0) ? -1 : index;
 #endif
 }
 
@@ -1887,19 +1891,19 @@
 
   /* Let's make sure the interface does have a broadcast address */
   if (ioctl(sock, SIOCGIFFLAGS, (char *)&if2) < 0) {
-      NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "IOCTL SIOCGIFFLAGS failed");
-      return ret;
+    NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "IOCTL SIOCGIFFLAGS failed");
+    return ret;
   }
 
   if (if2.ifr_flags & IFF_BROADCAST) {
-      /* It does, let's retrieve it*/
-      if (ioctl(sock, SIOCGIFBRDADDR, (char *)&if2) < 0) {
-          NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "IOCTL SIOCGIFBRDADDR failed");
-          return ret;
-      }
+    /* It does, let's retrieve it*/
+    if (ioctl(sock, SIOCGIFBRDADDR, (char *)&if2) < 0) {
+      NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "IOCTL SIOCGIFBRDADDR failed");
+      return ret;
+    }
 
-      ret = brdcast_store;
-      memcpy(ret, &if2.ifr_broadaddr, sizeof(struct sockaddr));
+    ret = brdcast_store;
+    memcpy(ret, &if2.ifr_broadaddr, sizeof(struct sockaddr));
   }
 
   return ret;
@@ -1910,26 +1914,26 @@
  * interface, if it has one, otherwise return -1.
  */
 static short getSubnet(JNIEnv *env, int sock, const char *ifname) {
-    unsigned int mask;
-    short ret;
-    struct ifreq if2;
+  unsigned int mask;
+  short ret;
+  struct ifreq if2;
 
-    memset((char *) &if2, 0, sizeof(if2));
-    strcpy(if2.ifr_name, ifname);
+  memset((char *) &if2, 0, sizeof(if2));
+  strcpy(if2.ifr_name, ifname);
 
-    if (ioctl(sock, SIOCGIFNETMASK, (char *)&if2) < 0) {
-        NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "IOCTL SIOCGIFNETMASK failed");
-        return -1;
-    }
+  if (ioctl(sock, SIOCGIFNETMASK, (char *)&if2) < 0) {
+    NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "IOCTL SIOCGIFNETMASK failed");
+    return -1;
+  }
 
-    mask = ntohl(((struct sockaddr_in*)&(if2.ifr_addr))->sin_addr.s_addr);
-    ret = 0;
-    while (mask) {
-       mask <<= 1;
-       ret++;
-    }
+  mask = ntohl(((struct sockaddr_in*)&(if2.ifr_addr))->sin_addr.s_addr);
+  ret = 0;
+  while (mask) {
+    mask <<= 1;
+    ret++;
+  }
 
-    return ret;
+  return ret;
 }
 
 /**
@@ -1938,44 +1942,44 @@
  * MAC address. Returns -1 if there is no hardware address on that interface.
  */
 static int getMacAddress(JNIEnv *env, int sock, const char* ifname, const struct in_addr* addr, unsigned char *buf) {
-    struct ifaddrs *ifa0, *ifa;
-    struct sockaddr *saddr;
-    int i;
+  struct ifaddrs *ifa0, *ifa;
+  struct sockaddr *saddr;
+  int i;
 
-    /* Grab the interface list */
-    if (!getifaddrs(&ifa0)) {
-        /* Cycle through the interfaces */
-        for (i = 0, ifa = ifa0; ifa != NULL; ifa = ifa->ifa_next, i++) {
-            saddr = ifa->ifa_addr;
-            /* Link layer contains the MAC address */
-            if (saddr->sa_family == AF_LINK && !strcmp(ifname, ifa->ifa_name)) {
-                struct sockaddr_dl *sadl = (struct sockaddr_dl *) saddr;
-                /* Check the address is the correct length */
-                if (sadl->sdl_alen == ETHER_ADDR_LEN) {
-                    memcpy(buf, (sadl->sdl_data + sadl->sdl_nlen), ETHER_ADDR_LEN);
-                    freeifaddrs(ifa0);
-                    return ETHER_ADDR_LEN;
-                }
-            }
+  /* Grab the interface list */
+  if (!getifaddrs(&ifa0)) {
+    /* Cycle through the interfaces */
+    for (i = 0, ifa = ifa0; ifa != NULL; ifa = ifa->ifa_next, i++) {
+      saddr = ifa->ifa_addr;
+      /* Link layer contains the MAC address */
+      if (saddr->sa_family == AF_LINK && !strcmp(ifname, ifa->ifa_name)) {
+        struct sockaddr_dl *sadl = (struct sockaddr_dl *) saddr;
+        /* Check the address is the correct length */
+        if (sadl->sdl_alen == ETHER_ADDR_LEN) {
+          memcpy(buf, (sadl->sdl_data + sadl->sdl_nlen), ETHER_ADDR_LEN);
+          freeifaddrs(ifa0);
+          return ETHER_ADDR_LEN;
         }
-        freeifaddrs(ifa0);
+      }
     }
+    freeifaddrs(ifa0);
+  }
 
-    return -1;
+  return -1;
 }
 
 static int getMTU(JNIEnv *env, int sock,  const char *ifname) {
-    struct ifreq if2;
+  struct ifreq if2;
 
-    memset((char *) &if2, 0, sizeof(if2));
-    strcpy(if2.ifr_name, ifname);
+  memset((char *) &if2, 0, sizeof(if2));
+  strcpy(if2.ifr_name, ifname);
 
-    if (ioctl(sock, SIOCGIFMTU, (char *)&if2) < 0) {
-        NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "IOCTL SIOCGIFMTU failed");
-        return -1;
-    }
+  if (ioctl(sock, SIOCGIFMTU, (char *)&if2) < 0) {
+    NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "IOCTL SIOCGIFMTU failed");
+    return -1;
+  }
 
-    return  if2.ifr_mtu;
+  return  if2.ifr_mtu;
 }
 
 static int getFlags(int sock, const char *ifname, int *flags) {
@@ -1986,7 +1990,7 @@
   strcpy(if2.ifr_name, ifname);
 
   if (ioctl(sock, SIOCGIFFLAGS, (char *)&if2) < 0){
-      return -1;
+    return -1;
   }
 
   if (sizeof(if2.ifr_flags) == sizeof(short)) {
@@ -1998,3 +2002,22 @@
 }
 
 #endif
+
+static JNINativeMethod gMethods[] = {
+  NATIVE_METHOD(NetworkInterface, getMTU0, "(Ljava/lang/String;I)I"),
+  NATIVE_METHOD(NetworkInterface, getMacAddr0, "([BLjava/lang/String;I)[B"),
+  NATIVE_METHOD(NetworkInterface, supportsMulticast0, "(Ljava/lang/String;I)Z"),
+  NATIVE_METHOD(NetworkInterface, isLoopback0, "(Ljava/lang/String;I)Z"),
+  NATIVE_METHOD(NetworkInterface, isP2P0, "(Ljava/lang/String;I)Z"),
+  NATIVE_METHOD(NetworkInterface, isUp0, "(Ljava/lang/String;I)Z"),
+  NATIVE_METHOD(NetworkInterface, getAll, "()[Ljava/net/NetworkInterface;"),
+  NATIVE_METHOD(NetworkInterface, getByInetAddress0, "(Ljava/net/InetAddress;)Ljava/net/NetworkInterface;"),
+  NATIVE_METHOD(NetworkInterface, getByIndex0, "(I)Ljava/net/NetworkInterface;"),
+  NATIVE_METHOD(NetworkInterface, getByName0, "(Ljava/lang/String;)Ljava/net/NetworkInterface;"),
+  NATIVE_METHOD(NetworkInterface, init, "()V"),
+
+};
+
+void register_java_net_NetworkInterface(JNIEnv* env) {
+  jniRegisterNativeMethods(env, "java/net/NetworkInterface", gMethods, NELEM(gMethods));
+}
diff --git a/ojluni/src/main/native/PlainDatagramSocketImpl.c b/ojluni/src/main/native/PlainDatagramSocketImpl.c
index 64f0b7b..9a5ec17 100755
--- a/ojluni/src/main/native/PlainDatagramSocketImpl.c
+++ b/ojluni/src/main/native/PlainDatagramSocketImpl.c
@@ -35,7 +35,7 @@
 #endif
 #ifdef __linux__
 #include <unistd.h>
-#include <sys/sysctl.h>
+//#include <sys/sysctl.h>
 #include <sys/utsname.h>
 #include <netinet/ip.h>
 
@@ -59,6 +59,10 @@
 #include "java_net_SocketOptions.h"
 #include "java_net_PlainDatagramSocketImpl.h"
 #include "java_net_NetworkInterface.h"
+#include "JNIHelp.h"
+
+#define NATIVE_METHOD(className, functionName, signature) \
+{ #functionName, signature, (void*)(className ## _ ## functionName) }
 /************************************************************************
  * PlainDatagramSocketImpl
  */
@@ -144,7 +148,7 @@
  * Signature: ()V
  */
 JNIEXPORT void JNICALL
-Java_java_net_PlainDatagramSocketImpl_init(JNIEnv *env, jclass cls) {
+PlainDatagramSocketImpl_init(JNIEnv *env, jclass cls) {
 
 #ifdef __linux__
     struct utsname sysinfo;
@@ -169,10 +173,10 @@
     IO_fd_fdID = NET_GetFileDescriptorID(env);
     CHECK_NULL(IO_fd_fdID);
 
-    Java_java_net_InetAddress_init(env, 0);
-    Java_java_net_Inet4Address_init(env, 0);
-    Java_java_net_Inet6Address_init(env, 0);
-    Java_java_net_NetworkInterface_init(env, 0);
+    InetAddress_init(env, 0);
+    Inet4Address_init(env, 0);
+    Inet6Address_init(env, 0);
+    NetworkInterface_init(env, 0);
 
 #ifdef __linux__
     /*
@@ -217,7 +221,7 @@
  * Signature: (ILjava/net/InetAddress;)V
  */
 JNIEXPORT void JNICALL
-Java_java_net_PlainDatagramSocketImpl_bind0(JNIEnv *env, jobject this,
+PlainDatagramSocketImpl_bind0(JNIEnv *env, jobject this,
                                            jint localport, jobject iaObj) {
     /* fdObj is the FileDescriptor field on this */
     jobject fdObj = (*env)->GetObjectField(env, this, pdsi_fdID);
@@ -282,7 +286,7 @@
  * Signature: (Ljava/net/InetAddress;I)V
  */
 JNIEXPORT void JNICALL
-Java_java_net_PlainDatagramSocketImpl_connect0(JNIEnv *env, jobject this,
+PlainDatagramSocketImpl_connect0(JNIEnv *env, jobject this,
                                                jobject address, jint port) {
     /* The object's field */
     jobject fdObj = (*env)->GetObjectField(env, this, pdsi_fdID);
@@ -330,7 +334,7 @@
  * Signature: ()V
  */
 JNIEXPORT void JNICALL
-Java_java_net_PlainDatagramSocketImpl_disconnect0(JNIEnv *env, jobject this, jint family) {
+PlainDatagramSocketImpl_disconnect0(JNIEnv *env, jobject this, jint family) {
     /* The object's field */
     jobject fdObj = (*env)->GetObjectField(env, this, pdsi_fdID);
     /* The fdObj'fd */
@@ -403,7 +407,7 @@
  * Signature: (Ljava/net/DatagramPacket;)V
  */
 JNIEXPORT void JNICALL
-Java_java_net_PlainDatagramSocketImpl_send(JNIEnv *env, jobject this,
+PlainDatagramSocketImpl_send(JNIEnv *env, jobject this,
                                            jobject packet) {
 
     char BUF[MAX_BUFFER_LEN];
@@ -543,7 +547,7 @@
  * Signature: (Ljava/net/InetAddress;)I
  */
 JNIEXPORT jint JNICALL
-Java_java_net_PlainDatagramSocketImpl_peek(JNIEnv *env, jobject this,
+PlainDatagramSocketImpl_peek(JNIEnv *env, jobject this,
                                            jobject addressObj) {
 
     jobject fdObj = (*env)->GetObjectField(env, this, pdsi_fdID);
@@ -628,7 +632,7 @@
 }
 
 JNIEXPORT jint JNICALL
-Java_java_net_PlainDatagramSocketImpl_peekData(JNIEnv *env, jobject this,
+PlainDatagramSocketImpl_peekData(JNIEnv *env, jobject this,
                                            jobject packet) {
 
     char BUF[MAX_BUFFER_LEN];
@@ -805,7 +809,7 @@
  * Signature: (Ljava/net/DatagramPacket;)V
  */
 JNIEXPORT void JNICALL
-Java_java_net_PlainDatagramSocketImpl_receive0(JNIEnv *env, jobject this,
+PlainDatagramSocketImpl_receive0(JNIEnv *env, jobject this,
                                               jobject packet) {
 
     char BUF[MAX_BUFFER_LEN];
@@ -1058,7 +1062,7 @@
  * Signature: ()V
  */
 JNIEXPORT void JNICALL
-Java_java_net_PlainDatagramSocketImpl_datagramSocketCreate(JNIEnv *env,
+PlainDatagramSocketImpl_datagramSocketCreate(JNIEnv *env,
                                                            jobject this) {
     jobject fdObj = (*env)->GetObjectField(env, this, pdsi_fdID);
     int arg, fd, t = 1;
@@ -1143,7 +1147,7 @@
  * Signature: ()V
  */
 JNIEXPORT void JNICALL
-Java_java_net_PlainDatagramSocketImpl_datagramSocketClose(JNIEnv *env,
+PlainDatagramSocketImpl_datagramSocketClose(JNIEnv *env,
                                                           jobject this) {
     /*
      * REMIND: PUT A LOCK AROUND THIS CODE
@@ -1287,7 +1291,7 @@
         CHECK_NULL(ni_class);
     }
 
-    value = Java_java_net_NetworkInterface_getByInetAddress0(env, ni_class, value);
+    value = NetworkInterface_getByInetAddress0(env, ni_class, value);
     if (value == NULL) {
         if (!(*env)->ExceptionOccurred(env)) {
             JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
@@ -1463,7 +1467,7 @@
  * Signature: (ILjava/lang/Object;)V
  */
 JNIEXPORT void JNICALL
-Java_java_net_PlainDatagramSocketImpl_socketSetOption(JNIEnv *env,
+PlainDatagramSocketImpl_socketSetOption(JNIEnv *env,
                                                       jobject this,
                                                       jint opt,
                                                       jobject value) {
@@ -1686,7 +1690,7 @@
             ni_class = (*env)->NewGlobalRef(env, c);
             CHECK_NULL_RETURN(ni_class, NULL);
         }
-        ni = Java_java_net_NetworkInterface_getByInetAddress0(env, ni_class, addr);
+        ni = NetworkInterface_getByInetAddress0(env, ni_class, addr);
         if (ni) {
             return ni;
         }
@@ -1777,7 +1781,7 @@
          * (for IF).
          */
         if (index > 0) {
-            ni = Java_java_net_NetworkInterface_getByIndex0(env, ni_class,
+            ni = NetworkInterface_getByIndex0(env, ni_class,
                                                                    index);
             if (ni == NULL) {
                 char errmsg[255];
@@ -1843,7 +1847,7 @@
  * Signature: (I)Ljava/lang/Object;
  */
 JNIEXPORT jobject JNICALL
-Java_java_net_PlainDatagramSocketImpl_socketGetOption(JNIEnv *env, jobject this,
+PlainDatagramSocketImpl_socketGetOption(JNIEnv *env, jobject this,
                                                       jint opt) {
     int fd;
     int level, optname, optlen;
@@ -1953,13 +1957,13 @@
  */
 
 JNIEXPORT void JNICALL
-Java_java_net_PlainDatagramSocketImpl_setTTL(JNIEnv *env, jobject this,
+PlainDatagramSocketImpl_setTTL(JNIEnv *env, jobject this,
                                              jbyte ttl) {
     jint ittl = ttl;
     if (ittl < 0) {
         ittl += 0x100;
     }
-    Java_java_net_PlainDatagramSocketImpl_setTimeToLive(env, this, ittl);
+    PlainDatagramSocketImpl_setTimeToLive(env, this, ittl);
 }
 
 /*
@@ -1994,7 +1998,7 @@
  * Signature: (B)V
  */
 JNIEXPORT void JNICALL
-Java_java_net_PlainDatagramSocketImpl_setTimeToLive(JNIEnv *env, jobject this,
+PlainDatagramSocketImpl_setTimeToLive(JNIEnv *env, jobject this,
                                                     jint ttl) {
 
     jobject fdObj = (*env)->GetObjectField(env, this, pdsi_fdID);
@@ -2036,8 +2040,8 @@
  * Signature: ()B
  */
 JNIEXPORT jbyte JNICALL
-Java_java_net_PlainDatagramSocketImpl_getTTL(JNIEnv *env, jobject this) {
-    return (jbyte)Java_java_net_PlainDatagramSocketImpl_getTimeToLive(env, this);
+PlainDatagramSocketImpl_getTTL(JNIEnv *env, jobject this) {
+    return (jbyte)PlainDatagramSocketImpl_getTimeToLive(env, this);
 }
 
 
@@ -2047,7 +2051,7 @@
  * Signature: ()B
  */
 JNIEXPORT jint JNICALL
-Java_java_net_PlainDatagramSocketImpl_getTimeToLive(JNIEnv *env, jobject this) {
+PlainDatagramSocketImpl_getTimeToLive(JNIEnv *env, jobject this) {
 
     jobject fdObj = (*env)->GetObjectField(env, this, pdsi_fdID);
     jint fd = -1;
@@ -2446,7 +2450,7 @@
  * Signature: (Ljava/net/InetAddress;)V
  */
 JNIEXPORT void JNICALL
-Java_java_net_PlainDatagramSocketImpl_join(JNIEnv *env, jobject this,
+PlainDatagramSocketImpl_join(JNIEnv *env, jobject this,
                                            jobject iaObj, jobject niObj)
 {
     mcast_join_leave(env, this, iaObj, niObj, JNI_TRUE);
@@ -2458,8 +2462,33 @@
  * Signature: (Ljava/net/InetAddress;)V
  */
 JNIEXPORT void JNICALL
-Java_java_net_PlainDatagramSocketImpl_leave(JNIEnv *env, jobject this,
+PlainDatagramSocketImpl_leave(JNIEnv *env, jobject this,
                                             jobject iaObj, jobject niObj)
 {
     mcast_join_leave(env, this, iaObj, niObj, JNI_FALSE);
 }
+
+static JNINativeMethod gMethods[] = {
+  NATIVE_METHOD(PlainDatagramSocketImpl, leave, "(Ljava/net/InetAddress;Ljava/net/NetworkInterface;)V"),
+  NATIVE_METHOD(PlainDatagramSocketImpl, join, "(Ljava/net/InetAddress;Ljava/net/NetworkInterface;)V"),
+  NATIVE_METHOD(PlainDatagramSocketImpl, getTimeToLive, "()I"),
+  NATIVE_METHOD(PlainDatagramSocketImpl, getTTL, "()B"),
+  NATIVE_METHOD(PlainDatagramSocketImpl, setTimeToLive, "(I)V"),
+  NATIVE_METHOD(PlainDatagramSocketImpl, setTTL, "(B)V"),
+  NATIVE_METHOD(PlainDatagramSocketImpl, socketGetOption, "(I)Ljava/lang/Object;"),
+  NATIVE_METHOD(PlainDatagramSocketImpl, socketSetOption, "(ILjava/lang/Object;)V"),
+  NATIVE_METHOD(PlainDatagramSocketImpl, datagramSocketClose, "()V"),
+  NATIVE_METHOD(PlainDatagramSocketImpl, datagramSocketCreate, "()V"),
+  NATIVE_METHOD(PlainDatagramSocketImpl, receive0, "(Ljava/net/DatagramPacket;)V"),
+  NATIVE_METHOD(PlainDatagramSocketImpl, peekData, "(Ljava/net/DatagramPacket;)I"),
+  NATIVE_METHOD(PlainDatagramSocketImpl, peek, "(Ljava/net/InetAddress;)I"),
+  NATIVE_METHOD(PlainDatagramSocketImpl, send, "(Ljava/net/DatagramPacket;)V"),
+  NATIVE_METHOD(PlainDatagramSocketImpl, disconnect0, "(I)V"),
+  NATIVE_METHOD(PlainDatagramSocketImpl, connect0, "(Ljava/net/InetAddress;I)V"),
+  NATIVE_METHOD(PlainDatagramSocketImpl, bind0, "(ILjava/net/InetAddress;)V"),
+  NATIVE_METHOD(PlainDatagramSocketImpl, init, "()V"),
+};
+
+void register_java_net_PlainDatagramSocketImpl(JNIEnv* env) {
+  jniRegisterNativeMethods(env, "java/net/PlainDatagramSocketImpl", gMethods, NELEM(gMethods));
+}
diff --git a/ojluni/src/main/native/PlainSocketImpl.c b/ojluni/src/main/native/PlainSocketImpl.c
index 82616f2..dccea0b 100755
--- a/ojluni/src/main/native/PlainSocketImpl.c
+++ b/ojluni/src/main/native/PlainSocketImpl.c
@@ -43,7 +43,7 @@
 #endif
 #ifdef __linux__
 #include <unistd.h>
-#include <sys/sysctl.h>
+//#include <sys/sysctl.h>
 #endif
 
 #include "jvm.h"
@@ -52,6 +52,10 @@
 
 #include "java_net_SocketOptions.h"
 #include "java_net_PlainSocketImpl.h"
+#include "JNIHelp.h"
+
+#define NATIVE_METHOD(className, functionName, signature) \
+{ #functionName, signature, (void*)(className ## _ ## functionName) }
 
 /************************************************************************
  * PlainSocketImpl
@@ -136,7 +140,7 @@
  * Signature: ()V
  */
 JNIEXPORT void JNICALL
-Java_java_net_PlainSocketImpl_initProto(JNIEnv *env, jclass cls) {
+PlainSocketImpl_initProto(JNIEnv *env, jclass cls) {
     psi_fdID = (*env)->GetFieldID(env, cls , "fd",
                                   "Ljava/io/FileDescriptor;");
     CHECK_NULL(psi_fdID);
@@ -178,7 +182,7 @@
  * Method:    socketCreate
  * Signature: (Z)V */
 JNIEXPORT void JNICALL
-Java_java_net_PlainSocketImpl_socketCreate(JNIEnv *env, jobject this,
+PlainSocketImpl_socketCreate(JNIEnv *env, jobject this,
                                            jboolean stream) {
     jobject fdObj, ssObj;
     int fd;
@@ -252,7 +256,7 @@
  * Signature: (Ljava/net/InetAddress;I)V
  */
 JNIEXPORT void JNICALL
-Java_java_net_PlainSocketImpl_socketConnect(JNIEnv *env, jobject this,
+PlainSocketImpl_socketConnect(JNIEnv *env, jobject this,
                                             jobject iaObj, jint port,
                                             jint timeout)
 {
@@ -546,7 +550,7 @@
  * Signature: (Ljava/net/InetAddress;I)V
  */
 JNIEXPORT void JNICALL
-Java_java_net_PlainSocketImpl_socketBind(JNIEnv *env, jobject this,
+PlainSocketImpl_socketBind(JNIEnv *env, jobject this,
                                          jobject iaObj, jint localport) {
 
     /* fdObj is the FileDescriptor field on this */
@@ -612,7 +616,7 @@
  * Signature: (I)V
  */
 JNIEXPORT void JNICALL
-Java_java_net_PlainSocketImpl_socketListen (JNIEnv *env, jobject this,
+PlainSocketImpl_socketListen (JNIEnv *env, jobject this,
                                             jint count)
 {
     /* this FileDescriptor fd field */
@@ -647,7 +651,7 @@
  * Signature: (Ljava/net/SocketImpl;)V
  */
 JNIEXPORT void JNICALL
-Java_java_net_PlainSocketImpl_socketAccept(JNIEnv *env, jobject this,
+PlainSocketImpl_socketAccept(JNIEnv *env, jobject this,
                                            jobject socket)
 {
     /* fields on this */
@@ -800,7 +804,7 @@
  * Signature: ()I
  */
 JNIEXPORT jint JNICALL
-Java_java_net_PlainSocketImpl_socketAvailable(JNIEnv *env, jobject this) {
+PlainSocketImpl_socketAvailable(JNIEnv *env, jobject this) {
 
     jint ret = -1;
     jobject fdObj = (*env)->GetObjectField(env, this, psi_fdID);
@@ -831,7 +835,7 @@
  * Signature: (Z)V
  */
 JNIEXPORT void JNICALL
-Java_java_net_PlainSocketImpl_socketClose0(JNIEnv *env, jobject this,
+PlainSocketImpl_socketClose0(JNIEnv *env, jobject this,
                                           jboolean useDeferredClose) {
 
     jobject fdObj = (*env)->GetObjectField(env, this, psi_fdID);
@@ -860,7 +864,7 @@
  * Signature: (I)V
  */
 JNIEXPORT void JNICALL
-Java_java_net_PlainSocketImpl_socketShutdown(JNIEnv *env, jobject this,
+PlainSocketImpl_socketShutdown(JNIEnv *env, jobject this,
                                              jint howto)
 {
 
@@ -888,7 +892,7 @@
  * Signature: (IZLjava/lang/Object;)V
  */
 JNIEXPORT void JNICALL
-Java_java_net_PlainSocketImpl_socketSetOption(JNIEnv *env, jobject this,
+PlainSocketImpl_socketSetOption(JNIEnv *env, jobject this,
                                               jint cmd, jboolean on,
                                               jobject value) {
     int fd;
@@ -984,7 +988,7 @@
  * Signature: (I)I
  */
 JNIEXPORT jint JNICALL
-Java_java_net_PlainSocketImpl_socketGetOption(JNIEnv *env, jobject this,
+PlainSocketImpl_socketGetOption(JNIEnv *env, jobject this,
                                               jint cmd, jobject iaContainerObj) {
 
     int fd;
@@ -1077,7 +1081,7 @@
  * Signature: (B)V
  */
 JNIEXPORT void JNICALL
-Java_java_net_PlainSocketImpl_socketSendUrgentData(JNIEnv *env, jobject this,
+PlainSocketImpl_socketSendUrgentData(JNIEnv *env, jobject this,
                                              jint data) {
     /* The fd field */
     jobject fdObj = (*env)->GetObjectField(env, this, psi_fdID);
@@ -1108,3 +1112,21 @@
         return;
     }
 }
+
+static JNINativeMethod gMethods[] = {
+  NATIVE_METHOD(PlainSocketImpl, socketSendUrgentData, "(I)V"),
+  NATIVE_METHOD(PlainSocketImpl, socketGetOption, "(ILjava/lang/Object;)I"),
+  NATIVE_METHOD(PlainSocketImpl, socketSetOption, "(IZLjava/lang/Object;)V"),
+  NATIVE_METHOD(PlainSocketImpl, socketShutdown, "(I)V"),
+  NATIVE_METHOD(PlainSocketImpl, socketClose0, "(Z)V"),
+  NATIVE_METHOD(PlainSocketImpl, socketAvailable, "()I"),
+  NATIVE_METHOD(PlainSocketImpl, socketListen, "(I)V"),
+  NATIVE_METHOD(PlainSocketImpl, socketBind, "(Ljava/net/InetAddress;I)V"),
+  NATIVE_METHOD(PlainSocketImpl, socketConnect, "(Ljava/net/InetAddress;II)V"),
+  NATIVE_METHOD(PlainSocketImpl, socketCreate, "(Z)V"),
+  NATIVE_METHOD(PlainSocketImpl, initProto, "()V"),
+};
+
+void register_java_net_PlainSocketImpl(JNIEnv* env) {
+  jniRegisterNativeMethods(env, "java/net/PlainSocketImpl", gMethods, NELEM(gMethods));
+}
diff --git a/ojluni/src/main/native/Register.cpp b/ojluni/src/main/native/Register.cpp
index 119ce0f..19fa53d 100644
--- a/ojluni/src/main/native/Register.cpp
+++ b/ojluni/src/main/native/Register.cpp
@@ -38,12 +38,26 @@
 extern void register_sun_nio_ch_NativeThread(JNIEnv*);
 extern void register_sun_nio_ch_FileKey(JNIEnv*);
 extern void register_java_io_ObjectStreamClass(JNIEnv*);
+extern void register_java_net_InetAddress(JNIEnv*);
+extern void register_java_net_Inet4Address(JNIEnv*);
+extern void register_java_net_Inet6Address(JNIEnv*);
+extern void register_java_net_InetAddressImplFactory(JNIEnv*);
+extern void register_java_net_PlainSocketImpl(JNIEnv*);
+extern void register_java_net_PlainDatagramSocketImpl(JNIEnv*);
+extern void register_java_net_NetworkInterface(JNIEnv*);
+extern void register_java_net_DatagramPacket(JNIEnv*);
+extern void register_java_net_Inet4AddressImpl(JNIEnv*);
+extern void register_java_net_Inet6AddressImpl(JNIEnv*);
+extern void register_java_net_SocketInputStream(JNIEnv*);
+extern void register_java_net_SocketOutputStream(JNIEnv*);
+extern void register_sun_net_spi_DefaultProxySelector(JNIEnv*);
+
+extern jint net_JNI_OnLoad(JavaVM*, void*);
 
 }
 
 // DalvikVM calls this on startup, so we can statically register all our native methods.
-jint JNI_OnLoad(JavaVM* vm, void*) {
-    JNIEnv* env;
+jint JNI_OnLoad(JavaVM* vm, void*) { JNIEnv* env;
     if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
         ALOGE("JavaVM::GetEnv() failed");
         abort();
@@ -64,5 +78,19 @@
     register_sun_nio_ch_NativeThread(env);
     register_sun_nio_ch_FileKey(env);
     register_java_io_ObjectStreamClass(env);
+    register_java_net_InetAddress(env);
+    register_java_net_Inet4Address(env);
+    register_java_net_Inet6Address(env);
+    register_java_net_InetAddressImplFactory(env);
+    register_java_net_PlainSocketImpl(env);
+    register_java_net_PlainDatagramSocketImpl(env);
+    register_java_net_NetworkInterface(env);
+    register_java_net_DatagramPacket(env);
+    register_java_net_Inet4AddressImpl(env);
+    register_java_net_Inet6AddressImpl(env);
+    register_java_net_SocketInputStream(env);
+    register_java_net_SocketOutputStream(env);
+    register_sun_net_spi_DefaultProxySelector(env);
+    net_JNI_OnLoad(vm, NULL);
     return JNI_VERSION_1_6;
 }
diff --git a/ojluni/src/main/native/SocketInputStream.c b/ojluni/src/main/native/SocketInputStream.c
index 1e115ce..92e6822 100755
--- a/ojluni/src/main/native/SocketInputStream.c
+++ b/ojluni/src/main/native/SocketInputStream.c
@@ -34,6 +34,10 @@
 #include "net_util.h"
 
 #include "java_net_SocketInputStream.h"
+#include "JNIHelp.h"
+
+#define NATIVE_METHOD(className, functionName, signature) \
+{ #functionName, signature, (void*)(className ## _ ## functionName) }
 
 
 /************************************************************************
@@ -48,7 +52,7 @@
  * Signature: ()V
  */
 JNIEXPORT void JNICALL
-Java_java_net_SocketInputStream_init(JNIEnv *env, jclass cls) {
+SocketInputStream_init(JNIEnv *env, jclass cls) {
     IO_fd_fdID = NET_GetFileDescriptorID(env);
 }
 
@@ -58,7 +62,7 @@
  * Signature: (Ljava/io/FileDescriptor;[BIII)I
  */
 JNIEXPORT jint JNICALL
-Java_java_net_SocketInputStream_socketRead0(JNIEnv *env, jobject this,
+SocketInputStream_socketRead0(JNIEnv *env, jobject this,
                                             jobject fdObj, jbyteArray data,
                                             jint off, jint len, jint timeout)
 {
@@ -159,3 +163,12 @@
     }
     return nread;
 }
+
+static JNINativeMethod gMethods[] = {
+  NATIVE_METHOD(SocketInputStream, socketRead0, "(Ljava/io/FileDescriptor;[BIII)I"),
+  NATIVE_METHOD(SocketInputStream, init, "()V"),
+};
+
+void register_java_net_SocketInputStream(JNIEnv* env) {
+  jniRegisterNativeMethods(env, "java/net/SocketInputStream", gMethods, NELEM(gMethods));
+}
diff --git a/ojluni/src/main/native/SocketOutputStream.c b/ojluni/src/main/native/SocketOutputStream.c
index d6e01ff..14a915f 100755
--- a/ojluni/src/main/native/SocketOutputStream.c
+++ b/ojluni/src/main/native/SocketOutputStream.c
@@ -34,6 +34,10 @@
 #include "net_util.h"
 
 #include "java_net_SocketOutputStream.h"
+#include "JNIHelp.h"
+
+#define NATIVE_METHOD(className, functionName, signature) \
+{ #functionName, signature, (void*)(className ## _ ## functionName) }
 
 #define min(a, b)       ((a) < (b) ? (a) : (b))
 
@@ -49,7 +53,7 @@
  * Signature: ()V
  */
 JNIEXPORT void JNICALL
-Java_java_net_SocketOutputStream_init(JNIEnv *env, jclass cls) {
+SocketOutputStream_init(JNIEnv *env, jclass cls) {
     IO_fd_fdID = NET_GetFileDescriptorID(env);
 }
 
@@ -59,7 +63,7 @@
  * Signature: (Ljava/io/FileDescriptor;[BII)V
  */
 JNIEXPORT void JNICALL
-Java_java_net_SocketOutputStream_socketWrite0(JNIEnv *env, jobject this,
+SocketOutputStream_socketWrite0(JNIEnv *env, jobject this,
                                               jobject fdObj,
                                               jbyteArray data,
                                               jint off, jint len) {
@@ -134,3 +138,12 @@
         free(bufP);
     }
 }
+
+static JNINativeMethod gMethods[] = {
+  NATIVE_METHOD(SocketOutputStream, socketWrite0, "(Ljava/io/FileDescriptor;[BII)V"),
+  NATIVE_METHOD(SocketOutputStream, init, "()V"),
+};
+
+void register_java_net_SocketOutputStream(JNIEnv* env) {
+  jniRegisterNativeMethods(env, "java/net/SocketOutputStream", gMethods, NELEM(gMethods));
+}
diff --git a/ojluni/src/main/native/java_net_DatagramPacket.h b/ojluni/src/main/native/java_net_DatagramPacket.h
index 456b353..be6ad98 100755
--- a/ojluni/src/main/native/java_net_DatagramPacket.h
+++ b/ojluni/src/main/native/java_net_DatagramPacket.h
@@ -12,7 +12,7 @@
  * Method:    init
  * Signature: ()V
  */
-JNIEXPORT void JNICALL Java_java_net_DatagramPacket_init
+JNIEXPORT void JNICALL DatagramPacket_init
   (JNIEnv *, jclass);
 
 #ifdef __cplusplus
diff --git a/ojluni/src/main/native/java_net_Inet4Address.h b/ojluni/src/main/native/java_net_Inet4Address.h
index 9a618a5..7cae915 100755
--- a/ojluni/src/main/native/java_net_Inet4Address.h
+++ b/ojluni/src/main/native/java_net_Inet4Address.h
@@ -26,7 +26,7 @@
  * Method:    init
  * Signature: ()V
  */
-JNIEXPORT void JNICALL Java_java_net_Inet4Address_init
+JNIEXPORT void JNICALL Inet4Address_init
   (JNIEnv *, jclass);
 
 #ifdef __cplusplus
diff --git a/ojluni/src/main/native/java_net_Inet4AddressImpl.h b/ojluni/src/main/native/java_net_Inet4AddressImpl.h
index fbf88af..7f93d30 100755
--- a/ojluni/src/main/native/java_net_Inet4AddressImpl.h
+++ b/ojluni/src/main/native/java_net_Inet4AddressImpl.h
@@ -12,7 +12,7 @@
  * Method:    getLocalHostName
  * Signature: ()Ljava/lang/String;
  */
-JNIEXPORT jstring JNICALL Java_java_net_Inet4AddressImpl_getLocalHostName
+JNIEXPORT jstring JNICALL Inet4AddressImpl_getLocalHostName
   (JNIEnv *, jobject);
 
 /*
@@ -20,7 +20,7 @@
  * Method:    lookupAllHostAddr
  * Signature: (Ljava/lang/String;)[Ljava/net/InetAddress;
  */
-JNIEXPORT jobjectArray JNICALL Java_java_net_Inet4AddressImpl_lookupAllHostAddr
+JNIEXPORT jobjectArray JNICALL Inet4AddressImpl_lookupAllHostAddr
   (JNIEnv *, jobject, jstring);
 
 /*
@@ -28,7 +28,7 @@
  * Method:    getHostByAddr
  * Signature: ([B)Ljava/lang/String;
  */
-JNIEXPORT jstring JNICALL Java_java_net_Inet4AddressImpl_getHostByAddr
+JNIEXPORT jstring JNICALL Inet4AddressImpl_getHostByAddr
   (JNIEnv *, jobject, jbyteArray);
 
 /*
@@ -36,7 +36,7 @@
  * Method:    isReachable0
  * Signature: ([BI[BI)Z
  */
-JNIEXPORT jboolean JNICALL Java_java_net_Inet4AddressImpl_isReachable0
+JNIEXPORT jboolean JNICALL Inet4AddressImpl_isReachable0
   (JNIEnv *, jobject, jbyteArray, jint, jbyteArray, jint);
 
 #ifdef __cplusplus
diff --git a/ojluni/src/main/native/java_net_Inet6Address.h b/ojluni/src/main/native/java_net_Inet6Address.h
index 3936063..fa318c2 100755
--- a/ojluni/src/main/native/java_net_Inet6Address.h
+++ b/ojluni/src/main/native/java_net_Inet6Address.h
@@ -26,7 +26,7 @@
  * Method:    init
  * Signature: ()V
  */
-JNIEXPORT void JNICALL Java_java_net_Inet6Address_init
+JNIEXPORT void JNICALL Inet6Address_init
   (JNIEnv *, jclass);
 
 #ifdef __cplusplus
diff --git a/ojluni/src/main/native/java_net_Inet6AddressImpl.h b/ojluni/src/main/native/java_net_Inet6AddressImpl.h
index ab5f1d0..da21ed4 100755
--- a/ojluni/src/main/native/java_net_Inet6AddressImpl.h
+++ b/ojluni/src/main/native/java_net_Inet6AddressImpl.h
@@ -12,7 +12,7 @@
  * Method:    getLocalHostName
  * Signature: ()Ljava/lang/String;
  */
-JNIEXPORT jstring JNICALL Java_java_net_Inet6AddressImpl_getLocalHostName
+JNIEXPORT jstring JNICALL Inet6AddressImpl_getLocalHostName
   (JNIEnv *, jobject);
 
 /*
@@ -20,7 +20,7 @@
  * Method:    lookupAllHostAddr
  * Signature: (Ljava/lang/String;)[Ljava/net/InetAddress;
  */
-JNIEXPORT jobjectArray JNICALL Java_java_net_Inet6AddressImpl_lookupAllHostAddr
+JNIEXPORT jobjectArray JNICALL Inet6AddressImpl_lookupAllHostAddr
   (JNIEnv *, jobject, jstring);
 
 /*
@@ -28,7 +28,7 @@
  * Method:    getHostByAddr
  * Signature: ([B)Ljava/lang/String;
  */
-JNIEXPORT jstring JNICALL Java_java_net_Inet6AddressImpl_getHostByAddr
+JNIEXPORT jstring JNICALL Inet6AddressImpl_getHostByAddr
   (JNIEnv *, jobject, jbyteArray);
 
 /*
@@ -36,7 +36,7 @@
  * Method:    isReachable0
  * Signature: ([BII[BII)Z
  */
-JNIEXPORT jboolean JNICALL Java_java_net_Inet6AddressImpl_isReachable0
+JNIEXPORT jboolean JNICALL Inet6AddressImpl_isReachable0
   (JNIEnv *, jobject, jbyteArray, jint, jint, jbyteArray, jint, jint);
 
 #ifdef __cplusplus
diff --git a/ojluni/src/main/native/java_net_InetAddress.h b/ojluni/src/main/native/java_net_InetAddress.h
index 8125ff1..47f8a17 100755
--- a/ojluni/src/main/native/java_net_InetAddress.h
+++ b/ojluni/src/main/native/java_net_InetAddress.h
@@ -20,7 +20,7 @@
  * Method:    init
  * Signature: ()V
  */
-JNIEXPORT void JNICALL Java_java_net_InetAddress_init
+JNIEXPORT void JNICALL InetAddress_init
   (JNIEnv *, jclass);
 
 #ifdef __cplusplus
diff --git a/ojluni/src/main/native/java_net_NetworkInterface.h b/ojluni/src/main/native/java_net_NetworkInterface.h
index 2a9c0b7..c9970c0 100755
--- a/ojluni/src/main/native/java_net_NetworkInterface.h
+++ b/ojluni/src/main/native/java_net_NetworkInterface.h
@@ -12,7 +12,7 @@
  * Method:    getAll
  * Signature: ()[Ljava/net/NetworkInterface;
  */
-JNIEXPORT jobjectArray JNICALL Java_java_net_NetworkInterface_getAll
+JNIEXPORT jobjectArray JNICALL NetworkInterface_getAll
   (JNIEnv *, jclass);
 
 /*
@@ -20,7 +20,7 @@
  * Method:    getByName0
  * Signature: (Ljava/lang/String;)Ljava/net/NetworkInterface;
  */
-JNIEXPORT jobject JNICALL Java_java_net_NetworkInterface_getByName0
+JNIEXPORT jobject JNICALL NetworkInterface_getByName0
   (JNIEnv *, jclass, jstring);
 
 /*
@@ -28,7 +28,7 @@
  * Method:    getByIndex0
  * Signature: (I)Ljava/net/NetworkInterface;
  */
-JNIEXPORT jobject JNICALL Java_java_net_NetworkInterface_getByIndex0
+JNIEXPORT jobject JNICALL NetworkInterface_getByIndex0
   (JNIEnv *, jclass, jint);
 
 /*
@@ -36,7 +36,7 @@
  * Method:    getByInetAddress0
  * Signature: (Ljava/net/InetAddress;)Ljava/net/NetworkInterface;
  */
-JNIEXPORT jobject JNICALL Java_java_net_NetworkInterface_getByInetAddress0
+JNIEXPORT jobject JNICALL NetworkInterface_getByInetAddress0
   (JNIEnv *, jclass, jobject);
 
 /*
@@ -44,7 +44,7 @@
  * Method:    isUp0
  * Signature: (Ljava/lang/String;I)Z
  */
-JNIEXPORT jboolean JNICALL Java_java_net_NetworkInterface_isUp0
+JNIEXPORT jboolean JNICALL NetworkInterface_isUp0
   (JNIEnv *, jclass, jstring, jint);
 
 /*
@@ -52,7 +52,7 @@
  * Method:    isLoopback0
  * Signature: (Ljava/lang/String;I)Z
  */
-JNIEXPORT jboolean JNICALL Java_java_net_NetworkInterface_isLoopback0
+JNIEXPORT jboolean JNICALL NetworkInterface_isLoopback0
   (JNIEnv *, jclass, jstring, jint);
 
 /*
@@ -60,7 +60,7 @@
  * Method:    supportsMulticast0
  * Signature: (Ljava/lang/String;I)Z
  */
-JNIEXPORT jboolean JNICALL Java_java_net_NetworkInterface_supportsMulticast0
+JNIEXPORT jboolean JNICALL NetworkInterface_supportsMulticast0
   (JNIEnv *, jclass, jstring, jint);
 
 /*
@@ -68,7 +68,7 @@
  * Method:    isP2P0
  * Signature: (Ljava/lang/String;I)Z
  */
-JNIEXPORT jboolean JNICALL Java_java_net_NetworkInterface_isP2P0
+JNIEXPORT jboolean JNICALL NetworkInterface_isP2P0
   (JNIEnv *, jclass, jstring, jint);
 
 /*
@@ -76,7 +76,7 @@
  * Method:    getMacAddr0
  * Signature: ([BLjava/lang/String;I)[B
  */
-JNIEXPORT jbyteArray JNICALL Java_java_net_NetworkInterface_getMacAddr0
+JNIEXPORT jbyteArray JNICALL NetworkInterface_getMacAddr0
   (JNIEnv *, jclass, jbyteArray, jstring, jint);
 
 /*
@@ -84,7 +84,7 @@
  * Method:    getMTU0
  * Signature: (Ljava/lang/String;I)I
  */
-JNIEXPORT jint JNICALL Java_java_net_NetworkInterface_getMTU0
+JNIEXPORT jint JNICALL NetworkInterface_getMTU0
   (JNIEnv *, jclass, jstring, jint);
 
 /*
@@ -92,7 +92,7 @@
  * Method:    init
  * Signature: ()V
  */
-JNIEXPORT void JNICALL Java_java_net_NetworkInterface_init
+JNIEXPORT void JNICALL NetworkInterface_init
   (JNIEnv *, jclass);
 
 #ifdef __cplusplus
diff --git a/ojluni/src/main/native/java_net_PlainDatagramSocketImpl.h b/ojluni/src/main/native/java_net_PlainDatagramSocketImpl.h
index 50719c4..d974ce7 100755
--- a/ojluni/src/main/native/java_net_PlainDatagramSocketImpl.h
+++ b/ojluni/src/main/native/java_net_PlainDatagramSocketImpl.h
@@ -12,7 +12,7 @@
  * Method:    bind0
  * Signature: (ILjava/net/InetAddress;)V
  */
-JNIEXPORT void JNICALL Java_java_net_PlainDatagramSocketImpl_bind0
+JNIEXPORT void JNICALL PlainDatagramSocketImpl_bind0
   (JNIEnv *, jobject, jint, jobject);
 
 /*
@@ -20,7 +20,7 @@
  * Method:    send
  * Signature: (Ljava/net/DatagramPacket;)V
  */
-JNIEXPORT void JNICALL Java_java_net_PlainDatagramSocketImpl_send
+JNIEXPORT void JNICALL PlainDatagramSocketImpl_send
   (JNIEnv *, jobject, jobject);
 
 /*
@@ -28,7 +28,7 @@
  * Method:    peek
  * Signature: (Ljava/net/InetAddress;)I
  */
-JNIEXPORT jint JNICALL Java_java_net_PlainDatagramSocketImpl_peek
+JNIEXPORT jint JNICALL PlainDatagramSocketImpl_peek
   (JNIEnv *, jobject, jobject);
 
 /*
@@ -36,7 +36,7 @@
  * Method:    peekData
  * Signature: (Ljava/net/DatagramPacket;)I
  */
-JNIEXPORT jint JNICALL Java_java_net_PlainDatagramSocketImpl_peekData
+JNIEXPORT jint JNICALL PlainDatagramSocketImpl_peekData
   (JNIEnv *, jobject, jobject);
 
 /*
@@ -44,7 +44,7 @@
  * Method:    receive0
  * Signature: (Ljava/net/DatagramPacket;)V
  */
-JNIEXPORT void JNICALL Java_java_net_PlainDatagramSocketImpl_receive0
+JNIEXPORT void JNICALL PlainDatagramSocketImpl_receive0
   (JNIEnv *, jobject, jobject);
 
 /*
@@ -52,7 +52,7 @@
  * Method:    setTimeToLive
  * Signature: (I)V
  */
-JNIEXPORT void JNICALL Java_java_net_PlainDatagramSocketImpl_setTimeToLive
+JNIEXPORT void JNICALL PlainDatagramSocketImpl_setTimeToLive
   (JNIEnv *, jobject, jint);
 
 /*
@@ -60,7 +60,7 @@
  * Method:    getTimeToLive
  * Signature: ()I
  */
-JNIEXPORT jint JNICALL Java_java_net_PlainDatagramSocketImpl_getTimeToLive
+JNIEXPORT jint JNICALL PlainDatagramSocketImpl_getTimeToLive
   (JNIEnv *, jobject);
 
 /*
@@ -68,7 +68,7 @@
  * Method:    setTTL
  * Signature: (B)V
  */
-JNIEXPORT void JNICALL Java_java_net_PlainDatagramSocketImpl_setTTL
+JNIEXPORT void JNICALL PlainDatagramSocketImpl_setTTL
   (JNIEnv *, jobject, jbyte);
 
 /*
@@ -76,7 +76,7 @@
  * Method:    getTTL
  * Signature: ()B
  */
-JNIEXPORT jbyte JNICALL Java_java_net_PlainDatagramSocketImpl_getTTL
+JNIEXPORT jbyte JNICALL PlainDatagramSocketImpl_getTTL
   (JNIEnv *, jobject);
 
 /*
@@ -84,7 +84,7 @@
  * Method:    join
  * Signature: (Ljava/net/InetAddress;Ljava/net/NetworkInterface;)V
  */
-JNIEXPORT void JNICALL Java_java_net_PlainDatagramSocketImpl_join
+JNIEXPORT void JNICALL PlainDatagramSocketImpl_join
   (JNIEnv *, jobject, jobject, jobject);
 
 /*
@@ -92,7 +92,7 @@
  * Method:    leave
  * Signature: (Ljava/net/InetAddress;Ljava/net/NetworkInterface;)V
  */
-JNIEXPORT void JNICALL Java_java_net_PlainDatagramSocketImpl_leave
+JNIEXPORT void JNICALL PlainDatagramSocketImpl_leave
   (JNIEnv *, jobject, jobject, jobject);
 
 /*
@@ -100,7 +100,7 @@
  * Method:    datagramSocketCreate
  * Signature: ()V
  */
-JNIEXPORT void JNICALL Java_java_net_PlainDatagramSocketImpl_datagramSocketCreate
+JNIEXPORT void JNICALL PlainDatagramSocketImpl_datagramSocketCreate
   (JNIEnv *, jobject);
 
 /*
@@ -108,7 +108,7 @@
  * Method:    datagramSocketClose
  * Signature: ()V
  */
-JNIEXPORT void JNICALL Java_java_net_PlainDatagramSocketImpl_datagramSocketClose
+JNIEXPORT void JNICALL PlainDatagramSocketImpl_datagramSocketClose
   (JNIEnv *, jobject);
 
 /*
@@ -116,7 +116,7 @@
  * Method:    socketSetOption
  * Signature: (ILjava/lang/Object;)V
  */
-JNIEXPORT void JNICALL Java_java_net_PlainDatagramSocketImpl_socketSetOption
+JNIEXPORT void JNICALL PlainDatagramSocketImpl_socketSetOption
   (JNIEnv *, jobject, jint, jobject);
 
 /*
@@ -124,7 +124,7 @@
  * Method:    socketGetOption
  * Signature: (I)Ljava/lang/Object;
  */
-JNIEXPORT jobject JNICALL Java_java_net_PlainDatagramSocketImpl_socketGetOption
+JNIEXPORT jobject JNICALL PlainDatagramSocketImpl_socketGetOption
   (JNIEnv *, jobject, jint);
 
 /*
@@ -132,7 +132,7 @@
  * Method:    connect0
  * Signature: (Ljava/net/InetAddress;I)V
  */
-JNIEXPORT void JNICALL Java_java_net_PlainDatagramSocketImpl_connect0
+JNIEXPORT void JNICALL PlainDatagramSocketImpl_connect0
   (JNIEnv *, jobject, jobject, jint);
 
 /*
@@ -140,7 +140,7 @@
  * Method:    disconnect0
  * Signature: (I)V
  */
-JNIEXPORT void JNICALL Java_java_net_PlainDatagramSocketImpl_disconnect0
+JNIEXPORT void JNICALL PlainDatagramSocketImpl_disconnect0
   (JNIEnv *, jobject, jint);
 
 /*
@@ -148,7 +148,7 @@
  * Method:    init
  * Signature: ()V
  */
-JNIEXPORT void JNICALL Java_java_net_PlainDatagramSocketImpl_init
+JNIEXPORT void JNICALL PlainDatagramSocketImpl_init
   (JNIEnv *, jclass);
 
 #ifdef __cplusplus
diff --git a/ojluni/src/main/native/java_net_PlainSocketImpl.h b/ojluni/src/main/native/java_net_PlainSocketImpl.h
index 9afa226..dad8b66 100755
--- a/ojluni/src/main/native/java_net_PlainSocketImpl.h
+++ b/ojluni/src/main/native/java_net_PlainSocketImpl.h
@@ -16,7 +16,7 @@
  * Method:    socketCreate
  * Signature: (Z)V
  */
-JNIEXPORT void JNICALL Java_java_net_PlainSocketImpl_socketCreate
+JNIEXPORT void JNICALL PlainSocketImpl_socketCreate
   (JNIEnv *, jobject, jboolean);
 
 /*
@@ -24,7 +24,7 @@
  * Method:    socketConnect
  * Signature: (Ljava/net/InetAddress;II)V
  */
-JNIEXPORT void JNICALL Java_java_net_PlainSocketImpl_socketConnect
+JNIEXPORT void JNICALL PlainSocketImpl_socketConnect
   (JNIEnv *, jobject, jobject, jint, jint);
 
 /*
@@ -32,7 +32,7 @@
  * Method:    socketBind
  * Signature: (Ljava/net/InetAddress;I)V
  */
-JNIEXPORT void JNICALL Java_java_net_PlainSocketImpl_socketBind
+JNIEXPORT void JNICALL PlainSocketImpl_socketBind
   (JNIEnv *, jobject, jobject, jint);
 
 /*
@@ -40,7 +40,7 @@
  * Method:    socketListen
  * Signature: (I)V
  */
-JNIEXPORT void JNICALL Java_java_net_PlainSocketImpl_socketListen
+JNIEXPORT void JNICALL PlainSocketImpl_socketListen
   (JNIEnv *, jobject, jint);
 
 /*
@@ -48,7 +48,7 @@
  * Method:    socketAccept
  * Signature: (Ljava/net/SocketImpl;)V
  */
-JNIEXPORT void JNICALL Java_java_net_PlainSocketImpl_socketAccept
+JNIEXPORT void JNICALL PlainSocketImpl_socketAccept
   (JNIEnv *, jobject, jobject);
 
 /*
@@ -56,7 +56,7 @@
  * Method:    socketAvailable
  * Signature: ()I
  */
-JNIEXPORT jint JNICALL Java_java_net_PlainSocketImpl_socketAvailable
+JNIEXPORT jint JNICALL PlainSocketImpl_socketAvailable
   (JNIEnv *, jobject);
 
 /*
@@ -64,7 +64,7 @@
  * Method:    socketClose0
  * Signature: (Z)V
  */
-JNIEXPORT void JNICALL Java_java_net_PlainSocketImpl_socketClose0
+JNIEXPORT void JNICALL PlainSocketImpl_socketClose0
   (JNIEnv *, jobject, jboolean);
 
 /*
@@ -72,7 +72,7 @@
  * Method:    socketShutdown
  * Signature: (I)V
  */
-JNIEXPORT void JNICALL Java_java_net_PlainSocketImpl_socketShutdown
+JNIEXPORT void JNICALL PlainSocketImpl_socketShutdown
   (JNIEnv *, jobject, jint);
 
 /*
@@ -80,7 +80,7 @@
  * Method:    initProto
  * Signature: ()V
  */
-JNIEXPORT void JNICALL Java_java_net_PlainSocketImpl_initProto
+JNIEXPORT void JNICALL PlainSocketImpl_initProto
   (JNIEnv *, jclass);
 
 /*
@@ -88,7 +88,7 @@
  * Method:    socketSetOption
  * Signature: (IZLjava/lang/Object;)V
  */
-JNIEXPORT void JNICALL Java_java_net_PlainSocketImpl_socketSetOption
+JNIEXPORT void JNICALL PlainSocketImpl_socketSetOption
   (JNIEnv *, jobject, jint, jboolean, jobject);
 
 /*
@@ -96,7 +96,7 @@
  * Method:    socketGetOption
  * Signature: (ILjava/lang/Object;)I
  */
-JNIEXPORT jint JNICALL Java_java_net_PlainSocketImpl_socketGetOption
+JNIEXPORT jint JNICALL PlainSocketImpl_socketGetOption
   (JNIEnv *, jobject, jint, jobject);
 
 /*
@@ -104,7 +104,7 @@
  * Method:    socketSendUrgentData
  * Signature: (I)V
  */
-JNIEXPORT void JNICALL Java_java_net_PlainSocketImpl_socketSendUrgentData
+JNIEXPORT void JNICALL PlainSocketImpl_socketSendUrgentData
   (JNIEnv *, jobject, jint);
 
 #ifdef __cplusplus
diff --git a/ojluni/src/main/native/net_util.c b/ojluni/src/main/native/net_util.c
index 2f99a34..913b911 100755
--- a/ojluni/src/main/native/net_util.c
+++ b/ojluni/src/main/native/net_util.c
@@ -38,7 +38,7 @@
 }
 
 JNIEXPORT jint JNICALL
-JNI_OnLoad(JavaVM *vm, void *reserved)
+net_JNI_OnLoad(JavaVM *vm, void* ignored)
 {
     JNIEnv *env;
     jclass iCls;
@@ -77,9 +77,9 @@
 
 static void initInetAddrs(JNIEnv *env) {
     if (!initialized) {
-        Java_java_net_InetAddress_init(env, 0);
-        Java_java_net_Inet4Address_init(env, 0);
-        Java_java_net_Inet6Address_init(env, 0);
+        InetAddress_init(env, 0);
+        Inet4Address_init(env, 0);
+        Inet6Address_init(env, 0);
         initialized = 1;
     }
 }
diff --git a/ojluni/src/main/native/net_util.h b/ojluni/src/main/native/net_util.h
index 604c83d..9a68593 100755
--- a/ojluni/src/main/native/net_util.h
+++ b/ojluni/src/main/native/net_util.h
@@ -104,10 +104,10 @@
 /************************************************************************
  *  Utilities
  */
-JNIEXPORT void JNICALL Java_java_net_InetAddress_init(JNIEnv *env, jclass cls);
-JNIEXPORT void JNICALL Java_java_net_Inet4Address_init(JNIEnv *env, jclass cls);
-JNIEXPORT void JNICALL Java_java_net_Inet6Address_init(JNIEnv *env, jclass cls);
-JNIEXPORT void JNICALL Java_java_net_NetworkInterface_init(JNIEnv *env, jclass cls);
+JNIEXPORT void JNICALL InetAddress_init(JNIEnv *env, jclass cls);
+JNIEXPORT void JNICALL Inet4Address_init(JNIEnv *env, jclass cls);
+JNIEXPORT void JNICALL Inet6Address_init(JNIEnv *env, jclass cls);
+JNIEXPORT void JNICALL NetworkInterface_init(JNIEnv *env, jclass cls);
 
 JNIEXPORT void JNICALL NET_ThrowNew(JNIEnv *env, int errorNum, char *msg);
 int NET_GetError();
diff --git a/ojluni/src/main/native/net_util_md.c b/ojluni/src/main/native/net_util_md.c
index 84b3156..36efdba 100755
--- a/ojluni/src/main/native/net_util_md.c
+++ b/ojluni/src/main/native/net_util_md.c
@@ -34,15 +34,13 @@
 #include <stdlib.h>
 #include <dlfcn.h>
 
-#ifndef _ALLBSD_SOURCE
-#include <values.h>
-#else
 #include <limits.h>
 #include <sys/param.h>
-#include <sys/sysctl.h>
 #ifndef MAXINT
 #define MAXINT INT_MAX
 #endif
+#ifdef __BIONIC__
+#include <linux/ipv6_route.h>
 #endif
 
 #ifdef __solaris__
@@ -114,9 +112,9 @@
     static jfieldID ni_defaultIndexID;
     if (ni_class == NULL) {
         jclass c = (*env)->FindClass(env, "java/net/NetworkInterface");
-        CHECK_NULL(c);
+        if (c == NULL) return 0;
         c = (*env)->NewGlobalRef(env, c);
-        CHECK_NULL(c);
+        if (c == NULL) return 0;
         ni_defaultIndexID = (*env)->GetStaticFieldID(
             env, c, "defaultIndex", "I");
         ni_class = c;
diff --git a/ojluni/src/main/native/openjdksub.mk b/ojluni/src/main/native/openjdksub.mk
index daa7ea7..6ec14e9 100644
--- a/ojluni/src/main/native/openjdksub.mk
+++ b/ojluni/src/main/native/openjdksub.mk
@@ -26,6 +26,22 @@
     UnixFileSystem_md.c \
     FileSystem_md.c \
     ObjectStreamClass.c \
+    InetAddress.c \
+    InetAddressImplFactory.c \
+    net_util.c \
+    net_util_md.c \
+    Inet6Address.c \
+    Inet4Address.c \
+    linux_close.c \
+    PlainSocketImpl.c \
+    PlainDatagramSocketImpl.c \
+    NetworkInterface.c \
+    DatagramPacket.c \
+    Inet4AddressImpl.c \
+    Inet6AddressImpl.c \
+    SocketInputStream.c \
+    SocketOutputStream.c \
+    DefaultProxySelector.c \
     Register.cpp \
 
 LOCAL_C_INCLUDES += \
diff --git a/openjdk_java_files b/openjdk_java_files
index cc78193..b0ef967 100644
--- a/openjdk_java_files
+++ b/openjdk_java_files
@@ -23,6 +23,8 @@
 com/sun/java/util/jar/pack/TLGlobals.java
 com/sun/java/util/jar/pack/UnpackerImpl.java
 com/sun/java/util/jar/pack/Utils.java
+com/sun/net/ssl/internal/ssl/Provider.java
+com/sun/net/ssl/internal/ssl/X509ExtendedTrustManager.java
 com/sun/nio/file/ExtendedCopyOption.java
 com/sun/security/cert/internal/x509/X509V1CertImpl.java
 java/awt/font/NumericShaper.java
@@ -159,10 +161,84 @@
 java/lang/ref/WeakReference.java
 java/lang/RuntimePermission.java
 java/lang/Shutdown.java
+java/net/AbstractPlainDatagramSocketImpl.java
+java/net/AbstractPlainSocketImpl.java
+java/net/Authenticator.java
+java/net/BindException.java
+java/net/CacheRequest.java
+java/net/CacheResponse.java
+java/net/ConnectException.java
+java/net/ContentHandlerFactory.java
+java/net/ContentHandler.java
+java/net/CookieHandler.java
+java/net/CookieManager.java
+java/net/CookiePolicy.java
+java/net/CookieStore.java
+java/net/DatagramPacket.java
+java/net/DatagramSocketImplFactory.java
+java/net/DatagramSocketImpl.java
+java/net/DatagramSocket.java
+java/net/DefaultDatagramSocketImplFactory.java
+java/net/DefaultInterface.java
+java/net/FileNameMap.java
+java/net/HttpCookie.java
+java/net/HttpRetryException.java
+java/net/HttpURLConnection.java
+java/net/IDN.java
+java/net/Inet4AddressImpl.java
+java/net/Inet4Address.java
+java/net/Inet6AddressImpl.java
+java/net/Inet6Address.java
+java/net/InetAddressImpl.java
+java/net/InetAddress.java
+java/net/InetSocketAddress.java
+java/net/InMemoryCookieStore.java
+java/net/InterfaceAddress.java
+java/net/JarURLConnection.java
+java/net/MalformedURLException.java
+java/net/MulticastSocket.java
+java/net/NetPermission.java
+java/net/NetUtil.java
+java/net/NetworkInterface.java
+java/net/NoRouteToHostException.java
+java/net/PasswordAuthentication.java
+java/net/PlainDatagramSocketImpl.java
+java/net/PlainSocketImpl.java
+java/net/PortUnreachableException.java
+java/net/ProtocolException.java
 java/net/ProtocolFamily.java
+java/net/Proxy.java
+java/net/ProxySelector.java
+java/net/ResponseCache.java
+java/net/SecureCacheResponse.java
+java/net/ServerSocket.java
+java/net/SocketAddress.java
+java/net/SocketException.java
+java/net/SocketImplFactory.java
+java/net/SocketImpl.java
+java/net/SocketInputStream.java
+java/net/Socket.java
 java/net/SocketOption.java
+java/net/SocketOptions.java
+java/net/SocketOutputStream.java
+java/net/SocketPermission.java
+java/net/SocketTimeoutException.java
+java/net/SocketUtils.java
+java/net/SocksConsts.java
+java/net/SocksSocketImpl.java
 java/net/StandardProtocolFamily.java
 java/net/StandardSocketOptions.java
+java/net/UnknownHostException.java
+java/net/UnknownServiceException.java
+java/net/URI.java
+java/net/URISyntaxException.java
+java/net/URLClassLoader.java
+java/net/URLConnection.java
+java/net/URLDecoder.java
+java/net/URLEncoder.java
+java/net/URL.java
+java/net/URLStreamHandlerFactory.java
+java/net/URLStreamHandler.java
 java/nio/Bits.java
 java/nio/Buffer.java
 java/nio/BufferOverflowException.java
@@ -459,6 +535,7 @@
 java/security/cert/PKIXCertPathChecker.java
 java/security/cert/PKIXCertPathValidatorResult.java
 java/security/cert/PKIXParameters.java
+java/security/cert/PKIXReason.java
 java/security/cert/PolicyNode.java
 java/security/cert/PolicyQualifierInfo.java
 java/security/cert/TrustAnchor.java
@@ -893,8 +970,10 @@
 javax/net/ServerSocketFactory.java
 javax/net/SocketFactory.java
 javax/net/ssl/CertPathTrustManagerParameters.java
+javax/net/ssl/DefaultHostnameVerifier.java
 javax/net/ssl/DefaultSSLServerSocketFactory.java
 javax/net/ssl/DefaultSSLSocketFactory.java
+javax/net/ssl/ExtendedSSLSession.java
 javax/net/ssl/HandshakeCompletedEvent.java
 javax/net/ssl/HandshakeCompletedListener.java
 javax/net/ssl/HostnameVerifier.java
@@ -926,6 +1005,7 @@
 javax/net/ssl/TrustManagerFactory.java
 javax/net/ssl/TrustManagerFactorySpi.java
 javax/net/ssl/TrustManager.java
+javax/net/ssl/X509ExtendedTrustManager.java
 javax/net/ssl/X509KeyManager.java
 javax/net/ssl/X509TrustManager.java
 javax/security/auth/AuthPermission.java
@@ -971,33 +1051,138 @@
 org/apache/harmony/security/fortress/Engine.java
 org/apache/harmony/security/fortress/SecurityAccess.java
 org/apache/harmony/security/fortress/Services.java
+org/apache/harmony/security/utils/JarUtils.java
+org/apache/harmony/security/x509/tsp/TimeStampReq.java
+org/apache/harmony/security/x509/tsp/TimeStampResp.java
+org/apache/harmony/security/x509/tsp/TSTInfo.java
 sun/misc/ASCIICaseInsensitiveComparator.java
 sun/misc/BASE64Decoder.java
+sun/misc/BASE64Encoder.java
 sun/misc/CEFormatException.java
 sun/misc/CEStreamExhausted.java
 sun/misc/CharacterDecoder.java
 sun/misc/CharacterEncoder.java
 sun/misc/Cleaner.java
 sun/misc/DoubleConsts.java
+sun/misc/FileURLMapper.java
 sun/misc/FloatConsts.java
 sun/misc/FloatingDecimal.java
 sun/misc/FormattedFloatingDecimal.java
 sun/misc/FpUtils.java
 sun/misc/Hashing.java
 sun/misc/HexDumpEncoder.java
+sun/misc/InvalidJarIndexException.java
 sun/misc/IoTrace.java
 sun/misc/IOUtils.java
 sun/misc/JarIndex.java
 sun/misc/JavaSecurityProtectionDomainAccess.java
 sun/misc/LRUCache.java
 sun/misc/MetaIndex.java
+sun/misc/REException.java
+sun/misc/RegexpPool.java
+sun/misc/RegexpTarget.java
+sun/misc/Resource.java
+sun/misc/ServiceConfigurationError.java
+sun/misc/Service.java
 sun/misc/SoftCache.java
+sun/misc/URLClassPath.java
 sun/misc/VM.java
+sun/net/ApplicationProxy.java
+sun/net/ConnectionResetException.java
+sun/net/ftp/FtpClient.java
+sun/net/ftp/FtpClientProvider.java
+sun/net/ftp/FtpDirEntry.java
+sun/net/ftp/FtpDirParser.java
+sun/net/ftp/FtpLoginException.java
+sun/net/ftp/FtpProtocolException.java
+sun/net/ftp/FtpReplyCode.java
+sun/net/ftp/impl/DefaultFtpClientProvider.java
+sun/net/ftp/impl/FtpClient.java
+sun/net/idn/Punycode.java
+sun/net/idn/StringPrepDataReader.java
+sun/net/idn/StringPrep.java
+sun/net/idn/UCharacterDirection.java
+sun/net/idn/UCharacterEnums.java
+sun/net/InetAddressCachePolicy.java
 sun/net/NetHooks.java
+sun/net/NetProperties.java
+sun/net/NetworkClient.java
+sun/net/ProgressEvent.java
+sun/net/ProgressListener.java
+sun/net/ProgressMeteringPolicy.java
+sun/net/ProgressMonitor.java
+sun/net/ProgressSource.java
+sun/net/RegisteredDomain.java
 sun/net/ResourceManager.java
 sun/net/sdp/SdpProvider.java
 sun/net/sdp/SdpSupport.java
+sun/net/smtp/SmtpClient.java
+sun/net/smtp/SmtpProtocolException.java
+sun/net/SocksProxy.java
+sun/net/spi/DefaultProxySelector.java
+sun/net/spi/nameservice/NameServiceDescriptor.java
+sun/net/spi/nameservice/NameService.java
+sun/net/TelnetInputStream.java
+sun/net/TelnetOutputStream.java
+sun/net/TelnetProtocolException.java
+sun/net/TransferProtocolClient.java
+sun/net/util/IPAddressUtil.java
+sun/net/util/URLUtil.java
+sun/net/www/ApplicationLaunchException.java
+sun/net/www/HeaderParser.java
+sun/net/www/http/ChunkedInputStream.java
+sun/net/www/http/ChunkedOutputStream.java
+sun/net/www/http/HttpCaptureInputStream.java
+sun/net/www/http/HttpCapture.java
+sun/net/www/http/HttpCaptureOutputStream.java
+sun/net/www/http/HttpClient.java
+sun/net/www/http/Hurryable.java
+sun/net/www/http/KeepAliveCache.java
+sun/net/www/http/KeepAliveStreamCleaner.java
+sun/net/www/http/KeepAliveStream.java
+sun/net/www/http/PosterOutputStream.java
+sun/net/www/MessageHeader.java
+sun/net/www/MeteredStream.java
+sun/net/www/MimeEntry.java
+sun/net/www/MimeLauncher.java
+sun/net/www/MimeTable.java
 sun/net/www/ParseUtil.java
+sun/net/www/protocol/file/FileURLConnection.java
+sun/net/www/protocol/file/Handler.java
+sun/net/www/protocol/ftp/FtpURLConnection.java
+sun/net/www/protocol/ftp/Handler.java
+sun/net/www/protocol/gopher/GopherClient.java
+sun/net/www/protocol/gopher/Handler.java
+sun/net/www/protocol/http/AuthCacheImpl.java
+sun/net/www/protocol/http/AuthCache.java
+sun/net/www/protocol/http/AuthCacheValue.java
+sun/net/www/protocol/http/AuthenticationHeader.java
+sun/net/www/protocol/http/AuthenticationInfo.java
+sun/net/www/protocol/http/AuthScheme.java
+sun/net/www/protocol/http/BasicAuthentication.java
+sun/net/www/protocol/http/DigestAuthentication.java
+sun/net/www/protocol/http/Handler.java
+sun/net/www/protocol/http/HttpAuthenticator.java
+sun/net/www/protocol/http/HttpCallerInfo.java
+sun/net/www/protocol/http/HttpURLConnection.java
+sun/net/www/protocol/http/NegotiateAuthentication.java
+sun/net/www/protocol/http/Negotiator.java
+sun/net/www/protocol/http/NTLMAuthenticationProxy.java
+sun/net/www/protocol/https/AbstractDelegateHttpsURLConnection.java
+sun/net/www/protocol/https/DelegateHttpsURLConnection.java
+sun/net/www/protocol/https/Handler.java
+sun/net/www/protocol/https/HttpsClient.java
+sun/net/www/protocol/https/HttpsURLConnectionImpl.java
+sun/net/www/protocol/jar/Handler.java
+sun/net/www/protocol/jar/JarFileFactory.java
+sun/net/www/protocol/jar/JarURLConnection.java
+sun/net/www/protocol/jar/URLJarFileCallBack.java
+sun/net/www/protocol/jar/URLJarFile.java
+sun/net/www/protocol/mailto/Handler.java
+sun/net/www/protocol/mailto/MailToURLConnection.java
+sun/net/www/protocol/netdoc/Handler.java
+sun/net/www/URLConnection.java
+sun/nio/ByteBuffered.java
 sun/nio/ch/AbstractPollArrayWrapper.java
 sun/nio/ch/AbstractPollSelectorImpl.java
 sun/nio/ch/AllocatedNativeObject.java
@@ -1177,6 +1362,12 @@
 sun/security/ec/ECPrivateKeyImpl.java
 sun/security/ec/ECPublicKeyImpl.java
 sun/security/ec/NamedCurve.java
+sun/security/internal/interfaces/TlsMasterSecret.java
+sun/security/internal/spec/TlsKeyMaterialParameterSpec.java
+sun/security/internal/spec/TlsKeyMaterialSpec.java
+sun/security/internal/spec/TlsMasterSecretParameterSpec.java
+sun/security/internal/spec/TlsPrfParameterSpec.java
+sun/security/internal/spec/TlsRsaPremasterSecretParameterSpec.java
 sun/security/jca/GetInstance.java
 sun/security/jca/JCAUtil.java
 sun/security/jca/ProviderConfig.java
@@ -1191,7 +1382,9 @@
 sun/security/pkcs/PKCS9Attributes.java
 sun/security/pkcs/SignerInfo.java
 sun/security/pkcs/SigningCertificateInfo.java
+sun/security/provider/certpath/AlgorithmChecker.java
 sun/security/provider/certpath/CertPathHelper.java
+sun/security/provider/certpath/UntrustedChecker.java
 sun/security/provider/certpath/X509CertificatePair.java
 sun/security/provider/certpath/X509CertPath.java
 sun/security/provider/NativePRNG.java
@@ -1202,6 +1395,61 @@
 sun/security/provider/VerificationProvider.java
 sun/security/provider/X509Factory.java
 sun/security/rsa/SunRsaSignEntries.java
+sun/security/ssl/Alerts.java
+sun/security/ssl/AppInputStream.java
+sun/security/ssl/AppOutputStream.java
+sun/security/ssl/BaseSSLSocketImpl.java
+sun/security/ssl/ByteBufferInputStream.java
+sun/security/ssl/CipherBox.java
+sun/security/ssl/CipherSuite.java
+sun/security/ssl/CipherSuiteList.java
+sun/security/ssl/ClientHandshaker.java
+sun/security/ssl/Debug.java
+sun/security/ssl/DHClientKeyExchange.java
+sun/security/ssl/DHCrypt.java
+sun/security/ssl/ECDHClientKeyExchange.java
+sun/security/ssl/ECDHCrypt.java
+sun/security/ssl/EngineArgs.java
+sun/security/ssl/EngineInputRecord.java
+sun/security/ssl/EngineOutputRecord.java
+sun/security/ssl/EngineWriter.java
+sun/security/ssl/EphemeralKeyManager.java
+sun/security/ssl/HandshakeHash.java
+sun/security/ssl/HandshakeInStream.java
+sun/security/ssl/HandshakeMessage.java
+sun/security/ssl/HandshakeOutStream.java
+sun/security/ssl/Handshaker.java
+sun/security/ssl/HelloExtensions.java
+sun/security/ssl/InputRecord.java
+sun/security/ssl/JsseJce.java
+sun/security/ssl/KerberosClientKeyExchange.java
+sun/security/ssl/Krb5Helper.java
+sun/security/ssl/Krb5Proxy.java
+sun/security/ssl/MAC.java
+sun/security/ssl/OutputRecord.java
+sun/security/ssl/ProtocolList.java
+sun/security/ssl/ProtocolVersion.java
+sun/security/ssl/RandomCookie.java
+sun/security/ssl/Record.java
+sun/security/ssl/RSAClientKeyExchange.java
+sun/security/ssl/RSASignature.java
+sun/security/ssl/ServerHandshaker.java
+sun/security/ssl/SessionId.java
+sun/security/ssl/SignatureAndHashAlgorithm.java
+sun/security/ssl/SSLAlgorithmConstraints.java
+sun/security/ssl/SSLContextImpl.java
+sun/security/ssl/SSLEngineImpl.java
+sun/security/ssl/SSLServerSocketFactoryImpl.java
+sun/security/ssl/SSLServerSocketImpl.java
+sun/security/ssl/SSLSessionContextImpl.java
+sun/security/ssl/SSLSessionImpl.java
+sun/security/ssl/SSLSocketFactoryImpl.java
+sun/security/ssl/SSLSocketImpl.java
+sun/security/ssl/SunJSSE.java
+sun/security/ssl/SunX509KeyManagerImpl.java
+sun/security/ssl/TrustManagerFactoryImpl.java
+sun/security/ssl/X509KeyManagerImpl.java
+sun/security/ssl/X509TrustManagerImpl.java
 sun/security/timestamp/TimestampToken.java
 sun/security/util/BitArray.java
 sun/security/util/ByteArrayLexOrder.java
@@ -1214,6 +1462,10 @@
 sun/security/util/DerInputStream.java
 sun/security/util/DerOutputStream.java
 sun/security/util/DerValue.java
+sun/security/util/DisabledAlgorithmConstraints.java
+sun/security/util/HostnameChecker.java
+sun/security/util/KeyUtil.java
+sun/security/util/Length.java
 sun/security/util/ManifestDigester.java
 sun/security/util/ManifestEntryVerifier.java
 sun/security/util/ObjectIdentifier.java
@@ -1232,6 +1484,13 @@
 sun/security/util/Resources_zh_TW.java
 sun/security/util/SecurityConstants.java
 sun/security/util/SignatureFileVerifier.java
+sun/security/util/UntrustedCertificates.java
+sun/security/validator/EndEntityChecker.java
+sun/security/validator/KeyStores.java
+sun/security/validator/PKIXValidator.java
+sun/security/validator/SimpleValidator.java
+sun/security/validator/ValidatorException.java
+sun/security/validator/Validator.java
 sun/security/x509/AccessDescription.java
 sun/security/x509/AlgorithmId.java
 sun/security/x509/AttributeNameEnumeration.java