Index: trunk/edje/src/lib/edje_data.c
===================================================================
--- trunk/edje/src/lib/edje_data.c	(revision 59667)
+++ trunk/edje/src/lib/edje_data.c	(working copy)
@@ -624,6 +624,7 @@ _edje_edd_init(void)
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description_textblock, Edje_Part_Description_Text, "text.style", text.style, EET_T_STRING);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description_textblock, Edje_Part_Description_Text, "text.font", text.font, EET_T_STRING);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description_textblock, Edje_Part_Description_Text, "text.repch", text.repch, EET_T_STRING);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description_textblock, Edje_Part_Description_Text, "text.last_show_timer", text.last_show_timer, EET_T_DOUBLE);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description_textblock, Edje_Part_Description_Text, "text.size", text.size, EET_T_INT);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description_textblock, Edje_Part_Description_Text, "text.size_range_min", text.size_range_min, EET_T_INT);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description_textblock, Edje_Part_Description_Text, "text.size_range_max", text.size_range_max, EET_T_INT);
Index: trunk/edje/src/lib/edje_private.h
===================================================================
--- trunk/edje/src/lib/edje_private.h	(revision 59667)
+++ trunk/edje/src/lib/edje_private.h	(working copy)
@@ -865,6 +865,7 @@ struct _Edje_Part_Description_Spec_Text
    Edje_Color     color3;
 
    double         elipsis; /* 0.0 - 1.0 defining where the elipsis align */
+   double         last_show_timer; /* 0.0 - 10.0 defining what is password last show timer value */
    int            size; /* 0 = use user set size */
    int            id_source; /* -1 if none */
    int            id_text_source; /* -1 if none */
Index: trunk/edje/src/lib/edje_entry.c
===================================================================
--- trunk/edje/src/lib/edje_entry.c	(revision 59667)
+++ trunk/edje/src/lib/edje_entry.c	(working copy)
@@ -20,6 +20,8 @@ struct _Entry
    Evas_Textblock_Cursor *sel_start, *sel_end;
    Evas_Textblock_Cursor *cursor_user, *cursor_user_extra;
    Evas_Textblock_Cursor *preedit_start, *preedit_end;
+   Ecore_Timer *pw_timer;
+   double pw_timer_val;
    Eina_List *sel;
    Eina_List *anchors;
    Eina_List *anchorlist;
@@ -1005,7 +1007,48 @@ _delete(Evas_Textblock_Cursor *c, Evas_Object *o _
    evas_textblock_cursor_char_delete(c);
 }
 
+static Eina_Bool
+_edje_entry_password_show_last_get()
+{
+   static Eina_Bool found = EINA_FALSE;
+   const char *env;
+   if (found == EINA_FALSE)
+     found = !!getenv("EDJE_ENTRY_PASSWORD_SHOW_LAST");
+   return found;
+}
+
 static void
