diff --git a/Mac/Tools/IDE/PackageManager.py b/Mac/Tools/IDE/PackageManager.py
index 3051f38..4732977 100755
--- a/Mac/Tools/IDE/PackageManager.py
+++ b/Mac/Tools/IDE/PackageManager.py
@@ -47,6 +47,12 @@
 
 ELIPSES = '...'
 		
+USER_INSTALL_DIR = os.path.join(os.environ.get('HOME', ''),
+        						'Library',
+        						'Python',
+        						sys.version[:3],
+        						'site-packages')
+        						
 class PackageManagerMain(Wapplication.Application):
 	
 	def __init__(self):
@@ -225,6 +231,13 @@
 			self.pimpdb.appendURL(url)
 		except IOError, arg:
 			return "Cannot open %s: %s" % (url, arg)
+		# Check whether we can write the installation directory.
+		# If not, set to the per-user directory, possibly
+		# creating it, if needed.
+		installDir = self.pimpprefs.installDir
+		if not os.access(installDir, os.R_OK|os.W_OK|os.X_OK):
+			rv = self.setuserinstall(1)
+			if rv: return rv
 		return self.pimpprefs.check()
 		
 	def closepimp(self):
@@ -234,11 +247,33 @@
 		self.pimpinstaller = None
 		self.packages = []
 
-	def getbrowserdata(self):
+	def setuserinstall(self, onoff):
+		rv = ""
+		if onoff:
+			if not os.path.exists(USER_INSTALL_DIR):
+				try:
+					os.makedirs(USER_INSTALL_DIR)
+				except OSError, arg:
+					rv = rv + arg + "\n"
+			if not USER_INSTALL_DIR in sys.path:
+				import site
+				reload(site)
+			self.pimpprefs.setInstallDir(USER_INSTALL_DIR)
+		else:
+			self.pimpprefs.setInstallDir(None)
+		rv = rv + self.pimpprefs.check()
+		return rv
+		
+	def getuserinstall(self):
+		return self.pimpprefs.installDir == USER_INSTALL_DIR
+			
+	def getbrowserdata(self, show_hidden=1):
 		self.packages = self.pimpdb.list()
 		rv = []
 		for pkg in self.packages:
 			name = pkg.fullname()
+			if name[0] == '(' and name[-1] == ')' and not show_hidden:
+				continue
 			status, _ = pkg.installed()
 			description = pkg.description()
 			rv.append((status, name, description))
@@ -248,7 +283,7 @@
 		pkg = self.packages[number]
 		return pkg.installed()
 		
-	def installpackage(self, sel, output, recursive, force, user):
+	def installpackage(self, sel, output, recursive, force):
 		pkg = self.packages[sel]
 		list, messages = self.pimpinstaller.prepareInstall(pkg, force, recursive)
 		if messages:
@@ -260,22 +295,22 @@
 	
 	def __init__(self, url = None):
 		self.ic = None
-		msg = self.setuppimp(url)
-		if msg:
-			EasyDialogs.Message(msg)
+		messages = self.setuppimp(url)
 		self.setupwidgets()
 		self.updatestatus()
+		self.showmessages(messages)
 		
 	def close(self):
 		self.closepimp()
 	
 	def setupwidgets(self):
 		INSTALL_POS = -30
-		STATUS_POS = INSTALL_POS - 62
+		STATUS_POS = INSTALL_POS - 70
 		self.w = W.Window((580, 400), "Python Install Manager", minsize = (400, 200), tabbable = 0)
-		self.w.titlebar = W.TextBox((4, 4, 40, 12), 'Packages:')
+		self.w.titlebar = W.TextBox((4, 8, 60, 18), 'Packages:')
+		self.w.hidden_button = W.CheckBox((-100, 4, 0, 18), 'Show Hidden', self.updatestatus)
 		data = self.getbrowserdata()
