diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index eb7f0dea951c5fc6f352572241dd9cfbe98a2c7e..1eb49d7289d8ac2de959eb296b84b61de3c34be0 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,3 +1,9 @@
+2005-01-17  Tom Tromey  <tromey@redhat.com>
+
+	* java/text/MessageFormat.java (scanString): Changed how quoting
+	is handled.
+	(scanFormatElement): Likewise.
+
 2004-12-07  Mark Wielaard  <mark@klomp.org>
 
 	* java/text/MessageFormat.java (scanFormat): Chain thrown exception.
diff --git a/libjava/java/text/MessageFormat.java b/libjava/java/text/MessageFormat.java
index 171fffe6d2508b576f51dbfc46911873dc88613c..6a031bc72543568520e69daf38f37eed7bf97b5a 100644
--- a/libjava/java/text/MessageFormat.java
+++ b/libjava/java/text/MessageFormat.java
@@ -1,5 +1,5 @@
 /* MessageFormat.java - Localized message formatting.
-   Copyright (C) 1999, 2001, 2002, 2004 Free Software Foundation, Inc.
+   Copyright (C) 1999, 2001, 2002, 2004, 2005 Free Software Foundation, Inc.
 
 This file is part of GNU Classpath.
 
@@ -193,27 +193,36 @@ public class MessageFormat extends Format
   {
     int max = pat.length();
     buffer.setLength(0);
+    boolean quoted = false;
     for (; index < max; ++index)
       {
 	char c = pat.charAt(index);
-	if (c == '\'' && index + 2 < max && pat.charAt(index + 2) == '\'')
+	if (quoted)
 	  {
-	    buffer.append(pat.charAt(index + 1));
-	    index += 2;
+	    // In a quoted context, a single quote ends the quoting.
+	    if (c == '\'')
+	      quoted = false;
+	    else
+	      buffer.append(c);
 	  }
-	else if (c == '\'' && index + 1 < max
-		 && pat.charAt(index + 1) == '\'')
+	// Check for '', which is a single quote.
+	else if (c == '\'' && index + 1 < max && pat.charAt(index + 1) == '\'')
 	  {
 	    buffer.append(c);
 	    ++index;
 	  }
+	else if (c == '\'')
+	  {
+	    // Start quoting.
+	    quoted = true;
+	  }
 	else if (c == '{')
 	  break;
-	else if (c == '}')
-	  throw new IllegalArgumentException("Found '}' without '{'");
 	else
 	  buffer.append(c);
       }
+    // Note that we explicitly allow an unterminated quote.  This is
+    // done for compatibility.
     return index;
   }
 
@@ -225,39 +234,42 @@ public class MessageFormat extends Format
     int max = pat.length();
     buffer.setLength(0);
     int brace_depth = 1;
+    boolean quoted = false;
 
     for (; index < max; ++index)
       {
 	char c = pat.charAt(index);
-	if (c == '\'' && index + 2 < max && pat.charAt(index + 2) == '\'')
+	// First see if we should turn off quoting.
+	if (quoted)
 	  {
-	    buffer.append(c);
-	    buffer.append(pat.charAt(index + 1));
-	    buffer.append(c);
-	    index += 2;
+	    if (c == '\'')
+	      quoted = false;
+	    // In both cases we fall through to inserting the
+	    // character here.
 	  }
+	// See if we have just a plain quote to insert.
 	else if (c == '\'' && index + 1 < max
 		 && pat.charAt(index + 1) == '\'')
 	  {
 	    buffer.append(c);
 	    ++index;
 	  }
+	// See if quoting should turn on.
+	else if (c == '\'')
+	  quoted = true;
 	else if (c == '{')
-	  {
-	    buffer.append(c);
-	    ++brace_depth;
-	  }
+	  ++brace_depth;
 	else if (c == '}')
 	  {
 	    if (--brace_depth == 0)
 	      break;
-	    buffer.append(c);
 	  }
 	// Check for TERM after braces, because TERM might be `}'.
 	else if (c == term)
 	  break;
-	else
-	  buffer.append(c);
+	// All characters, including opening and closing quotes, are
+	// inserted here.
+	buffer.append(c);
       }
     return index;
   }