diff --git a/contrib/fuzzystrmatch/README.fuzzystrmatch b/contrib/fuzzystrmatch/README.fuzzystrmatch
index 876bdef284..ad2d12c388 100644
--- a/contrib/fuzzystrmatch/README.fuzzystrmatch
+++ b/contrib/fuzzystrmatch/README.fuzzystrmatch
@@ -33,6 +33,10 @@
  * Folded existing soundex contrib into this one. Renamed text_soundex() (C function)
  * to soundex() for consistency.
  *
+ * difference()
+ * ------------
+ * Return the difference between two strings' soundex values.  Kris Jurka
+ *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation for any purpose, without fee, and without a written agreement
  * is hereby granted, provided that the above copyright notice and this
diff --git a/contrib/fuzzystrmatch/README.soundex b/contrib/fuzzystrmatch/README.soundex
index ec4f50fd1d..5a58655cdc 100644
--- a/contrib/fuzzystrmatch/README.soundex
+++ b/contrib/fuzzystrmatch/README.soundex
@@ -7,15 +7,25 @@ United States Census in 1880, 1900, and 1910, but it has little use
 beyond English names (or the English pronunciation of names), and
 it is not a linguistic tool.
 
+When comparing two soundex values to determine similarity, the
+difference function reports how close the match is on a scale
+from zero to four, with zero being no match and four being an
+exact match.
+
 The following are some usage examples:
 
 SELECT soundex('hello world!');
 
+SELECT soundex('Anne'), soundex('Ann'), difference('Anne', 'Ann');
+SELECT soundex('Anne'), soundex('Andrew'), difference('Anne', 'Andrew');
+SELECT soundex('Anne'), soundex('Margaret'), difference('Anne', 'Margaret');
+
 CREATE TABLE s (nm text)\g
 
 insert into s values ('john')\g
 insert into s values ('joan')\g
 insert into s values ('wobbly')\g
+insert into s values ('jack')\g
 
 select * from s
 where soundex(nm) = soundex('john')\g
@@ -58,5 +68,10 @@ FROM s
 WHERE text_sx_eq(nm,'john')\g
 
 SELECT *
-from s
-where s.nm #= 'john';
+FROM s
+WHERE s.nm #= 'john';
+
+SELECT *
+FROM s
+WHERE difference(s.nm, 'john') > 2;
+
diff --git a/contrib/fuzzystrmatch/fuzzystrmatch.c b/contrib/fuzzystrmatch/fuzzystrmatch.c
index d3627097cf..90505a8b2c 100644
--- a/contrib/fuzzystrmatch/fuzzystrmatch.c
+++ b/contrib/fuzzystrmatch/fuzzystrmatch.c
@@ -755,3 +755,23 @@ _soundex(const char *instr, char *outstr)
 		++count;
 	}
 }
+
+PG_FUNCTION_INFO_V1(difference);
+
+Datum
+difference(PG_FUNCTION_ARGS)
+{
+	char sndx1[SOUNDEX_LEN+1], sndx2[SOUNDEX_LEN+1];
+	int i, result;
+
+	_soundex(_textout(PG_GETARG_TEXT_P(0)), sndx1);
+	_soundex(_textout(PG_GETARG_TEXT_P(1)), sndx2);
+
+	result = 0;
+	for (i=0; i<SOUNDEX_LEN; i++) {
+		if (sndx1[i] == sndx2[i])
+			result++;
+	}
+
+	PG_RETURN_INT32(result);
+}
diff --git a/contrib/fuzzystrmatch/fuzzystrmatch.h b/contrib/fuzzystrmatch/fuzzystrmatch.h
index 05c2022aec..8253e60ac2 100644
--- a/contrib/fuzzystrmatch/fuzzystrmatch.h
+++ b/contrib/fuzzystrmatch/fuzzystrmatch.h
@@ -60,6 +60,7 @@
 extern Datum levenshtein(PG_FUNCTION_ARGS);
 extern Datum metaphone(PG_FUNCTION_ARGS);
 extern Datum soundex(PG_FUNCTION_ARGS);
+extern Datum difference(PG_FUNCTION_ARGS);
 
 /*
  * Soundex
diff --git a/contrib/fuzzystrmatch/fuzzystrmatch.sql.in b/contrib/fuzzystrmatch/fuzzystrmatch.sql.in
index 07e6dce7e3..b4e4fadc44 100644
--- a/contrib/fuzzystrmatch/fuzzystrmatch.sql.in
+++ b/contrib/fuzzystrmatch/fuzzystrmatch.sql.in
@@ -1,28 +1,30 @@
 -- Adjust this setting to control where the objects get created.
 SET search_path = public;
 
-CREATE FUNCTION levenshtein (text,text)
-RETURNS int
+CREATE FUNCTION levenshtein (text,text) RETURNS int
 AS 'MODULE_PATHNAME','levenshtein'
-LANGUAGE 'C' WITH (iscachable, isstrict);
+LANGUAGE C IMMUTABLE STRICT;
 
-CREATE FUNCTION metaphone (text,int)
-RETURNS text
+CREATE FUNCTION metaphone (text,int) RETURNS text
 AS 'MODULE_PATHNAME','metaphone'
-LANGUAGE 'C' WITH (iscachable, isstrict);
+LANGUAGE C IMMUTABLE STRICT;
 
 CREATE FUNCTION soundex(text) RETURNS text
 AS 'MODULE_PATHNAME', 'soundex'
-LANGUAGE 'C' WITH (iscachable, isstrict);
+LANGUAGE C IMMUTABLE STRICT;
 
 CREATE FUNCTION text_soundex(text) RETURNS text
 AS 'MODULE_PATHNAME', 'soundex'
-LANGUAGE 'C';
+LANGUAGE C IMMUTABLE STRICT;
+
+CREATE FUNCTION difference(text,text) RETURNS int
+AS 'MODULE_PATHNAME', 'difference'
+LANGUAGE C IMMUTABLE STRICT;
 
 CREATE FUNCTION dmetaphone (text) RETURNS text 
-LANGUAGE C IMMUTABLE STRICT
-AS 'MODULE_PATHNAME', 'dmetaphone';
+AS 'MODULE_PATHNAME', 'dmetaphone'
+LANGUAGE C IMMUTABLE STRICT;
 
 CREATE FUNCTION dmetaphone_alt (text) RETURNS text 
-LANGUAGE C IMMUTABLE STRICT
-AS 'MODULE_PATHNAME', 'dmetaphone_alt';
+AS 'MODULE_PATHNAME', 'dmetaphone_alt'
+LANGUAGE C IMMUTABLE STRICT;