diff --git a/src/pl/plperl/expected/plperl_plperlu.out b/src/pl/plperl/expected/plperl_plperlu.out
index e940f71..acc9dd4 100644
*** a/src/pl/plperl/expected/plperl_plperlu.out
--- b/src/pl/plperl/expected/plperl_plperlu.out
*************** CONTEXT:  PL/Perl function "bar"
*** 17,19 ****
--- 17,65 ----
  SELECT * FROM foo(); -- used to cause backend crash (after switching to plperlu)
  ERROR:  syntax error at or near "invalid" at line 4. at line 2.
  CONTEXT:  PL/Perl function "foo"
+ -- test redefinition of specific SP switching languages
+ -- http://archives.postgresql.org/pgsql-bugs/2010-01/msg00116.php
+ -- plperl first
+ create or replace function foo(text) returns text language plperl  as 'shift';
+ select foo('hey');
+  foo 
+ -----
+  hey
+ (1 row)
+ 
+ create or replace function foo(text) returns text language plperlu as 'shift';
+ select foo('hey');
+  foo 
+ -----
+  hey
+ (1 row)
+ 
+ create or replace function foo(text) returns text language plperl  as 'shift';
+ select foo('hey');
+  foo 
+ -----
+  hey
+ (1 row)
+ 
+ -- plperlu first
+ create or replace function bar(text) returns text language plperlu as 'shift';
+ select bar('hey');
+  bar 
+ -----
+  hey
+ (1 row)
+ 
+ create or replace function bar(text) returns text language plperl  as 'shift';
+ select bar('hey');
+  bar 
+ -----
+  hey
+ (1 row)
+ 
+ create or replace function bar(text) returns text language plperlu as 'shift';
+ select bar('hey');
+  bar 
+ -----
+  hey
+ (1 row)
+ 
diff --git a/src/pl/plperl/plperl.c b/src/pl/plperl/plperl.c
index 2111936..75cf543 100644
*** a/src/pl/plperl/plperl.c
--- b/src/pl/plperl/plperl.c
*************** compile_plperl_function(Oid fn_oid, bool
*** 1760,1767 ****
  		{
  			hash_search(plperl_proc_hash, internal_proname,
  						HASH_REMOVE, NULL);
! 			if (prodesc->reference)
  				SvREFCNT_dec(prodesc->reference);
  			free(prodesc->proname);
  			free(prodesc);
  			prodesc = NULL;
--- 1760,1770 ----
  		{
  			hash_search(plperl_proc_hash, internal_proname,
  						HASH_REMOVE, NULL);
! 			if (prodesc->reference) {
! 				select_perl_context(prodesc->lanpltrusted);
  				SvREFCNT_dec(prodesc->reference);
+ 				restore_context(oldcontext);
+ 			}
  			free(prodesc->proname);
  			free(prodesc);
  			prodesc = NULL;
diff --git a/src/pl/plperl/sql/plperl_plperlu.sql b/src/pl/plperl/sql/plperl_plperlu.sql
index 15b5aa2..cbc5080 100644
*** a/src/pl/plperl/sql/plperl_plperlu.sql
--- b/src/pl/plperl/sql/plperl_plperlu.sql
*************** $$ LANGUAGE plperlu; -- compile plperlu 
*** 16,18 ****
--- 16,37 ----
  SELECT * FROM bar(); -- throws exception normally (running plperl)
  SELECT * FROM foo(); -- used to cause backend crash (after switching to plperlu)
  
+ -- test redefinition of specific SP switching languages
+ -- http://archives.postgresql.org/pgsql-bugs/2010-01/msg00116.php
+ 
+ -- plperl first
+ create or replace function foo(text) returns text language plperl  as 'shift';
+ select foo('hey');
+ create or replace function foo(text) returns text language plperlu as 'shift';
+ select foo('hey');
+ create or replace function foo(text) returns text language plperl  as 'shift';
+ select foo('hey');
+ 
+ -- plperlu first
+ create or replace function bar(text) returns text language plperlu as 'shift';
+ select bar('hey');
+ create or replace function bar(text) returns text language plperl  as 'shift';
+ select bar('hey');
+ create or replace function bar(text) returns text language plperlu as 'shift';
+ select bar('hey');
+ 
