Index: AUTHORS
===================================================================
--- AUTHORS	(revision 58959)
+++ AUTHORS	(working copy)
@@ -14,3 +14,4 @@ Davide Andreoli <dave@gurumeditation.it>
 Sebastian Dransfeld <sd@tango.flipp.net>
 Tom Hacohen <tom@stosb.com>
 Aharon Hillel <a.hillel@partner.samsung.com>
+Shilpa Singh <shilpa.singh@samsung.com> <shilpasingh.o@gmail.com>
Index: src/lib/edje_program.c
===================================================================
--- src/lib/edje_program.c	(revision 58959)
+++ src/lib/edje_program.c	(working copy)
@@ -761,6 +761,13 @@ _edje_program_run(Edje *ed, Edje_Program *pr, Eina
              if (_edje_block_break(ed)) goto break_prog;
           }
         break;
+     case EDJE_ACTION_TYPE_HIDE_VISIBLE_PASSWORD:
+          {
+             Edje_Real_Part *part;
+             part = ed->table_parts[pr->param.dst % ed->table_parts_size];
+             _edje_entry_hide_visible_password(part);
+          }
+        break;
      default:
         // _edje_emit(ed, "program,start", pr->name);
         // _edje_emit(ed, "program,stop", pr->name);
Index: src/lib/edje_private.h
===================================================================
--- src/lib/edje_private.h	(revision 58959)
+++ src/lib/edje_private.h	(working copy)
@@ -384,7 +384,9 @@ typedef struct _Edje_Text_Insert_Filter_Callback E
 #define EDJE_ENTRY_EDIT_MODE_SELECTABLE 1
 #define EDJE_ENTRY_EDIT_MODE_EDITABLE 2
 #define EDJE_ENTRY_EDIT_MODE_PASSWORD 3
+#define EDJE_ENTRY_EDIT_MODE_PASSWORD_SHOW_LAST_INPUT 4
 
+
 #define EDJE_ENTRY_SELECTION_MODE_DEFAULT 0
 #define EDJE_ENTRY_SELECTION_MODE_EXPLICIT 1
 
@@ -1764,6 +1766,7 @@ void _edje_lua_script_only_message(Edje *ed, Edje_
 void _edje_entry_init(Edje *ed);
 void _edje_entry_shutdown(Edje *ed);
 void _edje_entry_real_part_init(Edje_Real_Part *rp);
+void _edje_entry_hide_visible_password(Edje_Real_Part *rp);
 void _edje_entry_real_part_shutdown(Edje_Real_Part *rp);
 void _edje_entry_real_part_configure(Edje_Real_Part *rp);
 const char *_edje_entry_selection_get(Edje_Real_Part *rp);
Index: src/lib/Edje.h
===================================================================
--- src/lib/Edje.h	(revision 58959)
+++ src/lib/Edje.h	(working copy)
@@ -678,7 +678,8 @@ typedef enum _Edje_Action_Type
    EDJE_ACTION_TYPE_FOCUS_OBJECT  = 10,
    EDJE_ACTION_TYPE_PARAM_COPY    = 11,
    EDJE_ACTION_TYPE_PARAM_SET     = 12,
-   EDJE_ACTION_TYPE_LAST          = 13
+   EDJE_ACTION_TYPE_HIDE_VISIBLE_PASSWORD = 13,
+   EDJE_ACTION_TYPE_LAST          = 14
 } Edje_Action_Type;
 
 typedef enum _Edje_Tween_Mode
Index: src/lib/edje_entry.c
===================================================================
--- src/lib/edje_entry.c	(revision 58959)
+++ src/lib/edje_entry.c	(working copy)
@@ -1011,6 +1011,28 @@ _delete(Evas_Textblock_Cursor *c, Evas_Object *o _
    evas_textblock_cursor_char_delete(c);
 }
 
