diff --git a/res/drawable-hdpi/ic_action_reveal.png b/res/drawable-hdpi/ic_action_reveal.png
new file mode 100755
index 0000000..2fd88e0
--- /dev/null
+++ b/res/drawable-hdpi/ic_action_reveal.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_action_reveal.png b/res/drawable-mdpi/ic_action_reveal.png
new file mode 100755
index 0000000..6f4cc5b
--- /dev/null
+++ b/res/drawable-mdpi/ic_action_reveal.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_action_reveal.png b/res/drawable-xhdpi/ic_action_reveal.png
new file mode 100755
index 0000000..4e83be4
--- /dev/null
+++ b/res/drawable-xhdpi/ic_action_reveal.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_action_reveal.png b/res/drawable-xxhdpi/ic_action_reveal.png
new file mode 100755
index 0000000..02a3d6f
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_action_reveal.png
Binary files differ
diff --git a/res/layout/credentials_pref.xml b/res/layout/credentials_pref.xml
index 883399e..ff7c008 100644
--- a/res/layout/credentials_pref.xml
+++ b/res/layout/credentials_pref.xml
@@ -46,13 +46,11 @@
         <requestFocus />
     </EditText>
 
-    <EditText
+    <org.sflphone.views.PasswordEditText
         android:id="@+id/credentials_password"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:imeOptions="actionNext"
-        android:hint="Password..."
-        android:inputType="textVisiblePassword" />
+        android:imeOptions="actionNext" />
 
     <EditText
         android:id="@+id/credentials_realm"
diff --git a/res/layout/frag_account_creation.xml b/res/layout/frag_account_creation.xml
index 2315280..830dd63 100644
--- a/res/layout/frag_account_creation.xml
+++ b/res/layout/frag_account_creation.xml
@@ -37,7 +37,7 @@
             android:singleLine="true"
             android:typeface="monospace" />
 
-        <EditText
+        <org.sflphone.views.PasswordEditText
             android:id="@+id/password"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
diff --git a/res/layout/password_edittext.xml b/res/layout/password_edittext.xml
new file mode 100644
index 0000000..edd4f12
--- /dev/null
+++ b/res/layout/password_edittext.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content" >
+
+    <EditText
+            android:id="@+id/password_edittext"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:singleLine="true"
+            android:typeface="sans"
+            android:hint="@string/prompt_password" />
+
+    <Button
+            android:id="@+id/password_visibility"
+            android:layout_width="30dip"
+            android:layout_height="30dip"
+            android:layout_alignBaseline="@+id/password_edittext"
+            android:layout_alignParentRight="true"
+            android:layout_marginRight="5dip"
+            android:background="@drawable/ic_action_reveal" />
+
+</RelativeLayout>
\ No newline at end of file
diff --git a/src/org/sflphone/fragments/AccountCreationFragment.java b/src/org/sflphone/fragments/AccountCreationFragment.java
index 7aed9da..f96a82e 100644
--- a/src/org/sflphone/fragments/AccountCreationFragment.java
+++ b/src/org/sflphone/fragments/AccountCreationFragment.java
@@ -21,6 +21,7 @@
 import android.widget.TextView;
 import android.widget.TextView.OnEditorActionListener;
 import android.widget.Toast;
