Index: /AE/Installer/trunk/source/aeinstallerapp.cpp
===================================================================
--- /AE/Installer/trunk/source/aeinstallerapp.cpp	(revision 499)
+++ /AE/Installer/trunk/source/aeinstallerapp.cpp	(revision 500)
@@ -19,4 +19,6 @@
 ////@end includes
 
+extern int updateStatus;
+extern bool installerJustUpdated;
 Install_info_cfg currentAE, updateAE;
 MainWindow* TheWindow;
@@ -111,11 +113,9 @@
 	}
 	
-	bool installerJustUpdated = false;
-	int updateStatus = GetUpdateStatus(&currentAE, &updateAE, &installerJustUpdated);
-	if (updateStatus) // otherwise there's no update
+	if (updateStatus) // updateStatus was set when MainWindow::CreateControls() was called during initialization of the window
 	{
 		string updateMsg = "An update for the Anniversary Edition is available.\n"; // for some reason we can't set the initial value while using the '+' operator...
 		updateMsg = updateMsg + "Do you wish to update to Edition version " + updateAE.AEVersion + "?\n" +
-						        "(Current version is " + currentAE.AEVersion + ")\n"; // ...so tack the rest on in a second command
+						        "(Current version is " + currentAE.AEVersion + ")\n"; // ...so we tack the rest on in a second command
 		wxMessageDialog* updateNotification;
 		
@@ -153,5 +153,4 @@
 										"you will be prompted to begin the installation.";
 				updateNotification = new wxMessageDialog(TheWindow, updateMsg.c_str(), "AE Installer Alert", wxYES_NO | wxICON_EXCLAMATION, wxDefaultPosition);
-				updateNotification->ShowModal();
 				if (updateNotification->ShowModal() == wxID_YES)
 				{
@@ -166,9 +165,10 @@
 			case UPDATE_INST_REPL_ERR: // the Installer replacement failed, user has to do it :-(
 				updateMsg = "The Installer replacement process failed for some reason.\n";
-				updateMsg = updateMsg + "Please quit, go into the folder Edition/Updates/" + strEUFN + "/install/ and drag the Installer to Edition/install/, " +
-										"replacing the current Installer application, then launch the new version.";
-				updateNotification = new wxMessageDialog(TheWindow, updateMsg.c_str(), "AE Installer Alert", wxOK | wxICON_EXCLAMATION, wxDefaultPosition);
-				updateNotification->ShowModal();
-				TheWindow->Close();
+				updateMsg = updateMsg + "In order for the update to continue, go into the folder Edition/updates/" + strEUFN + "/install/ and " + 
+										"drag the Installer to Edition/install/, replacing the current Installer application, then launch the " +
+										"new version. Click Yes to quit.";
+				updateNotification = new wxMessageDialog(TheWindow, updateMsg.c_str(), "AE Installer Alert", wxYES_NO | wxICON_EXCLAMATION, wxDefaultPosition);
+				if (updateNotification->ShowModal() == wxID_YES)
+					TheWindow->Close();
 				return true;
 		}
Index: /AE/Installer/trunk/source/globals.h
===================================================================
--- /AE/Installer/trunk/source/globals.h	(revision 499)
+++ /AE/Installer/trunk/source/globals.h	(revision 500)
@@ -41,5 +41,5 @@
 
 #pragma mark DEFINES
-#define INSTALLER_VERSION		 "1.1" // only place we need to change this
+#define INSTALLER_VERSION		 "1.1" // only place in source we need to set this
 #define UPDATE_LOG_READ_ERR		-1
 #define UPDATE_INST_REPL_ERR	-2
@@ -55,4 +55,5 @@
 {
 	bool	isInstalled; // replace with function 
+	string	installerVersion;
 	string	name;
 	string	modStringName;
Index: /AE/Installer/trunk/source/installer.cpp
===================================================================
--- /AE/Installer/trunk/source/installer.cpp	(revision 499)
+++ /AE/Installer/trunk/source/installer.cpp	(revision 500)
@@ -303,7 +303,7 @@
 		 Tests for presence of prefs with [ -f ] before doing anything so it doesn't create a partial prefs file -- just in case user has never
 		 run Oni before :-p */
-		string fullAEpath = escapePath(system_complete(".").parent_path().parent_path().string()); // get full path for edition/
+		string fullAEpath = escapePath(system_complete(".").parent_path().parent_path().string()); // get full path for Edition/ (Oni wants the folder that *contains* the GDF)
 		char prefsCommand[300] = "[ -f ~/Library/Preferences/com.godgames.oni.plist ] && defaults write com.godgames.oni RetailInstallationPath -string '";
-		strcat(prefsCommand, fullAEpath.c_str()); // get path of Edition/ folder (Oni wants the folder that *contains* the GDF)
+		strcat(prefsCommand, fullAEpath.c_str());
 		strcat(prefsCommand, "'"); // path string is enclosed in single quotes to avoid the need to escape UNIX-unfriendly characters
 		system(prefsCommand);
@@ -327,4 +327,5 @@
 {
 	vector<ModPackage> packages;
+	ModPackage package;
 	packages.reserve(256);
 	fstream file;
@@ -338,8 +339,9 @@
 			file.open((dir_itr->path().string() + "/" + MODINFO_CFG).c_str());
 			
-			if(!file.fail())
-			{
-				//would prefer to push a pointer to a package, but this will do for now
-				packages.push_back(fileToModPackage(file));
+			if (!file.fail())
+			{
+				package = fileToModPackage(file);
+				if (package.installerVersion.compare(INSTALLER_VERSION) < 1)  // if mod requires newer version of the Installer, we won't add it to the list
+					packages.push_back(package);
 			}	
 			file.close();
@@ -368,8 +370,8 @@
 	ModPackage package;
 	string line;
-	static string NameOfMod = "NameOfMod";	//used for comparing to the current token...
-	//I could have done it in reverse (*iter).compare("ModString") or  
-	static string ARROW = "->";				//did something like "ModString".compare(*iter), and it would have been
-	static string ModString = "ModString";	//functionably the same. 
+	static string AEInstallVersion = "AEInstallVersion"; // used for comparing to the current token...
+	static string NameOfMod = "NameOfMod";
+	static string ARROW = "->";
+	static string ModString = "ModString";
 	static string HasOnis = "HasOnis";
 	static string HasDeltas = "HasDeltas";
@@ -381,25 +383,29 @@
 	static string Category = "Category";
 	static string Creator = "Creator";
-	while (! file.eof() )
-	{
-		getline (file,line);
+	while (!file.eof())
+	{
+		getline(file,line);
 		vector<string> tokens; 
 		vector<string>::iterator iter;
-		tokenize(line, tokens);					//string to vector of "words"
-		if (tokens.capacity() >= 3) {			//make sure they are using enough stuff
-			iter = tokens.begin();				//what word we are on, starts at first word
-			/* TODO: Get this "required Installer version" code working
-			 if (!AEInstallVersion.compare(*iter))
-			 If mod is too old, skip this mod.
-			 */
-			/*else*/if (!NameOfMod.compare(*iter))  {	//if it contains the name
-				for ( ; iter !=tokens.end() && SLASHSLASH.compare(*iter); iter++) {	// iterates through the words, ends if it reaches the end of the line or a "//" comment
-					if (ARROW.compare(*iter) && NameOfMod.compare(*iter)) {			// ignores "->" and "NameOfMod"
+		tokenize(line, tokens);
+		if (tokens.capacity() >= 3)
+		{
+			iter = tokens.begin();
+
+			if (!AEInstallVersion.compare(*iter))
+			{
+				iter++; iter++;
+				package.installerVersion = *iter;
+			}
+			else if (!NameOfMod.compare(*iter))
+			{
+				for ( ; iter !=tokens.end() && SLASHSLASH.compare(*iter); iter++) // iterates through the words, ends if it reaches the end of the line or a "//" comment
+				{
+					if (ARROW.compare(*iter) && NameOfMod.compare(*iter)) // ignores "->" and "NameOfMod"
 						package.name += *iter + " ";
-					}
-				}
-				
-			}
-			else if (!ModString.compare(*iter)) {
+				}
+			}
+			else if (!ModString.compare(*iter))
+			{
 				iter++; iter++;
 				package.modStringName = *iter;
@@ -407,47 +413,59 @@
 				package.modStringVersion = atoi((*iter).c_str());
 			}
-			else if (!HasOnis.compare(*iter)) {
+			else if (!HasOnis.compare(*iter))
+			{
 				iter++; iter++;  
-				if ( boost::iequals(*iter, "Yes")) package.hasOnis = 1;
+				if (boost::iequals(*iter, "Yes")) package.hasOnis = 1;
 			}	
-			else if (!HasBSL.compare(*iter)) {
-				if(toupper((*iter)[0]) == 'Y' && toupper((*iter)[1]) == 'E' && toupper((*iter)[2]) == 'S') package.hasBSL = true;
-				else if ( boost::iequals(*iter, "Addon")) package.hasAddon = true;
-			}
-			else if (!HasDeltas.compare(*iter)) {
+			else if (!HasBSL.compare(*iter))
+			{
+				iter++; iter++;
+				if (toupper((*iter)[0]) == 'Y' && toupper((*iter)[1]) == 'E' && toupper((*iter)[2]) == 'S') package.hasBSL = true;
+				else if (boost::iequals(*iter, "Addon")) package.hasAddon = true;
+			}
+			else if (!HasDeltas.compare(*iter))
+			{
 				iter++; iter++;  
-				if (toupper((*iter)[0]) + toupper((*iter)[1]) + toupper((*iter)[2]) == 'Y' + 'E' + 'S') package.hasDeltas = 1;
-			}
-			else if (!HasDats.compare(*iter)) {
+				if (toupper((*iter)[0]) == 'Y' && toupper((*iter)[1]) == 'E' && toupper((*iter)[2]) == 'S') package.hasDeltas = 1;
+			}
+			else if (!HasDats.compare(*iter))
+			{
 				iter++; iter++;  
-				if (toupper((*iter)[0]) + toupper((*iter)[1]) + toupper((*iter)[2]) == 'Y' + 'E' + 'S') package.hasDats = 1;
-			}
-			else if (!IsEngine.compare(*iter)) {
+				if (toupper((*iter)[0]) == 'Y' && toupper((*iter)[1]) == 'E' && toupper((*iter)[2]) == 'S') package.hasDats = 1;
+			}
+			else if (!IsEngine.compare(*iter))
+			{
 				iter++; iter++;  
-				if (toupper((*iter)[0]) + toupper((*iter)[1]) + toupper((*iter)[2]) == 'Y' + 'E' + 'S') package.isEngine = 1;
-			}
-			else if (!GlobalNeeded.compare(*iter)) {
+				if (toupper((*iter)[0]) == 'Y' && toupper((*iter)[1]) == 'E' && toupper((*iter)[2]) == 'S') package.isEngine = 1;
+			}
+			else if (!GlobalNeeded.compare(*iter))
+			{
 				iter++; iter++;  
-				if (toupper((*iter)[0]) + toupper((*iter)[1]) + toupper((*iter)[2]) == 'Y' + 'E' + 'S') package.globalNeeded = 1;
-				else if (toupper((*iter)[0]) + toupper((*iter)[1]) == 'N' + 'O') package.globalNeeded = 1; // only place where checking for "No" is important atm.
-			}
-			else if (!Category.compare(*iter))  {	
-				for ( ; iter !=tokens.end() && SLASHSLASH.compare(*iter); iter++) {	// iterates through the words, ends if it reaches end of line or a "//" comment
-					if (ARROW.compare(*iter) && Category.compare(*iter)) {			// ignores "->" and "Category"
+				if (toupper((*iter)[0]) == 'Y' && toupper((*iter)[1]) == 'E' && toupper((*iter)[2]) == 'S') package.globalNeeded = 1;
+				else if (toupper((*iter)[0]) == 'N' && toupper((*iter)[1]) == 'O') package.globalNeeded = 1; // only place where checking for "No" is important atm
+			}
+			else if (!Category.compare(*iter)) 
+			{	
+				for ( ; iter !=tokens.end() && SLASHSLASH.compare(*iter); iter++)
+				{
+					if (ARROW.compare(*iter) && Category.compare(*iter)) // ignores "->" and "Category"
 						package.category += *iter + " ";
-					}
-				}
-			}
-			else if (!Creator.compare(*iter))  {	//if it contains the name
-				for ( ; iter !=tokens.end() && SLASHSLASH.compare(*iter); iter++) {	// iterates through the words, ends if it reaches end of line or a "//" comment
-					if (ARROW.compare(*iter) && Creator.compare(*iter)) {			// ignores "->" and "Creator"
+				}
+			}
+			else if (!Creator.compare(*iter))
+			{
+				for ( ; iter !=tokens.end() && SLASHSLASH.compare(*iter); iter++)
+				{
+					if (ARROW.compare(*iter) && Creator.compare(*iter)) // ignores "->" and "Creator"
 						package.creator += *iter + " ";
-					}
-				}
-			}
-			else if (!Readme.compare(*iter))  {	//if it contains the name
-				for ( ; iter !=tokens.end() && SLASHSLASH.compare(*iter); iter++) {	// iterates through the words, ends if it reaches end of line or a "//" comment
-					if (ARROW.compare(*iter) && Readme.compare(*iter)) {			// ignores "->" and "Readme"
-						if(!(*iter).compare("\\n")) package.readme += '\n';
+				}
+			}
+			else if (!Readme.compare(*iter))
+			{
+				for ( ; iter !=tokens.end() && SLASHSLASH.compare(*iter); iter++)
+				{
+					if (ARROW.compare(*iter) && Readme.compare(*iter)) // ignores "->" and "Readme"
+					{
+						if (!(*iter).compare("\\n")) package.readme += '\n';
 						else package.readme += *iter + " ";
 					}
@@ -455,5 +473,4 @@
 			}
 		}
-		
 	}
 
Index: /AE/Installer/trunk/source/main_window.cpp
===================================================================
--- /AE/Installer/trunk/source/main_window.cpp	(revision 499)
+++ /AE/Installer/trunk/source/main_window.cpp	(revision 500)
@@ -45,4 +45,6 @@
 
 bool busy = false;
+int updateStatus;
+bool installerJustUpdated = false;
 vector<string> globalInstalledMods;
 vector<ModPackage> globalPackages;
@@ -355,10 +357,13 @@
 	::CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER, IID_ITaskbarList, (void **)&pTaskbarList);
 #endif
+
+	updateStatus = GetUpdateStatus(&currentAE, &updateAE, &installerJustUpdated);
 	
 	globalPackages = getPackages();
 	globalInstalledMods = getInstallString();
-	for (unsigned int i = 0; i < globalPackages.size(); i++) {
+	for (unsigned int i = 0; i < globalPackages.size(); i++)
+	{
 		Mods_CheckboxList->Append(globalPackages[i].name.c_str());
-		if( binary_search(globalInstalledMods.begin(), globalInstalledMods.end(), globalPackages[i].modStringName ) ) Mods_CheckboxList->Check(i);
+		if (binary_search(globalInstalledMods.begin(), globalInstalledMods.end(), globalPackages[i].modStringName)) Mods_CheckboxList->Check(i);
 	}
 
