diff --git a/contrib/pg_trgm/pg_trgm--1.2.sql b/contrib/pg_trgm/pg_trgm--1.2.sql
index 49d7395d477158472fafbc75b3f9a34825bd5bc4..5ee115ecdc12a80e228078c9537285539cb53636 100644
--- a/contrib/pg_trgm/pg_trgm--1.2.sql
+++ b/contrib/pg_trgm/pg_trgm--1.2.sql
@@ -3,11 +3,13 @@
 -- complain if script is sourced in psql, rather than via CREATE EXTENSION
 \echo Use "CREATE EXTENSION pg_trgm" to load this file. \quit
 
+-- Deprecated function
 CREATE FUNCTION set_limit(float4)
 RETURNS float4
 AS 'MODULE_PATHNAME'
 LANGUAGE C STRICT VOLATILE;
 
+-- Deprecated function
 CREATE FUNCTION show_limit()
 RETURNS float4
 AS 'MODULE_PATHNAME'
@@ -26,7 +28,7 @@ LANGUAGE C STRICT IMMUTABLE;
 CREATE FUNCTION similarity_op(text,text)
 RETURNS bool
 AS 'MODULE_PATHNAME'
-LANGUAGE C STRICT STABLE;  -- stable because depends on trgm_limit
+LANGUAGE C STRICT STABLE;  -- stable because depends on pg_trgm.similarity_threshold
 
 CREATE OPERATOR % (
         LEFTARG = text,
diff --git a/contrib/pg_trgm/trgm.h b/contrib/pg_trgm/trgm.h
index f030558088c456b90c95af6d8a13304f648508d4..046cf58e1346d536e336c047606375eff28064f6 100644
--- a/contrib/pg_trgm/trgm.h
+++ b/contrib/pg_trgm/trgm.h
@@ -105,7 +105,7 @@ typedef char *BITVECP;
 
 typedef struct TrgmPackedGraph TrgmPackedGraph;
 
-extern float4 trgm_limit;
+extern double similarity_threshold;
 
 extern uint32 trgm2int(trgm *ptr);
 extern void compact_trigram(trgm *tptr, char *str, int bytelen);
diff --git a/contrib/pg_trgm/trgm_gin.c b/contrib/pg_trgm/trgm_gin.c
index baa4cc70a23fd7ec4424ca989173cbd54099d3de..ea8edef67ac86a0ab837e8cfafd170e0c7d2b3aa 100644
--- a/contrib/pg_trgm/trgm_gin.c
+++ b/contrib/pg_trgm/trgm_gin.c
@@ -206,7 +206,9 @@ gin_trgm_consistent(PG_FUNCTION_ARGS)
 			 * similarity is just c / len1.
 			 * So, independly on DIVUNION the upper bound formula is the same.
 			 */
-			res = (nkeys == 0) ? false : ((((((float4) ntrue) / ((float4) nkeys))) >= trgm_limit) ? true : false);
+			res = (nkeys == 0) ? false :
+				((((((float4) ntrue) / ((float4) nkeys))) >= similarity_threshold)
+					? true : false);
 			break;
 		case ILikeStrategyNumber:
 #ifndef IGNORECASE
@@ -283,7 +285,9 @@ gin_trgm_triconsistent(PG_FUNCTION_ARGS)
 			/*
 			 * See comment in gin_trgm_consistent() about * upper bound formula
 			 */
-			res = (nkeys == 0) ? GIN_FALSE : (((((float4) ntrue) / ((float4) nkeys)) >= trgm_limit) ? GIN_MAYBE : GIN_FALSE);
+			res = (nkeys == 0) ? GIN_FALSE :
+				(((((float4) ntrue) / ((float4) nkeys)) >= similarity_threshold)
+					? GIN_MAYBE : GIN_FALSE);
 			break;
 		case ILikeStrategyNumber:
 #ifndef IGNORECASE
diff --git a/contrib/pg_trgm/trgm_gist.c b/contrib/pg_trgm/trgm_gist.c
index 07d1dc308bb506b7285edfb749e871a67b6d10e1..cbd89586cda1b7a7f2a0ffc3907d7841422b7c51 100644
--- a/contrib/pg_trgm/trgm_gist.c
+++ b/contrib/pg_trgm/trgm_gist.c
@@ -294,7 +294,8 @@ gtrgm_consistent(PG_FUNCTION_ARGS)
 				float4		tmpsml = cnt_sml(key, qtrg);
 
 				/* strange bug at freebsd 5.2.1 and gcc 3.3.3 */
-				res = (*(int *) &tmpsml == *(int *) &trgm_limit || tmpsml > trgm_limit) ? true : false;
+				res = (*(int *) &tmpsml == *(int *) &similarity_threshold
+						|| tmpsml > similarity_threshold) ? true : false;
 			}
 			else if (ISALLTRUE(key))
 			{					/* non-leaf contains signature */
@@ -308,7 +309,8 @@ gtrgm_consistent(PG_FUNCTION_ARGS)
 				if (len == 0)
 					res = false;
 				else
-					res = (((((float8) count) / ((float8) len))) >= trgm_limit) ? true : false;
+					res = (((((float8) count) / ((float8) len))) >= similarity_threshold)
+							? true : false;
 			}
 			break;
 		case ILikeStrategyNumber:
diff --git a/contrib/pg_trgm/trgm_op.c b/contrib/pg_trgm/trgm_op.c
index 1a71a2bef3ea8c187a3b68af9f5c7148729565d8..b2c1f6b0612991a61716ece6277e82dc05a500bc 100644
--- a/contrib/pg_trgm/trgm_op.c
+++ b/contrib/pg_trgm/trgm_op.c
@@ -14,7 +14,10 @@
 
 PG_MODULE_MAGIC;
 
-float4		trgm_limit = 0.3f;
+/* GUC variables */
+double		similarity_threshold = 0.3f;
+
+void		_PG_init(void);
 
 PG_FUNCTION_INFO_V1(set_limit);
 PG_FUNCTION_INFO_V1(show_limit);
@@ -23,22 +26,52 @@ PG_FUNCTION_INFO_V1(similarity);
 PG_FUNCTION_INFO_V1(similarity_dist);
 PG_FUNCTION_INFO_V1(similarity_op);
 
+/*
+ * Module load callback
+ */
+void
+_PG_init(void)
+{
+	/* Define custom GUC variables. */
+	DefineCustomRealVariable("pg_trgm.similarity_threshold",
+							"Sets the threshold used by the %% operator.",
+							"Valid range is 0.0 .. 1.0.",
+							&similarity_threshold,
+							0.3,
+							0.0,
+							1.0,
+							PGC_USERSET,
+							0,
+							NULL,
+							NULL,
+							NULL);
+}
 
+/*
+ * Deprecated function.
+ * Use "pg_trgm.similarity_threshold" GUC variable instead of this function
+ */
 Datum
 set_limit(PG_FUNCTION_ARGS)
 {
 	float4		nlimit = PG_GETARG_FLOAT4(0);
 
 	if (nlimit < 0 || nlimit > 1.0)
-		elog(ERROR, "wrong limit, should be between 0 and 1");
-	trgm_limit = nlimit;
-	PG_RETURN_FLOAT4(trgm_limit);
+		ereport(ERROR,
+				(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+				 errmsg("wrong limit, should be between 0 and 1")));
+	similarity_threshold = nlimit;
+	PG_RETURN_FLOAT4(similarity_threshold);
 }
 
+/*
+ * Deprecated function.
+ * Use "pg_trgm.similarity_threshold" GUC variable instead of this function
+ */
 Datum
 show_limit(PG_FUNCTION_ARGS)
 {
-	PG_RETURN_FLOAT4(trgm_limit);
+	PG_RETURN_FLOAT4(similarity_threshold);
 }
 
 static int
@@ -720,5 +753,5 @@ similarity_op(PG_FUNCTION_ARGS)
 														 PG_GETARG_DATUM(0),
 														 PG_GETARG_DATUM(1)));
 
-	PG_RETURN_BOOL(res >= trgm_limit);
+	PG_RETURN_BOOL(res >= similarity_threshold);
 }
diff --git a/doc/src/sgml/pgtrgm.sgml b/doc/src/sgml/pgtrgm.sgml
index 9eb2a6742e48ec00c96de5eac8feb36f891ae40f..1a9b5a796f1ef5906c13d56d07ef5cfe8ea0b851 100644
--- a/doc/src/sgml/pgtrgm.sgml
+++ b/doc/src/sgml/pgtrgm.sgml
@@ -99,7 +99,8 @@
        Returns the current similarity threshold used by the <literal>%</>
        operator.  This sets the minimum similarity between
        two words for them to be considered similar enough to
-       be misspellings of each other, for example.
+       be misspellings of each other, for example
+       (<emphasis>deprecated</emphasis>).
       </entry>
      </row>
      <row>
@@ -108,7 +109,7 @@
       <entry>
        Sets the current similarity threshold that is used by the <literal>%</>
        operator.  The threshold must be between 0 and 1 (default is 0.3).
-       Returns the same value passed in.
+       Returns the same value passed in (<emphasis>deprecated</emphasis>).
       </entry>
      </row>
     </tbody>
@@ -133,7 +134,7 @@
       <entry>
        Returns <literal>true</> if its arguments have a similarity that is
        greater than the current similarity threshold set by
-       <function>set_limit</>.
+       <varname>pg_trgm.similarity_threshold</>.
       </entry>
      </row>
      <row>
@@ -149,6 +150,27 @@
   </table>
  </sect2>
 
+ <sect2>
+  <title>GUC Parameters</title>
+
+  <variablelist>
+   <varlistentry id="guc-pgtrgm-similarity-threshold" xreflabel="pg_trgm.similarity_threshold">
+    <term>
+     <varname>pg_trgm.similarity_threshold</> (<type>real</type>)
+     <indexterm>
+      <primary><varname>pg_trgm.similarity_threshold</> configuration parameter</primary>
+     </indexterm>
+    </term>
+    <listitem>
+     <para>
+      Sets the current similarity threshold that is used by the <literal>%</>
+      operator.  The threshold must be between 0 and 1 (default is 0.3).
+     </para>
+    </listitem>
+   </varlistentry>
+  </variablelist>
+ </sect2>
+
  <sect2>
   <title>Index Support</title>