diff --git a/Mac/scripts/MkDistr.py b/Mac/scripts/MkDistr.py
index deda71b..f2a1c00 100644
--- a/Mac/scripts/MkDistr.py
+++ b/Mac/scripts/MkDistr.py
@@ -1,24 +1,18 @@
 #
 # Interactively decide what to distribute
 #
-# The distribution type is signalled by a letter. The currently
-# defined letters are:
-# p		PPC normal distribution
-# P		PPC development distribution
-# m		68K normal distribution
-# M		68K development distribution
 #
 # The exclude file signals files to always exclude,
-# The pattern file records are of the form
-# ('pm', '*.c')
-# This excludes all files ending in .c for normal distributions.
+# The pattern file lines are of the form
+# *.c
+# This excludes all files ending in .c.
 #
 # The include file signals files and directories to include.
 # Records are of the form
-# ('pPmM', 'Lib')
-# This includes the Lib dir in all distributions
-# ('pPmM', 'Tools:bgen:AE:AppleEvents.py', 'Lib:MacToolbox:AppleEvents.py')
-# This includes the specified file, putting it in the given place.
+# ('Tools:bgen:AE:AppleEvents.py', 'Lib:MacToolbox:AppleEvents.py')
+# This includes the specified file, putting it in the given place, or
+# ('Tools:bgen:AE:AppleEvents.py', None)
+# This excludes the specified file.
 #
 from MkDistr_ui import *
 import fnmatch
@@ -33,8 +27,7 @@
 class Matcher:
 	"""Include/exclude database, common code"""
 	
-	def __init__(self, type, filename):
-		self.type = type
+	def __init__(self, filename):
 		self.filename = filename
 		self.rawdata = []
 		self.parse(filename)
@@ -55,25 +48,13 @@
 			pat = self.parseline(d)
 			self.rawdata.append(pat)
 				
-	def parseline(self, line):
-		try:
-			data = eval(line)
-		except:
-			raise SyntaxError, line
-		if type(data) <> type(()) or len(data) not in (2,3):
-			raise SyntaxError, line
-		if len(data) == 2:
-			data = data + ('',)
-		return data
-		
 	def save(self):
 		fp = open(self.filename, 'w')
-		for d in self.rawdata:
-			fp.write(`d`+'\n')
+		self.savedata(fp, self.rawdata)
 		self.modified = 0
 			
 	def add(self, value):
-		if len(value) == 2:
+		if len(value) == 1:
 			value = value + ('',)
 		self.rawdata.append(value)
 		self.rebuild1(value)
@@ -82,7 +63,7 @@
 	def delete(self, value):
 		key = value
 		for i in range(len(self.rawdata)):
-			if self.rawdata[i][1] == key:
+			if self.rawdata[i][0] == key:
 				del self.rawdata[i]
 				self.unrebuild1(i, key)
 				self.modified = 1
@@ -90,12 +71,12 @@
 		print 'Not found!', key
 				
 	def getall(self):
-		return map(lambda x: x[1], self.rawdata)
+		return map(lambda x: x[0], self.rawdata)
 	
 	def get(self, value):
-		for t, src, dst in self.rawdata:
+		for src, dst in self.rawdata:
 			if src == value:
-				return t, src, dst
+				return src, dst
 		print 'Not found!', value
 				
 	def is_modified(self):
@@ -110,13 +91,28 @@
 		for v in self.rawdata:
 			self.rebuild1(v)
 			
-	def rebuild1(self, (tp, src, dst)):
-		if self.type in tp:
-			if dst == '':
-				dst = src
-			self.idict[src] = dst
+	def parseline(self, line):
+		try:
+			data = eval(line)
+		except:
+			raise SyntaxError, line
+		if type(data) <> type(()) or len(data) not in (1,2):
+			raise SyntaxError, line
+		if len(data) == 1:
+			data = data + ('',)
+		return data
+		
+	def savedata(self, fp, data):
+		for d in self.rawdata:
+			fp.write(`d`+'\n')
+		
+	def rebuild1(self, (src, dst)):
+		if dst == '':
+			dst = src
+		if dst == None:
+			self.edict[src] = None
 		else:
