diff --git a/gtk/gtkentry.c b/gtk/gtkentry.c
index a737b56..99798b2 100644
--- a/gtk/gtkentry.c
+++ b/gtk/gtkentry.c
@@ -86,6 +86,7 @@ struct _GtkEntryPrivate
   guint blink_time;  /* time in msec the cursor has blinked since last user event */
   guint interior_focus : 1;
   guint real_changed   : 1;
+  guint invisible_char_set : 1;
   guint change_count   : 8;
 
   gint focus_width;
@@ -1090,6 +1091,37 @@ gtk_entry_get_property (GObject         *object,
     }
 }
 
+static gunichar
+find_invisible_char (GtkWidget *widget)
+{
+  gint i;
+  gunichar invisible_chars [] = {
+    0x25cf, /* BLACK CIRCLE */
+    0x2022, /* BULLET */
+    0x2731, /* HEAVY ASTERISK */
+    0x273a, /* SIXTEEN POINTED ASTERISK */
+    0x002a, /* ASTERISK */
+  };
+
+  for (i = 0; i < G_N_ELEMENTS (invisible_chars); i++)
+    {
+      PangoLayout *layout;
+      gchar text[7] = { 0, };
+      gint count;
+
+      g_unichar_to_utf8 (invisible_chars[i], text);
+      layout = gtk_widget_create_pango_layout (widget, text);
+
+      count = pango_layout_get_unknown_glyphs_count (layout);
+      g_object_unref (layout);
+
+      if (count == 0)
+        return invisible_chars[i];
+    }
+
+  return '*';
+}
+
 static void
 gtk_entry_init (GtkEntry *entry)
 {
@@ -1103,7 +1135,7 @@ gtk_entry_init (GtkEntry *entry)
 
   entry->editable = TRUE;
   entry->visible = TRUE;
-  entry->invisible_char = '*';
+  entry->invisible_char = find_invisible_char (GTK_WIDGET (entry));
   entry->dnd_position = -1;
   entry->width_chars = -1;
   entry->is_cell_renderer = FALSE;
@@ -2366,7 +2398,10 @@ gtk_entry_style_set	(GtkWidget      *widget,
 
   priv->focus_width = focus_width;
   priv->interior_focus = interior_focus;
-  
+
+  if (!priv->invisible_char_set)
+    entry->invisible_char = find_invisible_char (GTK_WIDGET (entry));
+
   gtk_entry_recompute (entry);
 
   if (previous_style && GTK_WIDGET_REALIZED (widget))
@@ -4553,8 +4588,13 @@ void
 gtk_entry_set_invisible_char (GtkEntry *entry,
                               gunichar  ch)
 {
+  GtkEntryPrivate *priv;
+
   g_return_if_fail (GTK_IS_ENTRY (entry));
 
+  priv = GTK_ENTRY_GET_PRIVATE (entry);
+  priv->invisible_char_set = TRUE;
+
   if (ch == entry->invisible_char)
     return;
 