+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 void
 _edje_key_down_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
 {
@@ -1340,9 +1362,16 @@ _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_INPUT mode, appending it with password tag
+             if (rp->part->entry_mode == EDJE_ENTRY_EDIT_MODE_PASSWORD_SHOW_LAST_INPUT)
+               {
+                  _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");
+               }
+             else
+               _text_filter_text_prepend(en, en->cursor, ev->string);
              _curs_update_from_curs(en->cursor, rp->object, en);
              _anchors_get(en->cursor, rp->object, en);
              _edje_emit(ed, "entry,changed", rp->part->name);
@@ -1845,7 +1874,8 @@ _edje_entry_real_part_init(Edje_Real_Part *rp)
    if (rp->part->select_mode == EDJE_ENTRY_SELECTION_MODE_DEFAULT)
      en->select_allow = EINA_TRUE;
 
-   if (rp->part->entry_mode == EDJE_ENTRY_EDIT_MODE_PASSWORD)
+   if ((rp->part->entry_mode == EDJE_ENTRY_EDIT_MODE_PASSWORD) ||
+       (rp->part->entry_mode == EDJE_ENTRY_EDIT_MODE_PASSWORD_SHOW_LAST_INPUT))
      {
         Edje_Part_Description_Text *txt;
 
@@ -1916,7 +1946,8 @@ _edje_entry_real_part_init(Edje_Real_Part *rp)
         en->imf_ee_handler_delete = ecore_event_handler_add(ECORE_IMF_EVENT_DELETE_SURROUNDING, _edje_entry_imf_event_delete_surrounding_cb, rp->edje);
         en->imf_ee_handler_changed = ecore_event_handler_add(ECORE_IMF_EVENT_PREEDIT_CHANGED, _edje_entry_imf_event_preedit_changed_cb, rp->edje);
         ecore_imf_context_input_mode_set(en->imf_context,
-                                         rp->part->entry_mode == EDJE_ENTRY_EDIT_MODE_PASSWORD ?
+                                         ((rp->part->entry_mode == EDJE_ENTRY_EDIT_MODE_PASSWORD) ||
+                                          (rp->part->entry_mode == EDJE_ENTRY_EDIT_MODE_PASSWORD_SHOW_LAST_INPUT)) ?
                                          ECORE_IMF_INPUT_MODE_INVISIBLE : ECORE_IMF_INPUT_MODE_FULL);
 #endif
      }
@@ -2746,35 +2777,41 @@ _edje_entry_imf_event_commit_cb(void *data, int ty
           }
      }
 
-   tc = evas_object_textblock_cursor_new(rp->object);
-
    /* calculate the cursor position to insert commit string */
    if (en->preedit_start)
-     evas_textblock_cursor_copy(en->preedit_start, tc);
+     tc = en->preedit_start;
    else
-     evas_textblock_cursor_copy(en->cursor, tc);
+     tc = en->cursor;
 
 #ifdef HAVE_ECORE_IMF
    /* delete preedit characters */
    _preedit_del(en);
-   _preedit_clear(en);
 #endif
 
    if (evas_textblock_cursor_compare(en->cursor, tc))
      cursor_move = EINA_TRUE;
-
-   //yy
-//   evas_textblock_cursor_text_prepend(en->cursor, ev->str);
-   _text_filter_text_prepend(en, tc, ev->str);
-
-   if (!cursor_move)
+   if (rp->part->entry_mode == EDJE_ENTRY_EDIT_MODE_PASSWORD_SHOW_LAST_INPUT)
+     _edje_entry_hide_visible_password(en->rp);
+   if ((rp->part->entry_mode == EDJE_ENTRY_EDIT_MODE_PASSWORD_SHOW_LAST_INPUT) &&
+       (!en->preedit_start))
      {
-        /* move cursor to the end of commit string */
-        evas_textblock_cursor_copy(tc, en->cursor);
+        _text_filter_format_prepend(en, tc, "+ password=off");
+        _text_filter_markup_prepend(en, tc, ev->str);
+        _text_filter_format_prepend(en, tc, "- password");
      }
+   else
+     {
+        _text_filter_text_prepend(en, tc, ev->str);
+        if (!cursor_move)
+          {
+             /* move cursor to the end of commit string */
+             evas_textblock_cursor_copy(tc, en->cursor);
+          }
+     }
+#ifdef HAVE_ECORE_IMF
+   _preedit_clear(en);
+#endif
 
