diff --git a/libcore/x-net/src/main/java/org/apache/harmony/xnet/provider/jsse/OpenSSLSessionImpl.java b/libcore/x-net/src/main/java/org/apache/harmony/xnet/provider/jsse/OpenSSLSessionImpl.java
index b218271..9aa4b86 100644
--- a/libcore/x-net/src/main/java/org/apache/harmony/xnet/provider/jsse/OpenSSLSessionImpl.java
+++ b/libcore/x-net/src/main/java/org/apache/harmony/xnet/provider/jsse/OpenSSLSessionImpl.java
@@ -89,47 +89,18 @@
         this.sessionContext = sessionContext;
         initializeNative(derData);
     }
-  
-    /**
-     * Returns the identifier of the actual OpenSSL session.
-     */
-    private native byte[] nativegetid();
 
     /**
      * Gets the identifier of the actual SSL session
      * @return array of sessions' identifiers.
      */
-    public byte[] getId() {
-        return nativegetid();
-    }
-
-    /**
-     * Gets the creation time of the OpenSSL session.
-     * @return the session's creation time in milli seconds since January
-     * 1st, 1970
-     */
-    private native long nativegetcreationtime();
-
-    /**
-     * Serialize the native state of the session ( ID, cypher, keys - but 
-     * not certs ), using openSSL i2d_SSL_SESSION()
-     * 
-     * @return the DER encoding of the session. 
-     */
-    private native byte[] nativeserialize();
-    
-    /**
-     * Create a SSL_SESSION object using d2i_SSL_SESSION.
-     */
-    private native int nativedeserialize(byte[] data, int size);
+    public native byte[] getId();
 
     /**
      * Get the session object in DER format. This allows saving the session
      * data or sharing it with other processes.  
      */
-    byte[] getEncoded() {
-      return nativeserialize();
-    }
+    native byte[] getEncoded();
 
     /**
      * Init the underlying native object from DER data. This 
@@ -137,35 +108,28 @@
      * @throws IOException 
      */
     private void initializeNative(byte[] derData) throws IOException {
-      this.session = nativedeserialize(derData, derData.length);
-      if (this.session == 0) { 
-        throw new IOException("Invalid session data");
-      }
+        this.session = initializeNativeImpl(derData, derData.length);
+        if (this.session == 0) {
+            throw new IOException("Invalid session data");
+        }
     }
-    
+    private native int initializeNativeImpl(byte[] data, int size);
     
     /**
      * Gets the creation time of the SSL session.
-     * @return the session's creation time in milli seconds since 12.00 PM,
-     * January 1st, 1970
+     * @return the session's creation time in milliseconds since the epoch
      */
-    public long getCreationTime(){
-        return nativegetcreationtime();
-    }
+    public native long getCreationTime();
 
     /**
      * Gives the last time this concrete SSL session was accessed. Accessing
      * here is to mean that a new connection with the same SSL context data was
      * established.
      *
-     * @return the session's accessing time in milli seconds since 12.00 PM,
-     * January 1st, 1970
+     * @return the session's last access time in milliseconds since the epoch
      */
     public long getLastAccessedTime() {
-        if (lastAccessedTime == 0)
-            return nativegetcreationtime();
-        else
-            return lastAccessedTime;
+        return (lastAccessedTime == 0) ? getCreationTime() : lastAccessedTime;
     }
 
     /**
@@ -220,7 +184,7 @@
     /**
      * Returns the X509 certificates of the peer in the PEM format.
      */
