diff --git a/Mac/Tools/IDE/InstallManager.py b/Mac/Tools/IDE/PackageManager.py
similarity index 83%
rename from Mac/Tools/IDE/InstallManager.py
rename to Mac/Tools/IDE/PackageManager.py
index 004ab3f..a93d683 100755
--- a/Mac/Tools/IDE/InstallManager.py
+++ b/Mac/Tools/IDE/PackageManager.py
@@ -12,10 +12,10 @@
 
 ELIPSES = '...'
 		
-class InstallManager(Wapplication.Application):
+class PackageManagerMain(Wapplication.Application):
 	
 	def __init__(self):
-		self.preffilepath = os.path.join("Python", "Python Install Manager Prefs")
+		self.preffilepath = os.path.join("Python", "Package Install Manager Prefs")
 		Wapplication.Application.__init__(self, 'Pimp')
 		from Carbon import AE
 		from Carbon import AppleEvents
@@ -28,7 +28,7 @@
 				self.ignoreevent)
 		AE.AEInstallEventHandler(AppleEvents.kCoreEventClass, AppleEvents.kAEQuitApplication, 
 				self.quitevent)
-		if 0:
+		if 1:
 			import PyConsole
 			# With -D option (OSX command line only) keep stderr, for debugging the IDE
 			# itself.
@@ -37,7 +37,6 @@
 				debug_stderr = sys.stderr
 				del sys.argv[1]
 			PyConsole.installoutput()
-			PyConsole.installconsole()
 			if debug_stderr:
 				sys.stderr = debug_stderr
 		self.opendoc(None)
@@ -45,13 +44,13 @@
 		
 	def makeusermenus(self):
 		m = Wapplication.Menu(self.menubar, "File")
-		newitem = FrameWork.MenuItem(m, "Open Standard Database", "N", 'openstandard')
+##		newitem = FrameWork.MenuItem(m, "Open Standard Database", "N", 'openstandard')
 ##		openitem = FrameWork.MenuItem(m, "Open"+ELIPSES, "O", 'open')
 ##		openbynameitem = FrameWork.MenuItem(m, "Open URL"+ELIPSES, "D", 'openbyname')
 		FrameWork.Separator(m)
 		closeitem = FrameWork.MenuItem(m, "Close", "W", 'close')
 ##		saveitem = FrameWork.MenuItem(m, "Save", "S", 'save')
-		saveasitem = FrameWork.MenuItem(m, "Save as"+ELIPSES, None, 'save_as')
+##		saveasitem = FrameWork.MenuItem(m, "Save as"+ELIPSES, None, 'save_as')
 		FrameWork.Separator(m)
 		
 		m = Wapplication.Menu(self.menubar, "Edit")
@@ -100,10 +99,10 @@
 		PackageBrowser(url)
 	
 	def getabouttext(self):
-		return "About Python Install Manager"+ELIPSES
+		return "About Package Manager"+ELIPSES
 	
 	def do_about(self, id, item, window, event):
-		EasyDialogs.Message("Python Install Manager")
+		EasyDialogs.Message("Package Install Manager for Python")
 			
 	def domenu_open(self, *args):
 		filename = EasyDialogs.AskFileForOpen(typeList=("TEXT",))
@@ -172,6 +171,7 @@
 	def setuppimp(self, url):
 		self.pimpprefs = pimp.PimpPreferences()
 		self.pimpdb = pimp.PimpDatabase(self.pimpprefs)
+		self.pimpinstaller = pimp.PimpInstaller(self.pimpdb)
 		if not url:
 			url = self.pimpprefs.pimpDatabase
 		self.pimpdb.appendURL(url)
@@ -189,6 +189,14 @@
 	def getstatus(self, number):
 		pkg = self.packages[number]
 		return pkg.installed()
+		
+	def installpackage(self, sel, output, recursive, force):
+		pkg = self.packages[sel]
+		list, messages = self.pimpinstaller.prepareInstall(pkg, force, recursive)
+		if messages:
+			return messages
+		messages = self.pimpinstaller.install(list, output)
+		return messages
 			
 class PackageBrowser(PimpInterface):
 	