-   evas_textblock_cursor_free(tc);
-
    _curs_update_from_curs(en->cursor, rp->object, en);
    _anchors_get(en->cursor, rp->object, en);
    _edje_emit(rp->edje, "entry,changed", rp->part->name);
@@ -2825,9 +2862,14 @@ _edje_entry_imf_event_preedit_changed_cb(void *dat
    preedit_start_pos = evas_textblock_cursor_pos_get(en->cursor);
 
    /* insert preedit character(s) */
-   //xx
-//   evas_object_textblock_text_markup_prepend(en->cursor, preedit_string);
-   _text_filter_markup_prepend(en, en->cursor, preedit_string);
+   if (rp->part->entry_mode == EDJE_ENTRY_EDIT_MODE_PASSWORD_SHOW_LAST_INPUT)
+     {
+        _text_filter_format_prepend(en, en->cursor, "+ password=off");
+        _text_filter_markup_prepend(en, en->cursor, preedit_string);
+        _text_filter_format_prepend(en, en->cursor, "- password");
+     }
+   else
+     _text_filter_markup_prepend(en, en->cursor, preedit_string);
 
    if (!preedit_end_state)
      {
Index: src/bin/edje_cc_handlers.c
===================================================================
--- src/bin/edje_cc_handlers.c	(revision 58959)
+++ src/bin/edje_cc_handlers.c	(working copy)
@@ -2717,6 +2717,7 @@ st_collections_group_parts_part_effect(void)
         @li PLAIN
         @li EDITABLE
         @li PASSWORD
+        @li PASSWORD_SHOW_LAST_INPUT
         It causes the part be editable if the edje object has the keyboard
         focus AND the part has the edje focus (or selectable always
         regardless of focus) and in the event of password mode, not
@@ -2739,6 +2740,7 @@ st_collections_group_parts_part_entry_mode(void)
 			       "PLAIN", EDJE_ENTRY_EDIT_MODE_SELECTABLE,
 			       "EDITABLE", EDJE_ENTRY_EDIT_MODE_EDITABLE,
 			       "PASSWORD", EDJE_ENTRY_EDIT_MODE_PASSWORD,
+			       "PASSWORD_SHOW_LAST_INPUT", EDJE_ENTRY_EDIT_MODE_PASSWORD_SHOW_LAST_INPUT,
 			       NULL);
 }
 
@@ -7105,6 +7107,7 @@ st_collections_group_programs_program_action(void)
 			   "FOCUS_OBJECT", EDJE_ACTION_TYPE_FOCUS_OBJECT,
 			   "PARAM_COPY", EDJE_ACTION_TYPE_PARAM_COPY,
 			   "PARAM_SET", EDJE_ACTION_TYPE_PARAM_SET,
+			   "HIDE_VISIBLE_PASSWORD", EDJE_ACTION_TYPE_HIDE_VISIBLE_PASSWORD,
 			   NULL);
    if (ep->action == EDJE_ACTION_TYPE_STATE_SET)
      {
@@ -7167,6 +7170,7 @@ st_collections_group_programs_program_action(void)
 	/* this is implicitly set by script {} so this is here just for
 	 * completeness */
 	break;
+      case EDJE_ACTION_TYPE_HIDE_VISIBLE_PASSWORD:
       case EDJE_ACTION_TYPE_FOCUS_OBJECT:
       case EDJE_ACTION_TYPE_FOCUS_SET:
 	check_arg_count(1);
@@ -7253,6 +7257,8 @@ st_collections_group_programs_program_target(void)
 	  data_queue_part_lookup(pc, name, &(et->id));
 	else if (ep->action == EDJE_ACTION_TYPE_FOCUS_OBJECT)
 	  data_queue_part_lookup(pc, name, &(et->id));
+	else if (ep->action == EDJE_ACTION_TYPE_HIDE_VISIBLE_PASSWORD)
+	  data_queue_part_lookup(pc, name, &(et->id));
 	else
 	  {
 	     ERR("%s: Error. parse error %s:%i. "
