diff --git a/Mac/Lib/EasyDialogs.py b/Mac/Lib/EasyDialogs.py
index 1ac39b3..6574336 100644
--- a/Mac/Lib/EasyDialogs.py
+++ b/Mac/Lib/EasyDialogs.py
@@ -20,8 +20,10 @@
 import Dialogs
 import Windows
 import Dlg,Win,Evt,Events # sdm7g
+import Ctl
 import MacOS
 import string
+from ControlAccessor import *	# Also import Controls constants
 
 def cr2lf(text):
 	if '\r' in text:
@@ -97,7 +99,7 @@
 			return cr2lf(GetDialogItemText(h))
 		if n == 2: return None
 
-def AskPassword(prompt,	 default='', id=264):	
+def AskPassword(prompt,	 default='', id=264, ok=None, cancel=None):	
 	"""Display a PROMPT string and a text entry field with a DEFAULT string.
 	The string is displayed as bullets only.
 	
@@ -114,58 +116,28 @@
 	if not d:
 		print "Can't get DLOG resource with id =", id
 		return
-	h = d.GetDialogItemAsControl(3)	# STATIC TEXT ITEM <= prompt 
+	h = d.GetDialogItemAsControl(3)
 	SetDialogItemText(h, lf2cr(prompt))	
-	h = d.GetDialogItemAsControl(4)	# EDIT TEXT ITEM 
+	pwd = d.GetDialogItemAsControl(4)
 	bullets = '\245'*len(default)
-	SetDialogItemText(h, bullets )
-	d.SelectDialogItemText(4, 999, 999)
+##	SetControlData(pwd, kControlEditTextPart, kControlEditTextTextTag, bullets)
+	SetControlData(pwd, kControlEditTextPart, kControlEditTextPasswordTag, default)
+	d.SelectDialogItemText(4, 0, 999)
+	Ctl.SetKeyboardFocus(d, pwd, kControlEditTextPart)
+	if ok != None:
+		h = d.GetDialogItemAsControl(1)
+		h.SetControlTitle(ok)
+	if cancel != None:
+		h = d.GetDialogItemAsControl(2)
+		h.SetControlTitle(cancel)
 	d.SetDialogDefaultItem(Dialogs.ok)
 	d.SetDialogCancelItem(Dialogs.cancel)
-	string = default
-	oldschedparams = MacOS.SchedParams(0,0)
 	while 1:
-		ready,ev = Evt.WaitNextEvent(Events.everyEvent, 6)
-		if not ready: continue
-		what,msg,when,where,mod = ev
-		if what == 0 : Dlg.DialogSelect(ev)	# for blinking caret
-		elif Dlg.IsDialogEvent(ev):
-			if what in (Events.keyDown, Events.autoKey):
-				charcode = msg & Events.charCodeMask
-				if ( mod & Events.cmdKey ):
-					MacOS.SysBeep()
-					continue	# don't do cut & paste commands
-				else:	
-					if charcode == Events.kReturnCharCode:
-						break
-					elif charcode == Events.kEscapeCharCode:
-						string = None
-						break
-					elif charcode in (Events.kLeftArrowCharCode,
-								Events.kBackspaceCharCode):
-						string = string[:-1]
-					else:
-						string = string + chr(charcode)
-						msg =  0245   # Octal code for bullet
-						ev = (what,msg,when,where,mod)
-			rs, win, item = Dlg.DialogSelect(ev)
-			if item == Dialogs.ok :
-				break	
-			elif item == Dialogs.cancel :
-				string = None
-				break
-		elif what == Events.mouseDown:
-			part, win = Win.FindWindow(where)
-			if part == Windows.inDrag and win:
-				win.DragWindow(where, screenbounds)
-			elif part == Windows.inMenuBar:
-				MacOS.HandleEvent(ev)
-			else:
-				MacOS.SysBeep()		# Cannot handle selections, unfortunately
-			
-		elif what == Events.updateEvt: MacOS.HandleEvent(ev)
-	apply(MacOS.SchedParams, oldschedparams)
-	return string
+		n = ModalDialog(None)
+		if n == 1:
+			h = d.GetDialogItemAsControl(4)
+			return cr2lf(GetControlData(pwd, kControlEditTextPart, kControlEditTextPasswordTag))
+		if n == 2: return None
 
 def AskYesNoCancel(question, default = 0, yes=None, no=None, cancel=None, id=262):
 	"""Display a QUESTION string which can be answered with Yes or No.
@@ -302,10 +274,14 @@
 
 	Message("Testing EasyDialogs.")
 	ok = AskYesNoCancel("Do you want to proceed?")
-	ok = AskYesNoCancel("Do you want to identify?", yes="Indentify", no="Don't identify")
+	ok = AskYesNoCancel("Do you want to identify?", yes="Identify", no="No")
 	if ok > 0:
 		s = AskString("Enter your first name", "Joe")
-		Message("Thank you,\n%s" % `s`)
+		s2 = AskPassword("Okay %s, tell us your nickname"%s, s, cancel="None")
+		if not s2:
+			Message("%s has no secret nickname"%s)
+		else:
+			Message("Hello everybody!!\nThe secret nickname of %s is %s!!!"%(s, s2))
 	text = ( "Working Hard...", "Hardly Working..." , 
 			"So far, so good!", "Keep on truckin'" )
 	bar = ProgressBar("Progress, progress...", 100)