-			self.edict[src] = ''
+			self.idict[src] = dst
 			
 	def unrebuild1(self, num, src):
 		if self.idict.has_key(src):
@@ -140,7 +136,7 @@
 				# tack on our input filename
 				if dstpath[-1] == os.sep:
 					dir, file = os.path.split(path)
-					dstpath = os.path.join(dstpath, path)
+					dstpath = os.path.join(dstpath, file)
 				return dstpath
 			path, lastcomp = os.path.split(path)
 			if not path:
@@ -172,13 +168,17 @@
 		for v in self.rawdata:
 			self.rebuild1(v)
 		
-	def rebuild1(self, (tp, src, dst)):
-		if self.type in tp:
-			pat = fnmatch.translate(src)
-			self.relist.append(regex.compile(pat))
-		else:
-			self.relist.append(None)
-			
+	def parseline(self, data):
+		return (data, None)
+
+	def savedata(self, fp, data):
+		for d in self.rawdata:
+			fp.write(d[0]+'\n')		
+		
+	def rebuild1(self, (src, dst)):
+		pat = fnmatch.translate(src)
+		self.relist.append(regex.compile(pat))
+		
 	def unrebuild1(self, num, src):
 		del self.relist[num]
 	
@@ -200,10 +200,11 @@
 		if not ok:
 			sys.exit(0)
 		os.chdir(fss.as_pathname())
-		self.typedist = GetType()
-		print 'TYPE', self.typedist
-		self.inc = IncMatcher(self.typedist, '(MkDistr.include)')
-		self.exc = ExcMatcher(self.typedist, '(MkDistr.exclude)')
+		if not os.path.isdir(':(MkDistr)'):
+			os.mkdir(':(MkDistr)')
+		typedist = GetType()
+		self.inc = IncMatcher(':(MkDistr):%s.include'%typedist)
+		self.exc = ExcMatcher(':(MkDistr):%s.exclude'%typedist)
 		self.ui = MkDistrUI(self)
 		self.ui.mainloop()
 		
diff --git a/Mac/scripts/MkDistr.rsrc.hqx b/Mac/scripts/MkDistr.rsrc.hqx
index f417d73..a8f557f 100644
--- a/Mac/scripts/MkDistr.rsrc.hqx
+++ b/Mac/scripts/MkDistr.rsrc.hqx
@@ -1,31 +1,31 @@
 (This file must be converted with BinHex 4.0)
 
-:$%eV4'PcG()ZFR0bB`"bFh*M8P0&4!%!N!F&SINN!*!%!3!!!!5[!!!$V`!!!2)
+:$%eV4'PcG()ZFR0bB`"bFh*M8P0&4!%!N!F&Lh`-!*!%!3!!!!3X!!!$,!!!!9m
 8T8SJ&+9+%"5P5rJ6'6!)%!!!#"!!!!J3!!!)%!!!#!a0Dd4TFh4b,R*cFQ0b!J!
