Index: AE/Installer/trunk/source/methods.h
===================================================================
--- AE/Installer/trunk/source/methods.h	(revision 318)
+++ AE/Installer/trunk/source/methods.h	(revision 319)
@@ -79,5 +79,6 @@
 void tokenize(const string&, vector<string>&, const string& delimiters = " ");
 //bool getDirectoryContents(char , char &);
-
+void clearOldDats(void);
+void writeInstalledMods( vector<string> );
 
 //New copy(path, path) function. Too lazy to implement my own, this is basically how I would have done it though.
Index: AE/Installer/trunk/source/subs.cpp
===================================================================
--- AE/Installer/trunk/source/subs.cpp	(revision 318)
+++ AE/Installer/trunk/source/subs.cpp	(revision 319)
@@ -43,4 +43,5 @@
 using namespace std;
 
+string strInstallCfg = "../GameDataFolder/Install.cfg";
 
 
@@ -306,4 +307,5 @@
 int installPackages(void)
 {
+	bool installed_something = 0;
 	int err = 0;
 	ModPackage package;
@@ -356,4 +358,5 @@
 				if (package_iter->hasOnis || (package_iter->hasDeltas /*(*package_iter).isUnpacked */ ))
 				{
+					installed_something = 1;
 					installedMods.push_back(package_iter->modStringName);
 					system(strPauseCmd);
@@ -364,8 +367,15 @@
 	if (index == 1)
 	{
-		cout << "Error: All packages are already installed\n";
+		cout << "Warning: All packages are already installed\n";
+		//would you like to recombine your data?
 		return 0;
 	}
-	
+	if (installed_something == 0)
+	{
+		cout << "Warning: You didn't install anything!\n";
+		//would you like to recombine your data?
+		return 0;
+	}
+
 	sort(installedMods.begin(), installedMods.end());
 	//system(Onisplit.c_str());
@@ -378,7 +388,85 @@
 int uninstallPackages(void)
 {
-	cout << "\nThis feature not yet implemented.\n\n";
-	
-	return 0;
+int err = 0;
+	ModPackage package;
+	vector<string> installed_packages;
+	vector<ModPackage> packages; 
+	vector<ModPackage>::iterator iter;
+	vector<string> installString;
+	
+	iter = packages.begin();
+	packages = getPackages();
+
+	
+	cout << "Detecting installed packages...\n";
+	
+	vector<string> installedMods = getInstallString();
+	
+	if (packages.empty())
+	{
+		cout << "Error: You have no packages!\n";
+		return 0;
+	}
+	
+	int index = 0;
+	int uninstalled_something = 0;
+	char choice = '0';
+	
+	for (vector<ModPackage>::iterator package_iter = packages.begin(); package_iter != packages.end(); ++package_iter)
+	{
+		if (binary_search(installedMods.begin(), installedMods.end(), package_iter->modStringName))
+		{ //package_iter->isInstalled :< I forgot about this...
+			//cout << index << " ";
+			system(strClsCmd);
+			cout << (*package_iter).name << "\n";
+			for (int character = 1; character <= (*package_iter).name.length() - 1; character++) cout << '-';
+			cout << "\n"
+				 << (*package_iter).readme << "\n\n"
+				 << "Please enter a number choice\n"
+				 << " 1. Uninstall\n"
+				 << " 2. Don't Uninstall\n"
+				 << "";
+			
+			choice = 0;
+			
+			do
+			{
+				choice = cin.get();
+				cin.ignore(1280, '\n');
+			} while(choice == 0);
+			
+			if (choice == '1')
+			{
+					cout << "\nUninstalling...\n\n";
+					installedMods.erase( installedMods.begin() + (index) );
+					system(strPauseCmd);
+					uninstalled_something = 1; 
+				
+			}
+			else {
+				index++;
+			}
+		}
+	}
+	if ( uninstalled_something == 0 )
+	{
+		if (index == 0) //bad practice, I need to implement a second vector or something. Meh.
+		{
+			cout << "\nWarning: You have no installed packages!";
+		}
+		else
+		{
+			cout << "\nWarning: You didn't uninstall anything!";
+		}
+				//would you like to recombine your data?
+			return 0;
+
+	}	
+	sort(installedMods.begin(), installedMods.end());
+	//system(Onisplit.c_str());
+	recompileAll(installedMods);
+	system(strPauseCmd);
+	
+	return err;
 }
 
@@ -552,15 +640,5 @@
 	string importCommand = "";
 	
-	directory_iterator end_iter_gdf;
-		for ( directory_iterator dir_itr_gdf( "../GameDataFolder" );
-			 dir_itr_gdf != end_iter_gdf;
-			 ++dir_itr_gdf )
-		{
-			//cout << dir_itr_gdf->path().extension() << "\n";
-			if ( dir_itr_gdf->path().extension() == ".dat" || dir_itr_gdf->path().extension() == ".raw" || dir_itr_gdf->path().extension() == ".sep" ) {
-				remove( dir_itr_gdf->path() );
-			}
-
-		}
+	clearOldDats();
 
 	if(splitInstances == SPLIT){
@@ -620,4 +698,30 @@
 		}
 	}
+	writeInstalledMods(installedMods);
+}
+
+void writeInstalledMods(vector<string> installedMods)
+{
+	
+	if ( exists( strInstallCfg ) )
+	{
+		remove( strInstallCfg );
+	}
+
+	ofstream file(strInstallCfg.c_str());
+	
+	vector<string>list = installedMods;
+	vector<string>::iterator begin_iter = list.begin(); 
+	vector<string>::iterator end_iter = list.end();
+
+	sort( list.begin(), list.end() );
+
+	for( ; begin_iter != end_iter; ++begin_iter) {
+		file << *begin_iter << " ";
+	}
+	
+	file.close();
+	file.clear();
+	
 }
 
@@ -626,11 +730,11 @@
 	system(strPauseCmd);
 	vector<string> returnval;
-	string file_name = "../GameDataFolder/ImportList.cfg";
+
 	string line;
 	fstream file;
 	
-	if (exists(file_name))
-	{
-		file.open(file_name.c_str());
+	if (exists(strInstallCfg ))
+	{
+		file.open(strInstallCfg.c_str());
 		getline(file, line);
 		tokenize(line, returnval);
@@ -662,2 +766,17 @@
 	}
 }
+
+void clearOldDats(void) {
+	directory_iterator end_iter_gdf;
+		for ( directory_iterator dir_itr_gdf( "../GameDataFolder" );
+			 dir_itr_gdf != end_iter_gdf;
+			 ++dir_itr_gdf )
+		{
+			//cout << dir_itr_gdf->path().extension() << "\n";
+			if ( dir_itr_gdf->path().extension() == ".dat" || dir_itr_gdf->path().extension() == ".raw" || dir_itr_gdf->path().extension() == ".sep" ) {
+				remove( dir_itr_gdf->path() );
+			}
+
+		}
+
+}