-		self.w.packagebrowser = W.MultiList((4, 20, 0, STATUS_POS-2), data, self.listhit, cols=3)
+		self.w.packagebrowser = W.MultiList((4, 24, 0, STATUS_POS-2), data, self.listhit, cols=3)
 		
 		self.w.installed_l = W.TextBox((4, STATUS_POS, 60, 12), 'Installed:')
 		self.w.installed = W.TextBox((64, STATUS_POS, 0, 12), '')
@@ -283,19 +318,20 @@
 		self.w.message = W.TextBox((64, STATUS_POS+20, 0, 12), '')
 		self.w.homepage_button = W.Button((4, STATUS_POS+40, 96, 18), 'View homepage', self.do_homepage)
 		
-		self.w.divline = W.HorizontalLine((0, INSTALL_POS, 0, 0))
-		self.w.verbose_button = W.CheckBox((-358, INSTALL_POS+4, 60, 18), 'Verbose')
-		self.w.recursive_button = W.CheckBox((-284, INSTALL_POS+4, 140, 18), 'Install dependencies', self.updatestatus)
+		self.w.divline = W.HorizontalLine((0, INSTALL_POS-4, 0, 0))
+		self.w.verbose_button = W.CheckBox((84, INSTALL_POS+4, 60, 18), 'Verbose')
+		self.w.recursive_button = W.CheckBox((146, INSTALL_POS+4, 120, 18), 'Install dependencies', self.updatestatus)
 		self.w.recursive_button.set(1)
-		self.w.force_button = W.CheckBox((-160, INSTALL_POS+4, 70, 18), 'Overwrite', self.updatestatus)
-		self.w.user_button = W.CheckBox((-90, INSTALL_POS+4, 100, 18), 'User Only')
-		self.w.install_button = W.Button((4, INSTALL_POS+4, 56, 18), 'Install', self.do_install)
+		self.w.force_button = W.CheckBox((268, INSTALL_POS+4, 70, 18), 'Overwrite', self.updatestatus)
+		self.w.user_button = W.CheckBox((340, INSTALL_POS+4, 140, 18), 'For Current User Only', self.do_user)
+		self.w.install_button = W.Button((4, INSTALL_POS+4, 56, 18), 'Install:', self.do_install)
 		self.w.open()
 		
 	def updatestatus(self):
 		sel = self.w.packagebrowser.getselection()
-		data = self.getbrowserdata()
+		data = self.getbrowserdata(self.w.hidden_button.get())
 		self.w.packagebrowser.setitems(data)
+		self.w.user_button.set(self.getuserinstall())
 		if len(sel) != 1:
 			self.w.installed.set('')
 			self.w.message.set('')
@@ -316,7 +352,7 @@
 			self.w.verbose_button.enable(1)
 			self.w.recursive_button.enable(1)
 			self.w.force_button.enable(1)
-			self.w.user_button.enable(0) # XXXX
+			self.w.user_button.enable(1)
 		
 	def listhit(self, *args, **kwargs):
 		self.updatestatus()
@@ -329,11 +365,22 @@
 			output = None
 		recursive = self.w.recursive_button.get()
 		force = self.w.force_button.get()
-		user = self.w.user_button.get()
-		messages = self.installpackage(sel, output, recursive, force, user)
+		messages = self.installpackage(sel, output, recursive, force)
+		
+		# Re-read .pth files
+		import site
+		reload(site)
+		
 		self.updatestatus()
+		self.showmessages(messages)
+		
+	def showmessages(self, messages):
 		if messages:
-			EasyDialogs.Message('\n'.join(messages))
+			if type(messages) == list:
+				messages = '\n'.join(messages)
+			if self.w.verbose_button.get():
+				sys.stdout.write(messages + '\n')
+			EasyDialogs.Message(messages)
 		
 	def do_homepage(self):
 		sel = self.w.packagebrowser.getselection()[0]
@@ -343,5 +390,10 @@
 			self.ic = ic.IC()
 		self.ic.launchurl(self.packages[sel].homepage())
 		
+	def do_user(self):
+		messages = self.setuserinstall(self.w.user_button.get())
+		self.updatestatus()
+		self.showmessages(messages)
+		
 if __name__ == '__main__':
 	PackageManagerMain()