-!!(*cFQ058d9%!3!""!#3"(*cFQ058d9%!3!""!#3&+fG)[m!N!B&SIri(rrq!"r
+!!(*cFQ058d9%!3!""!#3"(*cFQ058d9%!3!""!#3&+fG)[m!N!B&Lrri(rrq!"r
 rr`!Irrq!(rrr`"rrrq!Irrr`(rrrq"rrrrJIrrri(rrrq"rrrrJIrrri(rrrq"r
 rrrJIrrri(rrrq"rrrrJIrrri(rrrq"rrrrJIrrri(rrrq"rrrrJIrrri(rrrq"r
-rrrJIrrri(rrrq"rrrrJIrrri(rrrq"rrrrJ!!!!9!&`!2J$q!D%!"3%!!3#3"3)
-!N!89!&`!2J$q!D%!"3%!!3#3"3)"!*!%c!!)!*!&JJ%L!*B"A!3#6dX!N!@#!!S
-!PJ"%"!C$B@jMC@`!N!9N!0`!GJ&E"3C6Eh9bBf8!N!93!0`!BJ&E"3Y38%-JC'9
-fC@a[F!#3"P!!EJ"L!0J&#MBi5b"#D@jKFRN!N!9N!'i!GJ$B"3T38%-JBQPZBA*
-j!*!&&!"Z!#-"9K!*4@4TG#"8CAKd@`#3"43!#J!N!'')#&"KG(4PFQik!*!&8!!
-+!'!!BSJ,4AKME(9NC5"TEMS!N!6d!!S!N!@#!5)!PJ&F"!*25`#3"B)!#J#@!%3
-%"N0KEQ0PE!#3"@3!h!"f!9X&"P0[GA*MC3#3"9!!h!"L!9X&#e"33b"NCACPE'p
-`!*!'8!"Z!')!f!8+0MK,)%*TEQ&bH3#3"@3!EJ"f!0J&#P"33b"LD@jKFRN!N!8
-8!'i!)`&@%!P&C'Pd)&4PH(4E!*!&-J"Z!%%"9a!!N!B8!!S!*!"KL!G6Eh9bBf8
-k$`#3"6)!#J"#!'')$%4PFh4TEQ&dD@pZ1J#3"9!!#J"J!'+)#dPZBfaeC'8JD@i
-kE!!!!"8!+!!S!6S"a!!!!3!"!*!&!J)!N!39!#J!+!%k!F3!!!%!!3#3"3)$!*!
-%6J!$!*!&#J!+!0d"MJ#3"r!""!%%!Bm%"N4PE'9dC3#3"I!!EJ%%!2N%"d9NDA3
-Z,Li!N!E`!!S""!"L"!C"C'3Z,Li!!!!9!(!!EJ$V!9X!!!%!!3#3"3)%!*!%SJ!
-%!*!&(J!8!$!!j!B,4R9XE#"cEh9bBf9d!*!&-J!8!%3!j!B28&"$)'4PGQ9XEh"
-YC@jdj`#3"8B!&!"B!13'$cBi5b"LD@jKFRNYEfjXHHF!N!9D!"3!E!$N"Jp38%-
-JBQPZBA*j,@pZE(RR!*!&#J!+!"S!jSJH9(P`C5"[CL"NDA0dFQPLGA4TEfiJG'm
-JBR9TE'3k!!!!EJ!%!*!&#J!+!0d"MJ#3"r!"0J%&!B`%#N4TFh4bD@*eG'8!N!A
-`!0)""!%Z"!T$D'9MDb"dFQ9P!*!&m!!+!33!BJ3+5@jME(9NC5iZ,J#3"I!!EJ%
-%!-B%"d9iBfaeC'8!!!!"!!!!"+m!!!1[!!!!mJ$0P*344!!!!"`!TJ!"4%a24`!
-%!"*%594-!!3!6J)!N!M0Nh!#!3!2!!!!'3$0NhJ#!J!H!!!"qJ$0Nf`#!`!M!!!
-#%`$0NfJ#"!!k!!!#IJ$0Nf3#!2rr!!!"!J#3"!)"rrm!!!!b!*!%!J,rr`!!!cd
-!cC)m!J2rr`!!!L`!N!3#"2rr!!!#P`#3"!j*EQ0XG@4P)'4TB@a[C`j&H'0XG@4
-P)'4TB@a[C`40B@PZ&NPZBfaeC'8[CAKME(9NC5"hD@jNEhF44'PcG(*TBR9dD@p
-Z)(4jF'ALr`:
+rrrJIrrri(rrrq"rrrrJIrrri(rrrq"rrrrJ!!!"D!!-!N!8i!4m!6!&C"!G&H'0
+XG@4P!*!'1!!(!%`!333'3f&ZBf9X!*!&&!"a!#-"@4!*4@4TG#"8CAKd@`#3"43
+!"`!N!&k)#&"KG(4PFQik!!!!Q!!'!*!&93%I!'N"@33(5@jME(9NC3#3"P8!#J"
+T!%3%"N0KEQ0PE!#3"43!F3!M!9N3#89NDA3J9'9iG,i!N!8b!(!!33&C%!#3"P8
+!e3"T!3m%"d9iBfaeC'8!N!B8!!S!*!"KL!G6Eh9bBf8kG!#3"6)!#J"#!'')$%4
+PFh4TEQ&dD@pZ1J!!!%i!!`#3"3S!#J$G!Bi!N!I`!4N""3'0"!C%C@aPG'8!N!A
+`!)N""!%""!G&C'Pd,LiZ!*!'m!!+!3-!F`3'3@4N,LiZ!!!!&3"`!'i!d`&G!!%
+"!!%!N!8#"!#3"'i!"!#3"3S!#J$G!Bi!N!I`!6B""3'-"!T%DA0dFQPLGA4P!*!
+&m!$5!33",J3+3fKPBfXJG(*PC3#3"I!!#J%%!')%#NPZBfaeC'8Z,Li!N!A`!'i
+""!$'"!G&H'0XG@4P!*!%+!!S!#J"1J(%!!!"!!%!N!8#!a03BA4dCA*ZFb"dEb"
+TEQ0XG@4P!!!!+!"F!$i!d3'K!!8"!!%!N!8#!"0*EQ0XG@4P)'CTE'8[CQpXC'9
+b!!!!*!"F!$i!YJ'I!!8"!!%!N!8#!3p&H'0XG@4P)("KG(4PFQi!!!!X!#J!+!%
+k!F3!!!%!N!F#!KG'D@aPFb"dEb"LC5"MBA4PCfpbDATPC!!!!$%!+!!S!6S"a!!
+!!3!"!*!&!J-F4QPXCA-JB@jN)'C[E'4PFR-JG'mJD@jME(9NC3!!!'`!!J#3"3N
+!$!!G!0d%(e0PE'9MG#"PH'PcG'PZCb"NDA0dFQPLGA4TEfiZ,Li!N!BP!!X!13$
+F""T$FQ9KG'8JEQ9h)'4TFh4bD@*eG'P[ELiZ,J#3"8)!$!"@!0d%"N0KEQ0PE!!
+!!3!!!!3X!!!$,!!!!9m"[JKd(cJ!!!!F!,)!!84-6dF!"3!54%P86!!%!&S#!*!
+&!J-"[JG-!J%!$`!!!Lm"[JG8!J)!(J!!!PF"[JG)!J-!RJ!!!SF"[JG%!J3!)`!
+!!8`"[JG!!J8!M`!!!GF"[JFm!J!!03!!!&i!N!3#!3"%!*!)!J)!8`!!!@8!N!3
+#!`"I!!!!qJ#3"!)%!(B!!!+m!*!%$NPZBfaeC'8JC'PKE'pR$N9iBfaeC'8JC'P
+KE'pR"%eKD@i44'PcG(*TBR9dD@pZ)(4jF'818h*M,f4cG#"ND@&XEfF14AKME(9
+NC5"ND@&XEfF,6@&TEL"hD@jNEhF@5@jME(9NC5pPH'0XG@4P)(GTEQ4[GaK%DA0
+dFQPLGA4TEfiJG(P`C5"hD@jNEhF14AKME(9NC5"hD@jNEhF15@jME(9NC5"hD@j
+NEhF5G3:
diff --git a/Mac/scripts/MkDistr_ui.py b/Mac/scripts/MkDistr_ui.py
index 0f15cad..6ca788c 100644
--- a/Mac/scripts/MkDistr_ui.py
+++ b/Mac/scripts/MkDistr_ui.py
@@ -21,6 +21,8 @@
 from FrameWork import *
 import EasyDialogs
 import macfs
+import os
+import sys
 
 # Resource IDs
 ID_MAIN = 514
@@ -30,82 +32,65 @@
 MAIN_INCLUDE=4
 MAIN_EXCLUDE=5
 
-ID_INCEXC=515
+ID_INCWINDOW=515
+ID_EXCWINDOW=517
 INCEXC_DELETE=2
 INCEXC_CHANGE=3
 INCEXC_ADD=4
 
 ID_INCLUDE=512
 ID_EXCLUDE=513
-DLG_OK=1
+DLG_OK=1 # Include for include, exclude for exclude
 DLG_CANCEL=2
-DLG_FULL=3
-DLG_PPCDEV=4
-DLG_68K=5
-DLG_PPC=6
-DLG_BUTTONS=[DLG_FULL, DLG_PPCDEV, DLG_68K, DLG_PPC]
-DLG_LETTERS=['S', 'P', 'm', 'p']
-DLG_SRCPATH=7
-DLG_DSTPATH=8
+DLG_SRCPATH=3
+DLG_DSTPATH=4 # include dialog only
+DLG_EXCLUDE=5 # Exclude, include dialog only
 
 ID_DTYPE=516
+DTYPE_EXIST=1
+DTYPE_NEW=2
+DTYPE_CANCEL=3
 
 class EditDialogWindow(DialogWindow):
 	"""Include/exclude editor (modeless dialog window)"""
 	
-	def open(self, id, (type, src, dst), callback, cancelrv):
+	def open(self, id, (src, dst), callback, cancelrv):
 		self.id = id
-		if id == ID_INCLUDE:
-			title = "Include file dialog"
-		else:
-			title = "Exclude pattern dialog"
-		#self.wid.as_Window().SetWTitle(title)
 		self.callback = callback
 		self.cancelrv = cancelrv
 		DialogWindow.open(self, id)
 		tp, h, rect = self.wid.GetDialogItem(DLG_SRCPATH)
 		Dlg.SetDialogItemText(h, src)
+		self.wid.SetDialogDefaultItem(DLG_OK)
+		self.wid.SetDialogCancelItem(DLG_CANCEL)
 		if id == ID_INCLUDE:
 			tp, h, rect = self.wid.GetDialogItem(DLG_DSTPATH)
+			if dst == None:
+				dst = ''
 			Dlg.SetDialogItemText(h, dst)
-		for b in range(len(DLG_BUTTONS)):
-			if type == None or DLG_LETTERS[b] in type:
-				self.setbutton(DLG_BUTTONS[b], 1)
-
-	def setbutton(self, num, value):
-		tp, h, rect = self.wid.GetDialogItem(num)
-		h.as_Control().SetControlValue(value)
-		
-	def getbutton(self, num):
-		tp, h, rect = self.wid.GetDialogItem(num)
-		return h.as_Control().GetControlValue()
+		self.wid.DrawDialog()
 	
 	def do_itemhit(self, item, event):
-		if item in (DLG_OK, DLG_CANCEL):
+		if item in (DLG_OK, DLG_CANCEL, DLG_EXCLUDE):
 			self.done(item)
-		elif item in DLG_BUTTONS:
-			v = self.getbutton(item)
-			self.setbutton(item, (not v))
 		# else it is not interesting
 		
 	def done(self, item):
+		tp, h, rect = self.wid.GetDialogItem(DLG_SRCPATH)
+		src = Dlg.GetDialogItemText(h)
 		if item == DLG_OK:
-			distlist = ''
-			for i in range(len(DLG_BUTTONS)):
-				if self.getbutton(DLG_BUTTONS[i]):
-					distlist = distlist + DLG_LETTERS[i]
-			tp, h, rect = self.wid.GetDialogItem(DLG_SRCPATH)
-			src = Dlg.GetDialogItemText(h)
 			if self.id == ID_INCLUDE:
 				tp, h, rect = self.wid.GetDialogItem(DLG_DSTPATH)
 				dst = Dlg.GetDialogItemText(h)
-				rv = (distlist, src, dst)
+				rv = (src, dst)
 			else:
-				rv = (distlist, src)
+				rv = (src, None)
+		elif item == DLG_EXCLUDE:
+			rv = (src, None)
 		else:
 			rv = self.cancelrv
 		self.close()
-		self.callback((item==DLG_OK), rv)
+		self.callback((item in (DLG_OK, DLG_EXCLUDE)), rv)
 		
 class ListWindow(DialogWindow):
 	"""A dialog window containing a list as its main item"""
@@ -113,8 +98,10 @@
 	def open(self, id, contents):
 		self.id = id
 		DialogWindow.open(self, id)
+		Qd.SetPort(self.wid)
 		tp, h, rect = self.wid.GetDialogItem(MAIN_LIST)
-		rect2 = rect[0], rect[1], rect[2]-16, rect[3]-16	# Scroll bar space
+		self.listrect = rect
+		rect2 = rect[0]+1, rect[1]+1, rect[2]-16, rect[3]-16	# Scroll bar space
 		self.list = List.LNew(rect2, (0, 0, 1, len(contents)), (0,0), 0, self.wid,
 				0, 1, 1, 1)
 		self.setlist(contents)
@@ -127,7 +114,8 @@
 			for i in range(len(contents)):
 				self.list.LSetCell(contents[i], (0, i))
 		self.list.LSetDrawingMode(1)
-		self.list.LUpdate(self.wid.GetWindowPort().visRgn)
+		##self.list.LUpdate(self.wid.GetWindowPort().visRgn)
+		Win.InvalRect(self.listrect)
 		
 	def additem(self, item):
 		where = self.list.LAddRow(1, 0)
@@ -162,6 +150,7 @@
 		
 	def do_rawupdate(self, window, event):
 		Qd.SetPort(window)
+		Qd.FrameRect(self.listrect)
 		self.list.LUpdate(self.wid.GetWindowPort().visRgn)
 		
 	def do_close(self):
@@ -173,7 +162,7 @@
 		
 	def mycb_add(self, ok, item):
 		if item:
-			self.additem(item[1])
+			self.additem(item[0])
 			self.cb_add(item)
 		
 class MainListWindow(ListWindow):
@@ -181,35 +170,45 @@
 
 	def open(self, id, cb_check, cb_run, cb_add):
 		ListWindow.open(self, id, [])
-		title = "MkDistr: Unresolved files"
-		#self.wid.as_Window().SetWTitle(title)
+		self.wid.SetDialogDefaultItem(ID_INCLUDE)
 		self.cb_run = cb_run
 		self.cb_check = cb_check
 		self.cb_add = cb_add
+		setwatchcursor()
+		list = self.cb_check()
+		self.setlist(list)
+		setarrowcursor()
 
 	def do_itemhit(self, item, event):
 		if item == MAIN_LIST:
 			self.do_listhit(event)
 		if item == MAIN_MKDISTR:
-			fss, ok = macfs.StandardPutFile('Destination folder:')
-			if not ok:
-				return
-			self.cb_run(fss.as_pathname())
+## XXXX This somehow stopped working...
+##			fss, ok = macfs.StandardPutFile('Destination folder:')
+##			if not ok:
+##				return
+##			dest = fss.as_pathname()
+			dest = os.path.join(os.getcwd(), 'Distribution')
+			setwatchcursor()
+			self.cb_run(dest)
+			setarrowcursor()
 		if item == MAIN_CHECK:
+			setwatchcursor()
 			list = self.cb_check()
 			self.setlist(list)
+			setarrowcursor()
 		if item == MAIN_INCLUDE:
 			self.do_dclick(self.delgetselection())
 		if item == MAIN_EXCLUDE:
 			for i in self.delgetselection():
-				self.cb_add(('', i, ''))
+				self.cb_add((i, None))
 			
 	def do_dclick(self, list):
 		if not list:
 			list = ['']
 		for l in list:
 			w = EditDialogWindow(self.parent)
-			w.open(ID_INCLUDE, (None, l, ''), self.mycb_add, None)
+			w.open(ID_INCLUDE, (l, None), self.mycb_add, None)
 
 	def mycb_add(self, ok, item):
 		if item:
@@ -219,11 +218,7 @@
 	"""An include/exclude window"""
 	def open(self, id, editid, contents, cb_add, cb_del, cb_get):
 		ListWindow.open(self, id, contents)
-		if editid == ID_INCLUDE:
-			title = "MkDistr: files to include"
-		else:
-			title = "MkDistr: patterns to exclude"
-		#self.wid.as_Window().SetWTitle(title)
+		self.wid.SetDialogDefaultItem(INCEXC_CHANGE)
 		self.editid = editid
 		self.cb_add = cb_add
 		self.cb_del = cb_del
@@ -240,7 +235,7 @@
 			self.do_dclick(self.delgetselection())
 		if item == INCEXC_ADD:
 			w = EditDialogWindow(self.parent)
-			w.open(self.editid, (None, '', ''), self.mycb_add, None)
+			w.open(self.editid, ('', None), self.mycb_add, None)
 			
 	def do_dclick(self, list):
 		if not list:
@@ -285,7 +280,7 @@
 				self.iwin.close()
 			del self.iwin
 		self.iwin = IncListWindow(self)
-		self.iwin.open(ID_INCEXC, ID_INCLUDE, self.main.inc.getall(), self.main.inc.add,
+		self.iwin.open(ID_INCWINDOW, ID_INCLUDE, self.main.inc.getall(), self.main.inc.add,
 			self.main.inc.delete, self.main.inc.get)
 		
 	def showexc(self, *args):
@@ -294,7 +289,7 @@
 				self.ewin.close()
 			del self.ewin
 		self.ewin = IncListWindow(self)
-		self.ewin.open(ID_INCEXC, ID_EXCLUDE, self.main.exc.getall(), self.main.exc.add,
+		self.ewin.open(ID_EXCWINDOW, ID_EXCLUDE, self.main.exc.getall(), self.main.exc.add,
 			self.main.exc.delete, self.main.exc.get)
 
 	def do_about(self, id, item, window, event):
@@ -302,11 +297,33 @@
 		
 def GetType():
 	"""Ask user for distribution type"""
-	d = Dlg.GetNewDialog(ID_DTYPE, -1)
 	while 1:
-		rv = ModalDialog(None)
-		if rv >= 1 and rv <= 4:
-			return DLG_LETTERS[rv-1]
+		d = Dlg.GetNewDialog(ID_DTYPE, -1)
+		d.SetDialogDefaultItem(DTYPE_EXIST)
+		d.SetDialogCancelItem(DTYPE_CANCEL)
+		while 1:
+			rv = ModalDialog(None)
+			if rv in (DTYPE_EXIST, DTYPE_NEW, DTYPE_CANCEL):
+				break
+		del d
+		if rv == DTYPE_CANCEL:
+			sys.exit(0)
+		if rv == DTYPE_EXIST:
+##			macfs.SetFolder(':(MkDistr)')
+			fss, ok = macfs.StandardGetFile('TEXT')
+			if not ok:
+				sys.exit(0)
+			path = fss.as_pathname()
+			basename = os.path.split(path)[-1]
+			if basename[-8:] <> '.include':
+				EasyDialogs.Message('That is not a distribution include file')
+			else:
+				return basename[:-8]
+		else:
+			name = EasyDialogs.AskString('Distribution name:')
+			if name:
+				return name
+			sys.exit(0)
 			
 def InitUI():
 	"""Initialize stuff needed by UI (a resource file)"""
