--- gnome-system-monitor-2.28.0.orig/src/sysinfo.cpp
+++ gnome-system-monitor-2.28.0/src/sysinfo.cpp
@@ -64,8 +64,7 @@ namespace {
     guint64 memory_bytes;
     guint64 free_space_bytes;
 
-    guint n_processors;
-    vector<string> processors;
+    string processors;
 
     /* system info */
     string bios_version;
@@ -120,27 +119,132 @@ namespace {
       this->memory_bytes = mem.total;
     }
 
+    typedef struct
+    {
+      const char* regex;
+      const char* replacement;
+    } ReplaceStrings;
 
-    void load_processors_info()
+    static char* remove_duplicate_whitespace (const char* old)
     {
-      const glibtop_sysinfo *info = glibtop_get_sysinfo();
+      char* result;
+      GRegex* re;
+      GError* error = NULL;
+      const GRegexMatchFlags flags = static_cast<GRegexMatchFlags>(0);
+
+      re = g_regex_new ("[ \t\n\r]+", G_REGEX_MULTILINE, flags, &error);
+      if (re == NULL) {
+        g_warning ("Error building regex: %s", error->message);
+        g_error_free (error);
+        return g_strdup (old);
+      }
+      result = g_regex_replace (re, old, -1, 0, " ", flags, &error);
+      g_regex_unref (re);
+      if (result == NULL) {
+        g_warning ("Error replacing string: %s", error->message);
+        g_error_free (error);
+        return g_strdup (old);
+      }
 
-      for (guint i = 0; i != info->ncpu; ++i) {
-	const char * const keys[] = { "model name", "cpu" };
-	gchar *model = 0;
-
-	for (guint j = 0; !model && j != G_N_ELEMENTS(keys); ++j)
-	  model = static_cast<char*>(g_hash_table_lookup(info->cpuinfo[i].values,
-							 keys[j]));
+      return result;
+    }
+
+    static char* prettify_info (const char *info)
+    {
+      char* pretty;
+      const GRegexCompileFlags cflags = static_cast<GRegexCompileFlags>(0);
+      const GRegexMatchFlags mflags = static_cast<GRegexMatchFlags>(0);
 
-	if (!model)
+      static const ReplaceStrings rs[] = {
+        { "Intel[(]R[)]", "Intel\302\256"},
+        { "Core[(]TM[)]", "Core\342\204\242"},
+        { "Atom[(]TM[)]", "Atom\342\204\242"},
+      };
+
+      pretty = g_markup_escape_text (info, -1);
+
+      for (uint i = 0; i < G_N_ELEMENTS (rs); i++) {
+        GError* error;
+        GRegex* re;
+        char* result;
+
+        error = NULL;
+
+        re = g_regex_new (rs[i].regex, cflags, mflags, &error);
+        if (re == NULL) {
+          g_warning ("Error building regex: %s", error->message);
+          g_error_free (error);
           continue;
+        }
 
-	this->processors.push_back(model);
+        result = g_regex_replace_literal (re, pretty, -1, 0,
+                                          rs[i].replacement, mflags, &error);
+
+        g_regex_unref (re);
+
+        if (error != NULL) {
+          g_warning ("Error replacing %s: %s", rs[i].regex, error->message);
+          g_error_free (error);
+          continue;
+        }
+
+        g_free (pretty);
+        pretty = result;
       }
+
+      return pretty;
     }
 
+    void load_processors_info()
+    {
+      const glibtop_sysinfo *info = glibtop_get_sysinfo();
+
+      GHashTable* counts;
+      GString* cpu;
+      GHashTableIter iter;
+      gpointer key, value;
+
+      counts = g_hash_table_new (g_str_hash, g_str_equal);
+
+      /* count duplicates */
+      for (uint i = 0; i != info->ncpu; ++i) {
+        const char* const keys[] = { "model name", "cpu" };
+        char* model;
+        int* count;
+        model = NULL;
+
+        for (int j = 0; model == NULL && j != G_N_ELEMENTS (keys); ++j) {
+          model = static_cast<char*>(g_hash_table_lookup (info->cpuinfo[i].values,
+                                                          keys[j]));
+        }
+        if (model == NULL)
+          continue;
+        count = static_cast<int*>(g_hash_table_lookup (counts, model));
+        if (count == NULL)
+          g_hash_table_insert (counts, model, GINT_TO_POINTER (1));
+        else
+          g_hash_table_replace (counts, model, GINT_TO_POINTER (GPOINTER_TO_INT (count) + 1));
+      }
+
+      cpu = g_string_new (NULL);
+      g_hash_table_iter_init (&iter, counts);
+      while (g_hash_table_iter_next (&iter, &key, &value)) {
+        char* stripped;
+        int   count;
+
+        count = GPOINTER_TO_INT (value);
+        stripped = remove_duplicate_whitespace ((const char *)key);
+        if (count > 1)
+          g_string_append_printf (cpu, "%s \303\227 %d ", stripped, count);
+        else
+          g_string_append_printf (cpu, "%s ", stripped);
+        g_free (stripped);
+      }
 
+      g_hash_table_destroy (counts);
+      this->processors = string(prettify_info (cpu->str));
+      g_string_free (cpu, TRUE);
+    }
 
     void load_disk_info()
     {
@@ -560,7 +664,8 @@ add_section(GtkBox *vbox , const char *
 static GtkWidget* 
 add_row(GtkTable * table, const char * label, const char * value, int row)
 {
-  GtkWidget *header = gtk_label_new(label);
+  GtkWidget *header = gtk_label_new(NULL);
+  gtk_label_set_markup(GTK_LABEL(header), label);
   gtk_misc_set_alignment(GTK_MISC(header), 0.0, 0.5);
   gtk_table_attach(
 		   table, header,
@@ -598,7 +703,6 @@ procman_create_sysinfo_view(void)
 
   GtkWidget *hardware_table;
   GtkWidget *memory_label;
-  GtkWidget *processor_label;
 
   GtkWidget *bios_table;
   GtkWidget *bios_version_label;
@@ -693,7 +797,7 @@ procman_create_sysinfo_view(void)
   /* hardware section */
 
   markup = g_strdup_printf(_("<b>Hardware</b>"));
-  hardware_table = add_section(GTK_BOX(vbox), markup, data->processors.size() + 4, 2, NULL);
+  hardware_table = add_section(GTK_BOX(vbox), markup, 5, 2, NULL);
   g_free(markup);
 
   add_row(GTK_TABLE(hardware_table), _("Machine model:"),
@@ -704,30 +808,13 @@ procman_create_sysinfo_view(void)
                          markup, 1);
   g_free(markup);
 
-  guint i;
-  for (i = 0; i < data->processors.size(); ++i) {
-    const gchar * t;
-    if (data->processors.size() > 1) {
-      markup = g_strdup_printf(_("Processor %d:"), i);
-      t = markup;
-    }
-    else {
-      markup = NULL;
-      t = _("Processor:");
-    }
-
-    processor_label = add_row(GTK_TABLE(hardware_table), t,
-                              data->processors[i].c_str(), 2 + i);
-
-    if(markup)
-      g_free(markup);
-  }
-
+  add_row(GTK_TABLE(hardware_table), _("Processor:"),
+          data->processors.c_str(), 2);
 
   add_row(GTK_TABLE(hardware_table), _("Serial number:"),
-		  data->system_serial.c_str(), 2 + i);
+		  data->system_serial.c_str(), 3);
   add_row(GTK_TABLE(hardware_table), _("System UUID:"),
-          data->system_board_serial.c_str(), 3 + i);
+          data->system_board_serial.c_str(), 4);
 
   /* bios section */
 
