diff --git a/libcore/math/src/main/java/java/math/BigInt.java b/libcore/math/src/main/java/java/math/BigInt.java
index 3ba1da2..4d1e18e 100644
--- a/libcore/math/src/main/java/java/math/BigInt.java
+++ b/libcore/math/src/main/java/java/math/BigInt.java
@@ -256,12 +256,12 @@
     // n > 0: shift left (multiply)
     public static BigInt shift(BigInt a, int n) {
         BigInt r = newBigInt();
-        Check(NativeBN.BN_lshift(r.bignum, a.bignum, n));
+        Check(NativeBN.BN_shift(r.bignum, a.bignum, n));
         return r;
     }
 
     public void shift(int n) {
-        Check(NativeBN.BN_lshift(this.bignum, this.bignum, n));
+        Check(NativeBN.BN_shift(this.bignum, this.bignum, n));
     }
 
     public void addPositiveInt(int w) {
diff --git a/libcore/openssl/src/main/java/org/openssl/NativeBN.java b/libcore/openssl/src/main/java/org/openssl/NativeBN.java
index fd796f8..9691204 100644
--- a/libcore/openssl/src/main/java/org/openssl/NativeBN.java
+++ b/libcore/openssl/src/main/java/org/openssl/NativeBN.java
@@ -96,11 +96,8 @@
     // op: 0 = reset; 1 = set; -1 = flip
     // uses BN_set_bit(), BN_clear_bit() and BN_is_bit_set()
 
-    public static native boolean BN_lshift(int r, int a, int n);
-    // int BN_lshift(BIGNUM *r, const BIGNUM *a, int n);
-//    public static native int BN_rshift(BigInteger r, BigInteger a, int n);
-    // int BN_rshift(BIGNUM *r, const BIGNUM *a, int n);
-
+    public static native boolean BN_shift(int r, int a, int n);
+    // int BN_shift(BIGNUM *r, const BIGNUM *a, int n);
 
     public static native boolean BN_add_word(int a, int w);
     // ATTENTION: w is treated as unsigned.
diff --git a/libcore/openssl/src/main/native/BNInterface.c b/libcore/openssl/src/main/native/BNInterface.c
index ff2a2ae..8ac2395 100644
--- a/libcore/openssl/src/main/native/BNInterface.c
+++ b/libcore/openssl/src/main/native/BNInterface.c
@@ -509,72 +509,13 @@
 }
 
 /**
- * public static native int BN_lshift(int, int, int)
+ * public static native int BN_shift(int, int, int)
  */
-static jboolean NativeBN_BN_lshift(JNIEnv* env, jclass cls, BIGNUM* r, BIGNUM* a, int n) {
-// LOGD("NativeBN_BN_lshift %p %p %d", r, a, n);
+static jboolean NativeBN_BN_shift(JNIEnv* env, jclass cls, BIGNUM* r, BIGNUM* a, int n) {
     if (!twoValidHandles(env, r, a)) return FALSE;
-    if (n >= 0) return BN_lshift(r, a, n);
-
-    n = -n;
-//    return BN_rshift(r, a, n);
-// Following code insourced from bn_shift.c in order to have bug fixed:
-// FIXME: Should report to openssl team!!!
-
-	int i,j,nw,lb,rb;
-	BN_ULONG *t,*f;
-	BN_ULONG l,tmp;
-
-	bn_check_top(r);
-	bn_check_top(a);
-
-	nw=n/BN_BITS2;
-	rb=n%BN_BITS2;
-	lb=BN_BITS2-rb;
-// Changed "nw > a->top || a->top == 0" to nw >= a->top" as considering this a bug:
-	if (nw >= a->top)
-		{
-		BN_zero(r);
-		return(1);
-		}
-	if (r != a)
-		{
-		r->neg=a->neg;
-		if (bn_wexpand(r,a->top-nw+1) == NULL) return(0);
-		}
-	else
-		{
-		if (n == 0)
-			return 1; /* or the copying loop will go berserk */
-		}
-
-	f= &(a->d[nw]);
-	t=r->d;
-	j=a->top-nw;
-	r->top=j;
-
-	if (rb == 0)
-		{
-		for (i=j; i != 0; i--)
-			*(t++)= *(f++);
-		}
-	else
-		{
-		l= *(f++);
-		for (i=j-1; i != 0; i--)
-			{
-			tmp =(l>>rb)&BN_MASK2;
-			l= *(f++);
-			*(t++) =(tmp|(l<<lb))&BN_MASK2;
-			}
-		*(t++) =(l>>rb)&BN_MASK2;
-		}
-	bn_correct_top(r);
-	bn_check_top(r);
-	return(1);
+    return (n >= 0) ? BN_lshift(r, a, n) : BN_rshift(r, a, -n);
 }
 
-
 /**
  * public static native boolean BN_add_word(int, int)
  */
@@ -698,7 +639,7 @@
 static jboolean NativeBN_BN_generate_prime_ex(JNIEnv* env, jclass cls, BIGNUM* ret, int bits, jboolean safe,
         BIGNUM* add, BIGNUM* rem, jint cb) {
     if (!oneValidHandle(env, ret)) return FALSE;
-    return BN_generate_prime_ex(ret, bits, safe, add, rem, cb);
+    return BN_generate_prime_ex(ret, bits, safe, add, rem, (BN_GENCB*) cb);
 }
 
 /**
@@ -706,7 +647,7 @@
  */
 static jboolean NativeBN_BN_is_prime_ex(JNIEnv* env, jclass cls, BIGNUM* p, int nchecks, BN_CTX* ctx, jint cb) {
     if (!oneValidHandle(env, p)) return FALSE;
-    return BN_is_prime_ex(p, nchecks, ctx, cb);
+    return BN_is_prime_ex(p, nchecks, ctx, (BN_GENCB*) cb);
 }
 
 
@@ -740,7 +681,7 @@
    { "bitLength", "(I)I", (void*)NativeBN_bitLength },
    { "BN_is_bit_set", "(II)Z", (void*)NativeBN_BN_is_bit_set },
    { "modifyBit", "(III)Z", (void*)NativeBN_modifyBit },
-   { "BN_lshift", "(III)Z", (void*)NativeBN_BN_lshift },
+   { "BN_shift", "(III)Z", (void*)NativeBN_BN_shift },
    { "BN_add_word", "(II)Z", (void*)NativeBN_BN_add_word },
    { "BN_sub_word", "(II)Z", (void*)NativeBN_BN_sub_word },
    { "BN_mul_word", "(II)Z", (void*)NativeBN_BN_mul_word },