+import org.sflphone.views.PasswordEditText;
 
 public class AccountCreationFragment extends Fragment {
 
@@ -34,7 +35,7 @@
     private EditText mAliasView;
     private EditText mHostnameView;
     private EditText mUsernameView;
-    private EditText mPasswordView;
+    private PasswordEditText mPasswordView;
 
     private Callbacks mCallbacks = sDummyCallbacks;
     private static Callbacks sDummyCallbacks = new Callbacks() {
@@ -63,9 +64,9 @@
         mAliasView = (EditText) inflatedView.findViewById(R.id.alias);
         mHostnameView = (EditText) inflatedView.findViewById(R.id.hostname);
         mUsernameView = (EditText) inflatedView.findViewById(R.id.username);
-        mPasswordView = (EditText) inflatedView.findViewById(R.id.password);
+        mPasswordView = (PasswordEditText) inflatedView.findViewById(R.id.password);
 
-        mPasswordView.setOnEditorActionListener(new OnEditorActionListener() {
+        mPasswordView.getEdit_text().setOnEditorActionListener(new OnEditorActionListener() {
 
             @Override
             public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
diff --git a/src/org/sflphone/views/CredentialsPreference.java b/src/org/sflphone/views/CredentialsPreference.java
index 93d0df8..5b18f1d 100644
--- a/src/org/sflphone/views/CredentialsPreference.java
+++ b/src/org/sflphone/views/CredentialsPreference.java
@@ -56,7 +56,9 @@
 
 public class CredentialsPreference extends DialogPreference {
 
-    EditText mUsernameField, mPasswordField, mRealmField;
+    EditText mUsernameField;
+    PasswordEditText mPasswordField;
+    EditText mRealmField;
 
     public CredentialsPreference(Context context, AttributeSet attrs) {
         super(context, attrs);
@@ -70,13 +72,13 @@
         View view = inflater.inflate(R.layout.credentials_pref, null);
 
         mUsernameField = (EditText) view.findViewById(R.id.credentials_username);
-        mPasswordField = (EditText) view.findViewById(R.id.credentials_password);
+        mPasswordField = (PasswordEditText) view.findViewById(R.id.credentials_password);
         mRealmField = (EditText) view.findViewById(R.id.credentials_realm);
 
         if (getExtras().getSerializable(CredentialsManager.CURRENT_CRED) != null) {
             HashMap<String, String> details = (HashMap<String, String>) getExtras().getSerializable(CredentialsManager.CURRENT_CRED);
             mUsernameField.setText(details.get(AccountCredentials.CONFIG_ACCOUNT_USERNAME));
-            mPasswordField.setText(details.get(AccountCredentials.CONFIG_ACCOUNT_PASSWORD));
+            mPasswordField.getEdit_text().setText(details.get(AccountCredentials.CONFIG_ACCOUNT_PASSWORD));
             mRealmField.setText(details.get(AccountCredentials.CONFIG_ACCOUNT_REALM));
         }
 
diff --git a/src/org/sflphone/views/PasswordEditText.java b/src/org/sflphone/views/PasswordEditText.java
new file mode 100644
index 0000000..e15ce65
--- /dev/null
+++ b/src/org/sflphone/views/PasswordEditText.java
@@ -0,0 +1,115 @@
+package org.sflphone.views;
+
+import android.content.Context;
+import android.text.Editable;
+import android.text.TextWatcher;
+import android.text.method.HideReturnsTransformationMethod;
+import android.text.method.PasswordTransformationMethod;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.inputmethod.EditorInfo;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.RelativeLayout;
+import org.sflphone.R;
+
+/**
+ * Created by lisional on 06/04/14.
+ */
+public class PasswordEditText extends RelativeLayout {
+    LayoutInflater inflater = null;
+    EditText edit_text;
+    Button btn_clear;
+
+    public PasswordEditText(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+        initViews();
+    }
+
+    public PasswordEditText(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        initViews();
+    }
+
+    public PasswordEditText(Context context) {
+        super(context);
+        // TODO Auto-generated constructor stub
+        initViews();
+    }
+
+    void initViews() {
+        inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+        inflater.inflate(R.layout.password_edittext, this, true);
+        edit_text = (EditText) findViewById(R.id.password_edittext);
+        edit_text.setSingleLine();
+        edit_text.setImeOptions(EditorInfo.IME_ACTION_DONE);
+        btn_clear = (Button) findViewById(R.id.password_visibility);
+        btn_clear.setVisibility(RelativeLayout.INVISIBLE);
+        revealText();
+        edit_text.setTransformationMethod(PasswordTransformationMethod.getInstance());
+        showHideClearButton();
+    }
+
+    void revealText() {
+        btn_clear.setOnTouchListener(new View.OnTouchListener() {
+            @Override
+            public boolean onTouch(View v, MotionEvent event) {
+                switch(event.getAction()) {
+                    case MotionEvent.ACTION_DOWN:
+                        edit_text.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
+                        edit_text.setSelection(edit_text.getText().length());
+                        return true; // if you want to handle the touch event
+                    case MotionEvent.ACTION_UP:
+                        // RELEASED
+                        edit_text.setTransformationMethod(PasswordTransformationMethod.getInstance());
+                        edit_text.setSelection(edit_text.getText().length());
+                        return true; // if you want to handle the touch event
+                }
+                return false;
+            }
+        });
+    }
+
+    void showHideClearButton() {
+        edit_text.addTextChangedListener(new TextWatcher() {
+
+            @Override
+            public void onTextChanged(CharSequence s, int start, int before, int count) {
+                if (s.length() > 0)
+                    btn_clear.setVisibility(RelativeLayout.VISIBLE);
+                else
+                    btn_clear.setVisibility(RelativeLayout.INVISIBLE);
+            }
+
+            @Override
+            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+            }
+
+            @Override
+            public void afterTextChanged(Editable s) {
+            }
+        });
+    }
+
+    public Editable getText() {
+        Editable text = edit_text.getText();
+        return text;
+    }
+
+    public void setInputType(int typeClassNumber) {
+        edit_text.setFocusableInTouchMode(true);
+        edit_text.requestFocus();
+        edit_text.setInputType(typeClassNumber);
+    }
+
+    public EditText getEdit_text() {
+        return edit_text;
+    }
+
+    public void setError(String string) {
+        edit_text.setError(string);
+        edit_text.requestFocus();
+    }
+}
\ No newline at end of file
