diff --git a/contrib/isn/isn--1.0.sql b/contrib/isn/isn--1.0.sql
index ce74c17..347d692 100644
*** a/contrib/isn/isn--1.0.sql
--- b/contrib/isn/isn--1.0.sql
***************
*** 25,33 **** CREATE FUNCTION ean13_out(ean13)
--- 25,45 ----
  	AS 'MODULE_PATHNAME'
  	LANGUAGE C
  	IMMUTABLE STRICT;
+ CREATE FUNCTION ean13_recv(internal)
+ 	RETURNS ean13
+ 	AS 'MODULE_PATHNAME'
+ 	LANGUAGE C
+ 	STRICT IMMUTABLE;
+ CREATE FUNCTION ean13_send(ean13)
+ 	RETURNS bytea
+ 	AS 'MODULE_PATHNAME'
+ 	LANGUAGE C
+ 	STRICT IMMUTABLE;
  CREATE TYPE ean13 (
  	INPUT = ean13_in,
  	OUTPUT = ean13_out,
+ 	RECEIVE = ean13_recv,
+ 	SEND = ean13_send,
  	LIKE = pg_catalog.int8
  );
  COMMENT ON TYPE ean13
***************
*** 46,51 **** CREATE FUNCTION ean13_out(isbn13)
--- 58,65 ----
  CREATE TYPE isbn13 (
  	INPUT = isbn13_in,
  	OUTPUT = ean13_out,
+ 	RECEIVE = ean13_recv,
+ 	SEND = ean13_send,
  	LIKE = pg_catalog.int8
  );
  COMMENT ON TYPE isbn13
***************
*** 64,69 **** CREATE FUNCTION ean13_out(ismn13)
--- 78,85 ----
  CREATE TYPE ismn13 (
  	INPUT = ismn13_in,
  	OUTPUT = ean13_out,
+ 	RECEIVE = ean13_recv,
+ 	SEND = ean13_send,
  	LIKE = pg_catalog.int8
  );
  COMMENT ON TYPE ismn13
***************
*** 82,87 **** CREATE FUNCTION ean13_out(issn13)
--- 98,105 ----
  CREATE TYPE issn13 (
  	INPUT = issn13_in,
  	OUTPUT = ean13_out,
+ 	RECEIVE = ean13_recv,
+ 	SEND = ean13_send,
  	LIKE = pg_catalog.int8
  );
  COMMENT ON TYPE issn13
***************
*** 102,107 **** CREATE FUNCTION isn_out(isbn)
--- 120,127 ----
  CREATE TYPE isbn (
  	INPUT = isbn_in,
  	OUTPUT = isn_out,
+ 	RECEIVE = ean13_recv,
+ 	SEND = ean13_send,
  	LIKE = pg_catalog.int8
  );
  COMMENT ON TYPE isbn
***************
*** 120,125 **** CREATE FUNCTION isn_out(ismn)
--- 140,147 ----
  CREATE TYPE ismn (
  	INPUT = ismn_in,
  	OUTPUT = isn_out,
+ 	RECEIVE = ean13_recv,
+ 	SEND = ean13_send,
  	LIKE = pg_catalog.int8
  );
  COMMENT ON TYPE ismn
***************
*** 138,143 **** CREATE FUNCTION isn_out(issn)
--- 160,167 ----
  CREATE TYPE issn (
  	INPUT = issn_in,
  	OUTPUT = isn_out,
+ 	RECEIVE = ean13_recv,
+ 	SEND = ean13_send,
  	LIKE = pg_catalog.int8
  );
  COMMENT ON TYPE issn
***************
*** 156,161 **** CREATE FUNCTION isn_out(upc)
--- 180,187 ----
  CREATE TYPE upc (
  	INPUT = upc_in,
  	OUTPUT = isn_out,
+ 	RECEIVE = ean13_recv,
+ 	SEND = ean13_send,
  	LIKE = pg_catalog.int8
  );
  COMMENT ON TYPE upc
diff --git a/contrib/isn/isn.c index 49d088f..233d7ee 100644
*** a/contrib/isn/isn.c
--- b/contrib/isn/isn.c
***************
*** 16,21 ****
--- 16,23 ----
  
  #include "fmgr.h"
  #include "utils/builtins.h"
+ #include "lib/stringinfo.h"
+ #include "libpq/pqformat.h"
  
  #include "isn.h"
  #include "EAN13.h"
***************
*** 1037,1042 **** upc_in(PG_FUNCTION_ARGS)
--- 1039,1067 ----
  	PG_RETURN_EAN13(result);
  }
  
+ /* binary I/O functions
+ */
+ PG_FUNCTION_INFO_V1(ean13_recv);
+ Datum
+ ean13_recv(PG_FUNCTION_ARGS)
+ {
+ 	StringInfo      buf = (StringInfo) PG_GETARG_POINTER(0);
+ 
+ 	PG_RETURN_EAN13((ean13) pq_getmsgint64(buf));
+ }
+ 
+ PG_FUNCTION_INFO_V1(ean13_send);
+ Datum
+ ean13_send(PG_FUNCTION_ARGS)
+ {
+ 	ean13 val = PG_GETARG_EAN13(0);
+ 	StringInfoData buf;
+ 
+ 	pq_begintypsend(&buf);
+ 	pq_sendint64(&buf, val);
+ 	PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+ }
+ 
  /* casting functions
  */
  PG_FUNCTION_INFO_V1(isbn_cast_from_ean13);