@@ -209,35 +217,52 @@
 		self.w.message_l = W.TextBox((4, -48, 60, 12), 'Status:')
 		self.w.message = W.TextBox((64, -48, 0, 12), '')
 		self.w.homepage_button = W.Button((4, -28, 96, 18), 'View homepage', self.do_homepage)
-		self.w.verbose_button = W.CheckBox((-204, -26, 60, 18), 'Verbose')
+		self.w.verbose_button = W.CheckBox((-288, -26, 60, 18), 'Verbose')
+		self.w.recursive_button = W.CheckBox((-224, -26, 80, 18), 'Recursive', self.updatestatus)
+		self.w.recursive_button.set(1)
 		self.w.force_button = W.CheckBox((-140, -26, 60, 18), 'Force', self.updatestatus)
 		self.w.install_button = W.Button((-76, -28, 56, 18), 'Install', self.do_install)
 		self.w.open()
 		
 	def updatestatus(self):
 		sel = self.w.packagebrowser.getselection()
+		data = self.getbrowserdata()
+		self.w.packagebrowser.setitems(data)
 		if len(sel) != 1:
 			self.w.installed.set('')
 			self.w.message.set('')
 			self.w.install_button.enable(0)
 			self.w.homepage_button.enable(0)
 			self.w.verbose_button.enable(0)
+			self.w.recursive_button.enable(0)
 			self.w.force_button.enable(0)
 		else:
 			sel = sel[0]
+			self.w.packagebrowser.setselection([sel])
 			installed, message = self.getstatus(sel)
 			self.w.installed.set(installed)
 			self.w.message.set(message)
 			self.w.install_button.enable(installed != "yes" or self.w.force_button.get())
 			self.w.homepage_button.enable(not not self.packages[sel].homepage())
 			self.w.verbose_button.enable(1)
+			self.w.recursive_button.enable(1)
 			self.w.force_button.enable(1)
 		
 	def listhit(self, *args, **kwargs):
 		self.updatestatus()
 		
 	def do_install(self):
-		print "INSTALL"
+		sel = self.w.packagebrowser.getselection()[0]
+		if self.w.verbose_button.get():
+			output = sys.stdout
+		else:
+			output = None
+		recursive = self.w.recursive_button.get()
+		force = self.w.force_button.get()
+		messages = self.installpackage(sel, output, recursive, force)
+		self.updatestatus()
+		if messages:
+			EasyDialogs.Message('\n'.join(messages))
 		
 	def do_homepage(self):
 		sel = self.w.packagebrowser.getselection()[0]
@@ -248,4 +273,4 @@
 		self.ic.launchurl(self.packages[sel].homepage())
 		
 if __name__ == '__main__':
-	InstallManager()
+	PackageManagerMain()
diff --git a/Mac/Tools/IDE/PythonIDEMain.py b/Mac/Tools/IDE/PythonIDEMain.py
index 365082d..c79d9fc 100644
--- a/Mac/Tools/IDE/PythonIDEMain.py
+++ b/Mac/Tools/IDE/PythonIDEMain.py
@@ -82,6 +82,8 @@
 		saveasitem = FrameWork.MenuItem(m, "Save as"+ELIPSES, None, 'save_as')
 		FrameWork.Separator(m)
 		saveasappletitem = FrameWork.MenuItem(m, "Save as Applet"+ELIPSES, None, 'save_as_applet')
+		FrameWork.Separator(m)
+		instmgritem = FrameWork.MenuItem(m, "Package Manager", None, 'openpackagemanager')
 		if not runningOnOSX():
 			# On OSX there's a special "magic" quit menu, so we shouldn't add
 			# it to the File menu.
@@ -308,6 +310,11 @@
 			sys.__stderr__.write("*** PythonIDE: Can't write preferences ***\n")
 		self.quitting = 1
 		
+	def domenu_openpackagemanager(self):
+		import PackageManager
+		PackageManager.PackageBrowser()
+		print "Done"
+		
 	def makehelpmenu(self):
 		docs = self.installdocumentation()
 		self.helpmenu = m = self.gethelpmenu()