-    private native byte[][] nativegetpeercertificates();
+    private native byte[][] getPeerCertificatesImpl();
 
     /**
      * Gives the certificate(s) of the peer in this SSL session
@@ -230,14 +194,14 @@
      * @return an array of X509 certificates (the peer's one first and then
      *         eventually that of the certification authority) or null if no
      *         certificate were used during the SSL connection.
-     * @throws <code>SSLPeerUnverifiedcertificateException</code> if either a
+     * @throws <code>SSLPeerUnverifiedCertificateException</code> if either a
      *         not X509 certificate was used (i.e. Kerberos certificates) or the
      *         peer could not be verified.
      */
     public javax.security.cert.X509Certificate[] getPeerCertificateChain() throws SSLPeerUnverifiedException {
         if (peerCertificateChain == null) {
             try {
-                byte[][] bytes = nativegetpeercertificates();
+                byte[][] bytes = getPeerCertificatesImpl();
                 if (bytes == null) throw new SSLPeerUnverifiedException("No certificate available");
 
                 peerCertificateChain = new javax.security.cert.X509Certificate[bytes.length];
@@ -306,11 +270,6 @@
     }
 
     /**
-     * Returns via OpenSSL call the actual peer host name.
-     */
-    private native String nativegetpeerhost();
-
-    /**
      * The peer's host name used in this SSL session is returned. It is the host
      * name of the client for the server; and that of the server for the client.
      * It is not a reliable way to get a fully qualified host name: it is mainly
@@ -322,15 +281,9 @@
      */
     public String getPeerHost() {
         return peerHost;
-        //return nativegetpeerhost();
     }
 
     /**
-     * Returns via OpenSSL call the actual peer port number.
-     */
-    private native String nativegetpeerport();
-
-    /**
      * Gives the peer's port number for the actual SSL session. It is the port
      * number of the client for the server; and that of the server for the
      * client. It is not a reliable way to get a peer's port number: it is
@@ -341,29 +294,16 @@
      */
     public int getPeerPort() {
         return peerPort;
-        //return Integer.parseInt(nativegetpeerport());
     }
 
     /**
-     * Returns via OpenSSL call the actual cipher suite in use.
-     */
-    private native String nativegetciphersuite();
-
-    /**
      * Gives back a string identifier of the crypto tools used in the actual SSL
      * session. For example AES_256_WITH_MD5.
      *
      * @return an identifier for all the cryptographic algorithms used in the
      *         actual SSL session.
      */
-    public String getCipherSuite() {
-        return nativegetciphersuite();
-    }
-
-    /**
-     * Returns via OpenSSL call the actual version of the SSL protocol.
-     */
-    private native String nativegetprotocol();
+    public native String getCipherSuite();
 
     /**
      * Gives back the standard version name of the SSL protocol used in all
@@ -373,9 +313,7 @@
      *         connections pertaining to this SSL session.
      *
      */
-    public String getProtocol() {
-        return nativegetprotocol();
-    }
+    public native String getProtocol();
 
     /**
      * Gives back the context to which the actual SSL session is bound. A SSL
@@ -406,8 +344,7 @@
         if (isValid
                 && context != null
                 && context.getSessionTimeout() != 0
-                && lastAccessedTime + context.getSessionTimeout() > System
-                        .currentTimeMillis()) {
+                && lastAccessedTime + context.getSessionTimeout() > System.currentTimeMillis()) {
             isValid = false;
         }
         return isValid;
@@ -510,14 +447,11 @@
         values.remove(name, AccessController.getContext());
     }
 
-    private native void nativefree(int session);
-
-    /**
-     * Frees the OpenSSL session in the memory.
-     */
     protected void finalize() {
         synchronized (OpenSSLSocketImpl.class) {
-            nativefree(session);
+            freeImpl(session);
         }
     }
+
+    private native void freeImpl(int session);
 }
diff --git a/libcore/x-net/src/main/native/org_apache_harmony_xnet_provider_jsse_OpenSSLSessionImpl.cpp b/libcore/x-net/src/main/native/org_apache_harmony_xnet_provider_jsse_OpenSSLSessionImpl.cpp
index 324dacf..e0ea0b8 100644
--- a/libcore/x-net/src/main/native/org_apache_harmony_xnet_provider_jsse_OpenSSLSessionImpl.cpp
+++ b/libcore/x-net/src/main/native/org_apache_harmony_xnet_provider_jsse_OpenSSLSessionImpl.cpp
@@ -16,8 +16,10 @@
 
 #define LOG_TAG "OpenSSLSessionImpl"
 
+#include "AndroidSystemNatives.h"
+#include "JNIHelp.h"
+
 #include <jni.h>
-#include <JNIHelp.h>
 
 #include <stdio.h>
 #include <string.h>
@@ -35,107 +37,78 @@
 
 #include "org_apache_harmony_xnet_provider_jsse_common.h"
 
-/**
- * Module scope variables initialized during JNI registration.
- */
 static jfieldID field_session;
 
-static SSL_SESSION *getSslSessionPointer(JNIEnv* env, jobject object) {
-    SSL_SESSION* session = (SSL_SESSION *)env->GetIntField(object, field_session);
-
-    return session;
+static SSL_SESSION* getSslSessionPointer(JNIEnv* env, jobject object) {
+    return reinterpret_cast<SSL_SESSION*>(env->GetIntField(object, field_session));
 }
 
-/**
- * Gets the peer certificate in the chain and fills a byte array with the
- * information therein.
- */
-static jobjectArray org_apache_harmony_xnet_provider_jsse_OpenSSLSessionImpl_getpeercertificates(JNIEnv* env,
+// Fills a byte[][] with the peer certificates in the chain.
+static jobjectArray OpenSSLSessionImpl_getPeerCertificatesImpl(JNIEnv* env,
         jobject object, jint jssl)
 {
-    SSL_SESSION *ssl_session;
-    SSL_CTX* ssl_ctx;
-    SSL* ssl;
-    STACK_OF(X509) *chain;
-    jobjectArray objectArray;
-
-    ssl_session = getSslSessionPointer(env, object);
-
-    ssl_ctx = SSL_CTX_new(SSLv23_client_method());
-    ssl = SSL_new(ssl_ctx);
+    SSL_SESSION* ssl_session = getSslSessionPointer(env, object);
+    SSL_CTX* ssl_ctx = SSL_CTX_new(SSLv23_client_method());
+    SSL* ssl = SSL_new(ssl_ctx);
 
     SSL_set_session(ssl, ssl_session);
 
-    chain = SSL_get_peer_cert_chain(ssl);
-
-    objectArray = getcertificatebytes(env, chain);
+    STACK_OF(X509)* chain = SSL_get_peer_cert_chain(ssl);
+    jobjectArray objectArray = getcertificatebytes(env, chain);
 
     SSL_free(ssl);
     SSL_CTX_free(ssl_ctx);
-
     return objectArray;
 }
 
 /**
- * Serialize the session.
- * See apache mod_ssl
+ * Serializes the native state of the session (ID, cipher, and keys but
+ * not certificates). Returns a byte[] containing the DER-encoded state.
+ * See apache mod_ssl.
  */
-static jbyteArray org_apache_harmony_xnet_provider_jsse_OpenSSLSessionImpl_serialize(JNIEnv* env, jobject object)
-{
-  SSL_SESSION * ssl_session;
-  jbyteArray bytes = NULL;
-  jbyte *tmp;
-  int size;
-  unsigned char *ucp;
+static jbyteArray OpenSSLSessionImpl_getEncoded(JNIEnv* env, jobject object) {
+    SSL_SESSION* ssl_session = getSslSessionPointer(env, object);
+    if (ssl_session == NULL) {
+        return NULL;
+    }
 
-  ssl_session = getSslSessionPointer(env, object);
-  if (ssl_session == NULL) {
-    return NULL;
-  }
+    // Compute the size of the DER data
+    int size = i2d_SSL_SESSION(ssl_session, NULL);
+    if (size == 0) {
+        return NULL;
+    }
 
-  // Compute the size of the DER data
-  size = i2d_SSL_SESSION(ssl_session, NULL);
-  if (size == 0) {
-    return NULL;
-  }
-
-  bytes = env->NewByteArray(size);
-  if (bytes != NULL) {
-        tmp = env->GetByteArrayElements(bytes, NULL);
-        ucp = (unsigned char *) tmp;
+    jbyteArray bytes = env->NewByteArray(size);
+    if (bytes != NULL) {
+        jbyte* tmp = env->GetByteArrayElements(bytes, NULL);
+        unsigned char* ucp = reinterpret_cast<unsigned char*>(tmp);
         i2d_SSL_SESSION(ssl_session, &ucp);
         env->ReleaseByteArrayElements(bytes, tmp, 0);
-  }
+    }
 
-  return bytes;
-
+    return bytes;
 }
 
 /**
  * Deserialize the session.
  */
-static jint org_apache_harmony_xnet_provider_jsse_OpenSSLSessionImpl_deserialize(JNIEnv* env, jobject object, jbyteArray bytes, jint size)
-{
-  const unsigned char *ucp;
-  jbyte *tmp;
-  SSL_SESSION *ssl_session;
+static jint OpenSSLSessionImpl_initializeNativeImpl(JNIEnv* env, jobject object, jbyteArray bytes, jint size) {
+    if (bytes == NULL) {
+        return 0;
+    }
 
-  if (bytes != NULL) {
-        tmp = env->GetByteArrayElements(bytes, NULL);
-        ucp = (const unsigned char *) tmp;
-        ssl_session = d2i_SSL_SESSION(NULL, &ucp, (long) size);
-        env->ReleaseByteArrayElements(bytes, tmp, 0);
+    jbyte* tmp = env->GetByteArrayElements(bytes, NULL);
+    const unsigned char* ucp = reinterpret_cast<const unsigned char*>(tmp);
+    SSL_SESSION* ssl_session = d2i_SSL_SESSION(NULL, &ucp, size);
+    env->ReleaseByteArrayElements(bytes, tmp, 0);
 
-        return (jint) ssl_session;
-  }
-  return 0;
+    return static_cast<jint>(reinterpret_cast<uintptr_t>(ssl_session));
 }
 
 /**
  * Gets and returns in a byte array the ID of the actual SSL session.
  */
-static jbyteArray org_apache_harmony_xnet_provider_jsse_OpenSSLSessionImpl_getid(JNIEnv* env, jobject object)
-{
+static jbyteArray OpenSSLSessionImpl_getId(JNIEnv* env, jobject object) {
     SSL_SESSION* ssl_session = getSslSessionPointer(env, object);
 
     jbyteArray result = env->NewByteArray(ssl_session->session_id_length);
@@ -151,76 +124,10 @@
  * Gets and returns in a long integer the creation's time of the
  * actual SSL session.
  */
-static jlong org_apache_harmony_xnet_provider_jsse_OpenSSLSessionImpl_getcreationtime(JNIEnv* env, jobject object)
-{
-    SSL_SESSION * ssl_session;
-
-    ssl_session = getSslSessionPointer(env, object);
-
-    // convert the creation time from seconds to milliseconds
-    return (jlong)(1000L * ssl_session->time);
-}
-
-/**
- * Gets and returns in a string the peer's host's name.
- */
-static jstring org_apache_harmony_xnet_provider_jsse_OpenSSLSessionImpl_getpeerhost(JNIEnv* env, jobject object)
-{
-    SSL_CTX *ssl_ctx;
-    SSL *ssl;
-    SSL_SESSION *ssl_session;
-    BIO *bio;
-    char* hostname;
-    jstring  result;
-
-    ssl_session = getSslSessionPointer(env, object);
-
-    ssl_ctx = SSL_CTX_new(SSLv23_client_method());
-    ssl = SSL_new(ssl_ctx);
-
-    SSL_set_session(ssl, ssl_session);
-
-    bio = SSL_get_rbio(ssl);
-
-    hostname = BIO_get_conn_hostname(bio);
-
-    /* Notice: hostname can be NULL */
-    result = env->NewStringUTF(hostname);
-
-    SSL_free(ssl);
-    SSL_CTX_free(ssl_ctx);
-
-    return result;
-}
-
-/**
- * Gets and returns in a string the peer's port name (https, ftp, etc.).
- */
-static jstring org_apache_harmony_xnet_provider_jsse_OpenSSLSessionImpl_getpeerport(JNIEnv* env, jobject object)
-{
-    SSL_CTX *ssl_ctx;
-    SSL *ssl;
-    SSL_SESSION *ssl_session;
-    BIO *bio;
-    char *port;
-    jstring  result;
-
-    ssl_session = getSslSessionPointer(env, object);
-
-    ssl_ctx = SSL_CTX_new(SSLv23_client_method());
-    ssl = SSL_new(ssl_ctx);
-
-    SSL_set_session(ssl, ssl_session);
-
-    bio = SSL_get_rbio(ssl);
-    port = BIO_get_conn_port(bio);
-
-    /* Notice: port name can be NULL */
-    result = env->NewStringUTF(port);
-
-    SSL_free(ssl);
-    SSL_CTX_free(ssl_ctx);
-
+static jlong OpenSSLSessionImpl_getCreationTime(JNIEnv* env, jobject object) {
+    SSL_SESSION* ssl_session = getSslSessionPointer(env, object);
+    jlong result = SSL_SESSION_get_time(ssl_session);
+    result *= 1000; // OpenSSL uses seconds, Java uses milliseconds.
     return result;
 }
 
@@ -228,48 +135,32 @@
  * Gets and returns in a string the version of the SSL protocol. If it
  * returns the string "unknown" it means that no connection is established.
  */
-static jstring org_apache_harmony_xnet_provider_jsse_OpenSSLSessionImpl_getprotocol(JNIEnv* env, jobject object)
-{
-    SSL_CTX *ssl_ctx;
-    SSL *ssl;
-    SSL_SESSION *ssl_session;
-    const char* protocol;
-    jstring  result;
-
-    ssl_session = getSslSessionPointer(env, object);
-
-    ssl_ctx = SSL_CTX_new(SSLv23_client_method());
-    ssl = SSL_new(ssl_ctx);
+static jstring OpenSSLSessionImpl_getProtocol(JNIEnv* env, jobject object) {
+    SSL_SESSION* ssl_session = getSslSessionPointer(env, object);
+    SSL_CTX* ssl_ctx = SSL_CTX_new(SSLv23_client_method());
+    SSL* ssl = SSL_new(ssl_ctx);
 
     SSL_set_session(ssl, ssl_session);
 
-    protocol = SSL_get_version(ssl);
-
-    result = env->NewStringUTF(protocol);
+    const char* protocol = SSL_get_version(ssl);
+    jstring result = env->NewStringUTF(protocol);
 
     SSL_free(ssl);
     SSL_CTX_free(ssl_ctx);
-
     return result;
 }
 
 /**
  * Gets and returns in a string the set of ciphers the actual SSL session uses.
  */
-static jstring org_apache_harmony_xnet_provider_jsse_OpenSSLSessionImpl_getciphersuite(JNIEnv* env, jobject object)
-{
-    SSL_CTX *ssl_ctx;
-    SSL *ssl;
-    SSL_SESSION *ssl_session;
-
-    ssl_session = getSslSessionPointer(env, object);
-
-    ssl_ctx = SSL_CTX_new(SSLv23_client_method());
-    ssl = SSL_new(ssl_ctx);
+static jstring OpenSSLSessionImpl_getCipherSuite(JNIEnv* env, jobject object) {
+    SSL_SESSION* ssl_session = getSslSessionPointer(env, object);
+    SSL_CTX* ssl_ctx = SSL_CTX_new(SSLv23_client_method());
+    SSL* ssl = SSL_new(ssl_ctx);
 
     SSL_set_session(ssl, ssl_session);
 
-    SSL_CIPHER *cipher = SSL_get_current_cipher(ssl);
+    SSL_CIPHER* cipher = SSL_get_current_cipher(ssl);
     jstring result = env->NewStringUTF(SSL_CIPHER_get_name(cipher));
 
     SSL_free(ssl);
@@ -280,50 +171,31 @@
 /**
  * Frees the SSL session.
  */
-static void org_apache_harmony_xnet_provider_jsse_OpenSSLSessionImpl_free(JNIEnv* env, jobject object, jint session)
-{
+static void OpenSSLSessionImpl_freeImpl(JNIEnv* env, jobject object, jint session) {
     LOGD("Freeing OpenSSL session");
-    SSL_SESSION* ssl_session;
-    ssl_session = (SSL_SESSION*) session;
+    SSL_SESSION* ssl_session = reinterpret_cast<SSL_SESSION*>(session);
     SSL_SESSION_free(ssl_session);
 }
 
-/**
- * The actual JNI methods' mapping table for the class OpenSSLSessionImpl.
- */
-static JNINativeMethod sMethods[] =
-{
-    {"nativegetid", "()[B", (void*)org_apache_harmony_xnet_provider_jsse_OpenSSLSessionImpl_getid},
-    {"nativegetcreationtime", "()J", (void*)org_apache_harmony_xnet_provider_jsse_OpenSSLSessionImpl_getcreationtime},
-    {"nativegetpeerhost", "()Ljava/lang/String;", (void*)org_apache_harmony_xnet_provider_jsse_OpenSSLSessionImpl_getpeerhost},
-    {"nativegetpeerport", "()Ljava/lang/String;", (void*)org_apache_harmony_xnet_provider_jsse_OpenSSLSessionImpl_getpeerport},
-    {"nativegetprotocol", "()Ljava/lang/String;", (void*)org_apache_harmony_xnet_provider_jsse_OpenSSLSessionImpl_getprotocol},
-    {"nativegetciphersuite", "()Ljava/lang/String;", (void*)org_apache_harmony_xnet_provider_jsse_OpenSSLSessionImpl_getciphersuite},
-    {"nativegetpeercertificates", "()[[B", (void*)org_apache_harmony_xnet_provider_jsse_OpenSSLSessionImpl_getpeercertificates},
-    {"nativefree", "(I)V", (void*)org_apache_harmony_xnet_provider_jsse_OpenSSLSessionImpl_free},
-    {"nativeserialize", "()[B", (void*)org_apache_harmony_xnet_provider_jsse_OpenSSLSessionImpl_serialize},
-    {"nativedeserialize", "([BI)I", (void*)org_apache_harmony_xnet_provider_jsse_OpenSSLSessionImpl_deserialize}
+static JNINativeMethod sMethods[] = {
+    { "freeImpl", "(I)V", (void*) OpenSSLSessionImpl_freeImpl },
+    { "getCipherSuite", "()Ljava/lang/String;", (void*) OpenSSLSessionImpl_getCipherSuite },
+    { "getCreationTime", "()J", (void*) OpenSSLSessionImpl_getCreationTime },
+    { "getEncoded", "()[B", (void*) OpenSSLSessionImpl_getEncoded },
+    { "getId", "()[B", (void*) OpenSSLSessionImpl_getId },
+    { "getPeerCertificatesImpl", "()[[B", (void*) OpenSSLSessionImpl_getPeerCertificatesImpl },
+    { "getProtocol", "()Ljava/lang/String;", (void*) OpenSSLSessionImpl_getProtocol },
+    { "initializeNativeImpl", "([BI)I", (void*) OpenSSLSessionImpl_initializeNativeImpl }
 };
 
-/**
- * Register the native methods with JNI for the class OpenSSLSessionImpl.
- */
-extern "C" int register_org_apache_harmony_xnet_provider_jsse_OpenSSLSessionImpl(JNIEnv* env)
-{
-    int ret;
-    jclass clazz;
-
-    clazz = env->FindClass("org/apache/harmony/xnet/provider/jsse/OpenSSLSessionImpl");
-
+int register_org_apache_harmony_xnet_provider_jsse_OpenSSLSessionImpl(JNIEnv* env) {
+    jclass clazz = env->FindClass("org/apache/harmony/xnet/provider/jsse/OpenSSLSessionImpl");
     if (clazz == NULL) {
-        LOGE("Can't find org/apache/harmony/xnet/provider/jsse/OpenSSLSessionImpl");
         return -1;
     }
 
     field_session = env->GetFieldID(clazz, "session", "I");
 
-    ret = jniRegisterNativeMethods(env, "org/apache/harmony/xnet/provider/jsse/OpenSSLSessionImpl",
+    return jniRegisterNativeMethods(env, "org/apache/harmony/xnet/provider/jsse/OpenSSLSessionImpl",
             sMethods, NELEM(sMethods));
-
-    return ret;
 }
diff --git a/libcore/x-net/src/test/java/tests/api/javax/net/ssl/SSLSessionTest.java b/libcore/x-net/src/test/java/tests/api/javax/net/ssl/SSLSessionTest.java
index 6eca114..430d117 100644
--- a/libcore/x-net/src/test/java/tests/api/javax/net/ssl/SSLSessionTest.java
+++ b/libcore/x-net/src/test/java/tests/api/javax/net/ssl/SSLSessionTest.java
@@ -193,7 +193,6 @@
         method = "getCreationTime",
         args = {}
     )
-    @KnownFailure("Time returned is corrupted")
     @AndroidOnly("Uses bks key store. Change useBKS to false to run on the RI")
     public void test_getCreationTime() {
         try {
@@ -235,7 +234,6 @@
         method = "getLastAccessedTime",
         args = {}
     )
-    @KnownFailure("Time returned is corrupted")
     @AndroidOnly("Uses bks key store. Change useBKS to false to run on the RI")
     public void test_getLastAccessedTime() {
         try {