+_edje_entry_hide_visible_password(Edje_Real_Part *rp)
+{
+   const Evas_Object_Textblock_Node_Format *node;
+   node = evas_textblock_node_format_first_get(rp->object);
+   for (; node ; node = evas_textblock_node_format_next_get(node))
+     {
+        const char *text = evas_textblock_node_format_text_get(node);
+        if (text)
+          {
+             if (!strcmp(text, "+ password=off"))
+               {
+                  evas_textblock_node_format_remove_pair(rp->object,
+                                      (Evas_Object_Textblock_Node_Format *)node);
+                  break;
+               }
+          }
+     }
+   _edje_entry_real_part_configure(rp);
+   _edje_emit(rp->edje, "entry,changed", rp->part->name);
+}
+
+static Eina_Bool
+_password_timer_cb(void *data)
+{
+   Entry *en = (Entry *)data;
+   _edje_entry_hide_visible_password(en->rp);
+   en->pw_timer = NULL;
+   return ECORE_CALLBACK_CANCEL;
+}
+
+static void
 _edje_key_down_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
 {
    Edje *ed = data;
@@ -1329,9 +1372,23 @@ _edje_key_down_cb(void *data, Evas *e __UNUSED__,
              if (en->have_selection)
                _range_del(en->cursor, rp->object, en);
              _sel_clear(en->cursor, rp->object, en);
-             //zz
-//             evas_textblock_cursor_text_prepend(en->cursor, ev->string);
-             _text_filter_text_prepend(en, en->cursor, ev->string);
+             // if PASSWORD_SHOW_LAST_CHARACTER mode, appending it with password tag
+             if ((rp->part->entry_mode == EDJE_ENTRY_EDIT_MODE_PASSWORD) &&
+                 _edje_entry_password_show_last_get())
+               {
+                  _edje_entry_hide_visible_password(en->rp);
+                  _text_filter_format_prepend(en, en->cursor, "+ password=off");
+                  _text_filter_markup_prepend(en, en->cursor, ev->string);
+                  _text_filter_format_prepend(en, en->cursor, "- password");
+                  if (en->pw_timer)
+                    {
+                       ecore_timer_del(en->pw_timer);
+                       en->pw_timer = NULL;
+                    }
+                  en->pw_timer = ecore_timer_add(en->pw_timer_val, _password_timer_cb, en);
+               }
+             else
+               _text_filter_text_prepend(en, en->cursor, ev->string);
              _anchors_get(en->cursor, rp->object, en);
              _edje_emit(ed, "entry,changed", rp->part->name);
              _edje_emit(ed, "cursor,changed", rp->part->name);
@@ -1847,6 +1904,10 @@ _edje_entry_real_part_init(Edje_Real_Part *rp)
           evas_object_textblock_replace_char_set(rp->object, edje_string_get(&txt->text.repch));
         else
           evas_object_textblock_replace_char_set(rp->object, "*");
+        if (txt && txt->text.last_show_timer)
+          en->pw_timer_val = txt->text.last_show_timer;
+        else
+          en->pw_timer_val = 2.0;
      }
 
    en->cursor_bg = edje_object_add(rp->edje->base.evas);
@@ -1931,6 +1992,12 @@ _edje_entry_real_part_shutdown(Edje_Real_Part *rp)
    evas_object_del(en->cursor_bg);
    evas_object_del(en->cursor_fg);
 
+   if (en->pw_timer)
+     {
+        ecore_timer_del(en->pw_timer);
+        en->pw_timer = NULL;
+     }
+
 #ifdef HAVE_ECORE_IMF
    if (rp->part->entry_mode >= EDJE_ENTRY_EDIT_MODE_EDITABLE)
      {
Index: trunk/edje/src/bin/edje_data_convert.c
===================================================================
--- trunk/edje/src/bin/edje_data_convert.c	(revision 59667)
+++ trunk/edje/src/bin/edje_data_convert.c	(working copy)
@@ -319,6 +319,7 @@ _edje_edd_old_init(void)
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_old_edje_part_description, Old_Edje_Part_Description, "text.style", text.style.str, EET_T_STRING);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_old_edje_part_description, Old_Edje_Part_Description, "text.font", text.font.str, EET_T_STRING);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_old_edje_part_description, Old_Edje_Part_Description, "text.repch", text.repch.str, EET_T_STRING);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_old_edje_part_description, Old_Edje_Part_Description, "text.last_show_timer", text.last_show_timer, EET_T_DOUBLE);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_old_edje_part_description, Old_Edje_Part_Description, "text.size", text.size, EET_T_INT);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_old_edje_part_description, Old_Edje_Part_Description, "text.fit_x", text.fit_x, EET_T_UCHAR);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_old_edje_part_description, Old_Edje_Part_Description, "text.fit_y", text.fit_y, EET_T_UCHAR);
Index: trunk/edje/src/bin/edje_cc_handlers.c
===================================================================
--- trunk/edje/src/bin/edje_cc_handlers.c	(revision 59667)
+++ trunk/edje/src/bin/edje_cc_handlers.c	(working copy)
@@ -198,6 +198,7 @@ static void st_collections_group_parts_part_descri
 static void st_collections_group_parts_part_description_text_font(void);
 static void st_collections_group_parts_part_description_text_style(void);
 static void st_collections_group_parts_part_description_text_repch(void);
+static void st_collections_group_parts_part_description_text_last_show_timer(void);
 static void st_collections_group_parts_part_description_text_size(void);
 static void st_collections_group_parts_part_description_text_size_range(void);
 static void st_collections_group_parts_part_description_text_fit(void);
@@ -451,6 +452,7 @@ New_Statement_Handler statement_handlers[] =
      {"collections.group.parts.part.description.text.font", st_collections_group_parts_part_description_text_font},
      {"collections.group.parts.part.description.text.style", st_collections_group_parts_part_description_text_style},
      {"collections.group.parts.part.description.text.repch", st_collections_group_parts_part_description_text_repch},
+     {"collections.group.parts.part.description.text.last_show_timer", st_collections_group_parts_part_description_text_last_show_timer},
      {"collections.group.parts.part.description.text.size", st_collections_group_parts_part_description_text_size},
      {"collections.group.parts.part.description.text.size_range", st_collections_group_parts_part_description_text_size_range},
      {"collections.group.parts.part.description.text.fit", st_collections_group_parts_part_description_text_fit},
@@ -5530,6 +5532,45 @@ st_collections_group_parts_part_description_text_r
     @page edcref
 
     @property
+        last_show_timer
+    @parameters
+        [password last input show timer value double]
+    @effect
+        In case of PASSWORD mode where last entered input is visible, then
+        the last input entered by user is shown based on this timer value.
+    @endproperty
+*/
+static void
+st_collections_group_parts_part_description_text_last_show_timer(void)
+{
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description_Text *ed;
+
+   check_arg_count(1);
+
+   pc = eina_list_data_get(eina_list_last(edje_collections));
+   ep = pc->parts[pc->parts_count - 1];
+
+   if ((ep->type != EDJE_PART_TYPE_TEXT) &&
+       (ep->type != EDJE_PART_TYPE_TEXTBLOCK))
+     {
+	ERR("%s: Error. parse error %s:%i. "
+	    "text attributes in non-TEXT part.",
+	    progname, file_in, line - 1);
+	exit(-1);
+     }
+
+   ed = (Edje_Part_Description_Text*) ep->default_desc;
+   if (ep->other.desc_count) ed = (Edje_Part_Description_Text*)  ep->other.desc[ep->other.desc_count - 1];
+
+   ed->text.last_show_timer = parse_float_range(0, 0.0, 10.0);
+}
+
+/**
+    @page edcref
+
+    @property
         size
     @parameters
         [font size in points (pt)]
