diff --git a/gdb/objc-lang.c b/gdb/objc-lang.c
index 0e4fb71..fdd0a8c 100644
--- a/gdb/objc-lang.c
+++ b/gdb/objc-lang.c
@@ -225,7 +225,7 @@ objc_demangle (const char *mangled, int options)
      (mangled[1] == 'i' || mangled[1] == 'c') &&
       mangled[2] == '_')
     {
-      cp = demangled = xmalloc(strlen(mangled) + 2);
+      cp = demangled = xmalloc (strlen (mangled) + 2);
 
       if (mangled[1] == 'i')
 	*cp++ = '-';		/* for instance method */
@@ -233,33 +233,31 @@ objc_demangle (const char *mangled, int options)
 	*cp++ = '+';		/* for class    method */
 
       *cp++ = '[';		/* opening left brace  */
-      strcpy(cp, mangled+3);	/* tack on the rest of the mangled name */
+      strcpy (cp, mangled+3);	/* tack on the rest of the mangled name */
 
       while (*cp && *cp == '_')
 	cp++;			/* skip any initial underbars in class name */
 
-      cp = strchr(cp, '_');
+      cp = strchr (cp, '_');
       if (!cp)	                /* find first non-initial underbar */
 	{
-	  xfree(demangled);	/* not mangled name */
+	  xfree (demangled);	/* not mangled name */
 	  return NULL;
 	}
-      if (cp[1] == '_') {	/* easy case: no category name     */
-	*cp++ = ' ';		/* replace two '_' with one ' '    */
-	strcpy(cp, mangled + (cp - demangled) + 2);
-      }
-      else {
-	*cp++ = '(';		/* less easy case: category name */
-	cp = strchr(cp, '_');
-	if (!cp)
-	  {
-	    xfree(demangled);	/* not mangled name */
-	    return NULL;
-	  }
-	*cp++ = ')';
-	*cp++ = ' ';		/* overwriting 1st char of method name...  */
-	strcpy(cp, mangled + (cp - demangled));	/* get it back */
-      }
+
+      /* We leave the parentheses when lacking a category name to
+         disambiguate when there is multiple versions of a method.
+         So that break [Foo bar] can return canonical results.  */ 
+      *cp++ = '(';		/* less easy case: category name */
+      cp = strchr (cp, '_');
+      if (!cp)
+	{
+	  xfree (demangled);	/* not mangled name */
+	  return NULL;
+	}
+      *cp++ = ')';
+      *cp++ = ' ';		/* overwriting 1st char of method name...  */
+      strcpy (cp, mangled + (cp - demangled));	/* get it back */
 
       while (*cp && *cp == '_')
 	cp++;			/* skip any initial underbars in method name */
@@ -1841,3 +1839,40 @@ _initialize_objc_lang (void)
 {
   objc_objfile_data = register_objfile_data ();
 }
+
+char *
+objc_decode_symbol (const struct general_symbol_info *gsymbol)
+{
+  char ntype = '\0';
+  char *nclass = NULL;
+  char *ncategory = NULL;
+  char *nselector = NULL;
+
+  char **resultp =
+    (char **) &gsymbol->language_specific.cplus_specific.demangled_name;
+
+  if (*resultp == NULL)
+    {
+ 
+      parse_method (gsymbol->name, &ntype, &nclass, &ncategory, &nselector);
+
+      if (ncategory == NULL)
+	ncategory = "\0";
+      if (ntype && nclass && ncategory && nselector)
+	{ 
+	  size_t newlen;
+	  struct objfile *objf;
+
+	  newlen = sizeof (ntype) + strlen (nclass) + strlen (ncategory)
+			  + strlen (nselector) + sizeof ("[]()");
+
+	  *resultp = xmalloc(newlen);
+	  sprintf(*resultp, "%c[%s(%s) %s]", ntype, nclass, ncategory,
+					     nselector);
+
+	  return *resultp;
+        }
+    }
+
+  return gsymbol->name;
+}
diff --git a/gdb/objc-lang.h b/gdb/objc-lang.h
index 0d23467..e5ae036 100644
--- a/gdb/objc-lang.h
+++ b/gdb/objc-lang.h
@@ -58,5 +58,7 @@ extern int end_msglist (void);
 
 struct symbol *lookup_struct_typedef (char *name, struct block *block,
 				      int noerr);
+char *
+objc_decode_symbol (const struct general_symbol_info *gsymbol);
 
 #endif
diff --git a/gdb/symtab.c b/gdb/symtab.c
index 8d9d72c..f893155 100644
--- a/gdb/symtab.c
+++ b/gdb/symtab.c
@@ -632,9 +632,14 @@ symbol_natural_name (const struct general_symbol_info *gsymbol)
     {
     case language_cplus:
     case language_java:
+      if (gsymbol->language_specific.cplus_specific.demangled_name != NULL)
+	return gsymbol->language_specific.cplus_specific.demangled_name;
+      break;
     case language_objc:
       if (gsymbol->language_specific.cplus_specific.demangled_name != NULL)
 	return gsymbol->language_specific.cplus_specific.demangled_name;
+      else
+	return objc_decode_symbol (gsymbol);
       break;
     case language_ada:
       if (gsymbol->language_specific.cplus_specific.demangled_name != NULL)
