diff --git a/src/Config.py b/src/Config.py
index f8f2d544..baa558a4 100644
--- a/src/Config.py
+++ b/src/Config.py
@@ -13,7 +13,7 @@ class Config(object):
 
     def __init__(self, argv):
         self.version = "0.7.0"
-        self.rev = 4086
+        self.rev = 4089
         self.argv = argv
         self.action = None
         self.pending_changes = {}
diff --git a/src/lib/libsecp256k1message/libsecp256k1message.py b/src/lib/libsecp256k1message/libsecp256k1message.py
index 3fad4d5b..92802e1c 100644
--- a/src/lib/libsecp256k1message/libsecp256k1message.py
+++ b/src/lib/libsecp256k1message/libsecp256k1message.py
@@ -28,9 +28,9 @@ def key_pair():
     publickey = PublicKey.from_secret(secretkey.secret)
     return (publickey, secretkey)
 
-def compute_public_address(publickey):
+def compute_public_address(publickey, compressed=False):
     """Convert a public key to a public Bitcoin address."""
-    public_plain = b'\x00' + public_digest(publickey)
+    public_plain = b'\x00' + public_digest(publickey, compressed=compressed)
     return b58encode_check(public_plain)
 
 def compute_secret_address(secretkey):
@@ -38,9 +38,9 @@ def compute_secret_address(secretkey):
     secret_plain = b'\x80' + secretkey.secret
     return b58encode_check(secret_plain)
 
-def public_digest(publickey):
+def public_digest(publickey, compressed=False):
     """Convert a public key to ripemd160(sha256()) digest."""
-    publickey_hex = publickey.format(compressed=False)
+    publickey_hex = publickey.format(compressed=compressed)
     return hashlib.new('ripemd160', hashlib.sha256(publickey_hex).digest()).digest()
 
 def address_public_digest(address):
@@ -73,7 +73,7 @@ def coincurve_sig(electrum_signature):
     if len(electrum_signature) != LEN_COMPACT_SIG:
         raise ValueError('Not a 65-byte compact signature.')
     # Compute coincurve recid
-    recid = electrum_signature[0] - RECID_UNCOMPR
+    recid = (electrum_signature[0] - 27) & 3
     if not (RECID_MIN <= recid <= RECID_MAX):
         raise ValueError('Recovery ID %d is not supported.' % recid)
     recid_byte = int.to_bytes(recid, length=1, byteorder='big')
@@ -166,8 +166,10 @@ def _zero_format(message):
     return hashlib.sha256(padded).digest()
 
 def recover_address(data, sign):
-    publickey = recover_public_key(coincurve_sig(base64.b64decode(sign)), _zero_format(data))
-    return compute_public_address(publickey)
+    sign_bytes = base64.b64decode(sign)
+    is_compressed = ((sign_bytes[0] - 27) & 4) != 0
+    publickey = recover_public_key(coincurve_sig(sign_bytes), _zero_format(data))
+    return compute_public_address(publickey, compressed=is_compressed)
 
 __all__ = [
     'SignatureError',