diff --git a/src/pl/plpython/feature.expected b/src/pl/plpython/feature.expected
index 351bee017ce038fb773a4301fc4faf3133b7f1ad..90d161422c53db36208de6c73db68beef3e85c0e 100644
--- a/src/pl/plpython/feature.expected
+++ b/src/pl/plpython/feature.expected
@@ -137,3 +137,21 @@ SELECT join_sequences(sequences) FROM sequences
 ----------------
 (0 rows)
 
+SELECT newline_lf();
+ newline_lf 
+------------
+        123
+(1 row)
+
+SELECT newline_cr();
+ newline_cr 
+------------
+        123
+(1 row)
+
+SELECT newline_crlf();
+ newline_crlf 
+--------------
+          123
+(1 row)
+
diff --git a/src/pl/plpython/plpython.c b/src/pl/plpython/plpython.c
index 5f5b36b0a5062c0bf727da7b98e19a810a871f0c..431396d20d25f4b52c7959d4caab22b206b0fe75 100644
--- a/src/pl/plpython/plpython.c
+++ b/src/pl/plpython/plpython.c
@@ -29,7 +29,7 @@
  * MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  *
  * IDENTIFICATION
- *	$PostgreSQL: pgsql/src/pl/plpython/plpython.c,v 1.58 2004/12/17 02:14:48 tgl Exp $
+ *	$PostgreSQL: pgsql/src/pl/plpython/plpython.c,v 1.59 2005/03/24 17:22:34 tgl Exp $
  *
  *********************************************************************
  */
@@ -1206,10 +1206,14 @@ PLy_procedure_munge_source(const char *name, const char *src)
 
 	while (*sp != '\0')
 	{
-		if (*sp == '\n')
+		if (*sp == '\r' && *(sp + 1) == '\n')
+			sp++;
+
+		if (*sp == '\n' || *sp == '\r')
 		{
-			*mp++ = *sp++;
+			*mp++ = '\n';
 			*mp++ = '\t';
+			sp++;
 		}
 		else
 			*mp++ = *sp++;
diff --git a/src/pl/plpython/plpython_function.sql b/src/pl/plpython/plpython_function.sql
index 801222f4ef8d7363817518017dbe63d362f0138f..c849c3e5b97373782523b6aea864d1382a6b510b 100644
--- a/src/pl/plpython/plpython_function.sql
+++ b/src/pl/plpython/plpython_function.sql
@@ -306,3 +306,19 @@ CREATE OR REPLACE FUNCTION write_file(text,text) RETURNS text AS '
   open(args[0],"w").write(args[1])
   return "Wrote to file: %s" % args[0]
 ' LANGUAGE plpythonu;
+
+--
+-- Universal Newline Support
+-- 
+
+CREATE OR REPLACE FUNCTION newline_lf() RETURNS integer AS
+'x = 100\ny = 23\nreturn x + y\n'
+LANGUAGE plpythonu;
+
+CREATE OR REPLACE FUNCTION newline_cr() RETURNS integer AS
+'x = 100\ry = 23\rreturn x + y\r'
+LANGUAGE plpythonu;
+
+CREATE OR REPLACE FUNCTION newline_crlf() RETURNS integer AS
+'x = 100\r\ny = 23\r\nreturn x + y\r\n'
+LANGUAGE plpythonu;
diff --git a/src/pl/plpython/plpython_test.sql b/src/pl/plpython/plpython_test.sql
index c78b4aa0c7f5f560c6c3b46624af854679ae9951..17d6b2e79225cb3de151214f642adb47bdba62f8 100644
--- a/src/pl/plpython/plpython_test.sql
+++ b/src/pl/plpython/plpython_test.sql
@@ -61,3 +61,10 @@ SELECT join_sequences(sequences) FROM sequences
 -- error in trigger
 --
 
+--
+-- Check Universal Newline Support
+--
+
+SELECT newline_lf();
+SELECT newline_cr();
+SELECT newline_crlf();