diff --git a/Data/Base58Address.hs b/Data/Base58Address.hs
--- a/Data/Base58Address.hs
+++ b/Data/Base58Address.hs
@@ -1,9 +1,15 @@
 {-# LANGUAGE CPP #-}
---module Data.Base58Address (BitcoinAddress, RippleAddress) where
-module Data.Base58Address where
+#ifdef TESTS
+module Data.Base58Address (BitcoinAddress, RippleAddress, RippleAddress0(..)) where
+#else
+module Data.Base58Address (BitcoinAddress, RippleAddress) where
+#endif
 
+import Control.Monad (when)
 import Control.Arrow ((***))
 import Data.Word
+import Data.Binary (Binary(..), getWord8, putWord8)
+import Data.Binary.Get (getByteString)
 import qualified Crypto.Hash.SHA256 as SHA256
 import qualified Data.ByteString as BS
 
@@ -16,18 +22,22 @@
 instance Arbitrary Base58Address where
 	arbitrary = do
 		ver <- arbitrary
-		adr <- arbitrary `suchThat` (>0)
+		adr <- arbitrary `suchThat` (>=0)
 		return $ Base58Address ver adr
 
 instance Arbitrary BitcoinAddress where
-	arbitrary = do
-		adr <- arbitrary
-		return $ BitcoinAddress adr
+	arbitrary = fmap BitcoinAddress arbitrary
 
 instance Arbitrary RippleAddress where
+	arbitrary = fmap RippleAddress arbitrary
+
+newtype RippleAddress0 = RippleAddress0 RippleAddress
+	deriving (Show)
+
+instance Arbitrary RippleAddress0 where
 	arbitrary = do
-		adr <- arbitrary
-		return $ RippleAddress adr
+		adr <- arbitrary `suchThat` (>=0)
+		return $ RippleAddress0 $ RippleAddress $ Base58Address 0 adr
 #endif
 
 newtype BitcoinAddress = BitcoinAddress Base58Address
@@ -57,6 +67,20 @@
 	readsPrec _ s = case decodeB58 rippleAlphabet s of
 		Just x -> [(RippleAddress x,"")]
 		Nothing -> []
+
+instance Binary RippleAddress where
+	get = do
+		len <- getWord8
+		when (len /= 20) $
+			fail $ "RippleAddress is 160 bit encoding, len is " ++ show len
+		value <- (fromBase 256 . BS.unpack) `fmap` getByteString 20
+		return $ RippleAddress (Base58Address 0 value)
+
+	put (RippleAddress (Base58Address 0 value)) = do
+		putWord8 20
+		let bytes = toBase 256 value
+		mapM_ putWord8 (replicate (20 - length bytes) 0 ++ bytes)
+	put _ = fail "RippleAddress version is always 0"
 
 data Base58Address = Base58Address !Word8 !Integer
 	deriving (Ord, Eq)
diff --git a/base58address.cabal b/base58address.cabal
--- a/base58address.cabal
+++ b/base58address.cabal
@@ -1,5 +1,5 @@
 name:            base58address
-version:         0.1
+version:         0.2
 cabal-version:   >= 1.8
 license:         OtherLicense
 license-file:    COPYING
@@ -32,6 +32,7 @@
                 base == 4.*,
                 containers,
                 bytestring,
+                binary,
                 cryptohash
 
 test-suite tests
@@ -44,6 +45,7 @@
                 base == 4.*,
                 containers,
                 bytestring,
+                binary,
                 cryptohash,
                 QuickCheck >= 2.4.1.1,
                 test-framework,
diff --git a/tests/suite.hs b/tests/suite.hs
--- a/tests/suite.hs
+++ b/tests/suite.hs
@@ -1,5 +1,7 @@
 module Main (main) where
 
+import Data.Binary (encode, decode)
+
 import Test.Framework (defaultMain, testGroup, Test)
 import Test.Framework.Providers.QuickCheck2
 
@@ -17,12 +19,21 @@
 	str = show $! adr
 	{-# NOINLINE str #-}
 
+prop_encode_decode_ripple :: RippleAddress0 -> Bool
+prop_encode_decode_ripple (RippleAddress0 adr) = (decode $! bytes) == adr
+	where
+	bytes = encode $! adr
+	{-# NOINLINE bytes #-}
+
 tests :: [Test]
 tests =
 	[
-		testGroup "Encode/decode loop" [
+		testGroup "read/show loop" [
 			testProperty "BitcoinAddress" prop_read_show_bitcoin,
 			testProperty "RippleAddress" prop_read_show_ripple
+		],
+		testGroup "encode/decode loop" [
+			testProperty "RippleAddress" prop_encode_decode_ripple
 		]
 	]
 
