Index: Slim/Music/Import.pm
===================================================================
--- Slim/Music/Import.pm	(revision 21163)
+++ Slim/Music/Import.pm	(working copy)
@@ -102,18 +102,6 @@
 		$args->{"logdir=$::logdir"} = 1;
 	}
 
-	# Add in the various importer flags
-	# TODO: rework to only access prefs IF Importer is active
-	for my $importer (qw(iTunes MusicIP)) {
-		my $prefs = preferences("plugin.".lc($importer));
-
-		# TODO: one day we'll have to fully rename MusicMagic to MusicIP...
-		if (Slim::Utils::PluginManager->isEnabled("Slim::Plugin::" . ($importer eq 'MusicIP' ? 'MusicMagic' : $importer) . "::Plugin") && $prefs->get(lc($importer))) {
-
-			$args->{lc($importer)} = 1;
-		}
-	}
-
 	# Set scanner priority.  Use the current server priority unless 
 	# scannerPriority has been specified.
 
@@ -326,7 +314,7 @@
 	}
 
 	# Check Import scanners
-	for my $importer (keys %Importers) {
+	for my $importer (_getSorteredImporters()) {
 
 		# Don't rescan the music folder again.
 		if ($importer eq $folderScanClass) {
@@ -342,6 +330,11 @@
 			next;
 		}
 
+		# Skip post scanning importers
+		if ($Importers{$importer}->{'postScan'}) {
+			next;
+		}
+
 		$class->runImporter($importer);
 	}
 
@@ -350,6 +343,23 @@
 	return 1;
 }
 
+sub _getSorteredImporters {
+	my @keys = @_ || keys %Importers;
+
+	return sort { 
+		if(exists $Importers{$a}->{'weight'} && exists $Importers{$b}->{'weight'}) {
+			return $Importers{$a}->{'weight'} <=> $Importers{$b}->{'weight'};
+		}elsif(exists $Importers{$a}->{'weight'}) {
+			return $Importers{$a}->{'weight'} <=> 50;
+		}elsif(exists $Importers{$b}->{'weight'}) {
+			return 50 <=> $Importers{$b}->{'weight'};
+		}else {
+			return 0;
+		}
+	} @keys;
+}
+
+
 =head2 runScanPostProcessing( )
 
 This is called by the scanner.pl helper program.
@@ -377,6 +387,21 @@
 
 	Slim::Music::Artwork->findArtwork;
 
+	# Check post scan Importers
+	for my $importer (_getSorteredImporters()) {
+
+		# Only run importers that implement post scanning functions.
+		if (!$Importers{$importer}->{'postScan'}) {
+
+			$log->debug("Skipping [$importer] - it doesn't implement post scanning!");
+
+			next;
+		}
+
+		$class->runImporter($importer);
+	}
+
+
 	# Remove and dangling references.
 	if ($class->cleanupDatabase) {
 
Index: Slim/Plugin/MusicMagic/install.xml
===================================================================
--- Slim/Plugin/MusicMagic/install.xml	(revision 21163)
+++ Slim/Plugin/MusicMagic/install.xml	(working copy)
@@ -4,6 +4,7 @@
 	<id>2A25E5C4-036E-493F-890C-2BFC07944110</id>
 	<name>MUSICMAGIC</name>
 	<module>Slim::Plugin::MusicMagic::Plugin</module>
+	<importmodule>Slim::Plugin::MusicMagic::Importer</importmodule>
 	<version>1.0</version>
 	<description>MUSICMAGIC_DESC</description>
 	<creator>Slim Devices/Logitech</creator>
Index: Slim/Plugin/iTunes/install.xml
===================================================================
--- Slim/Plugin/iTunes/install.xml	(revision 21163)
+++ Slim/Plugin/iTunes/install.xml	(working copy)
@@ -4,6 +4,7 @@
 	<id>2A25E5C4-036E-493F-890C-2BFC07944110</id>
         <name>ITUNES</name>
         <module>Slim::Plugin::iTunes::Plugin</module>
+        <importmodule>Slim::Plugin::iTunes::Importer</importmodule>
         <version>1.0</version>
         <description>ITUNES_DESC</description>
         <creator>Slim Devices/Logitech</creator>
Index: Slim/Utils/PluginManager.pm
===================================================================
--- Slim/Utils/PluginManager.pm	(revision 21163)
+++ Slim/Utils/PluginManager.pm	(working copy)
@@ -65,7 +65,10 @@
 
 sub init {
 	my $class = shift;
-	
+	my $moduleType = shift || '';
+	my $useCache = shift;
+	$useCache = 1 if !defined($useCache);
+
 	# Bug 6196, Delay PAR loading to init phase so any temp directories
 	# are created as the proper user
 	require PAR;
@@ -79,7 +82,7 @@
 
 		$cacheInvalid = 'plugins states are not defined';
 
-	} elsif ( -r $class->pluginCacheFile ) {
+	} elsif ( -r $class->pluginCacheFile && $useCache) {
 		
 		$class->loadPluginCache;
 
@@ -109,7 +112,7 @@
 
 		$log->warn("Reparsing plugin manifests - $cacheInvalid");
 
-		$class->readInstallManifests($manifestFiles);
+		$class->readInstallManifests($manifestFiles, $moduleType);
 
 	} else {
 
@@ -118,7 +121,7 @@
 		$class->runPendingOperations;
 	}
 
-	$class->enablePlugins;
+	$class->enablePlugins($moduleType);
 
 	$cacheInfo = {
 		'version' => CACHE_VERSION,
@@ -127,7 +130,9 @@
 		'mtimesum'=> $sum,
 	};
 
-	$class->writePluginCache;
+	if($useCache) {
+		$class->writePluginCache;
+	}
 }
 
 sub pluginCacheFile {
@@ -200,12 +205,13 @@
 sub readInstallManifests {
 	my $class = shift;
 	my $files = shift;
+	my $moduleType = shift;
 
 	$plugins = {};
 
 	for my $file (@{$files}) {
 
-		my ($pluginName, $installManifest) = $class->_parseInstallManifest($file);
+		my ($pluginName, $installManifest) = $class->_parseInstallManifest($file,$moduleType);
 
 		if (!defined $pluginName) {
 
@@ -223,6 +229,7 @@
 sub _parseInstallManifest {
 	my $class = shift;
 	my $file  = shift;
+	my $moduleType = shift;
 
 	my $installManifest = eval { XMLin($file) };
 
@@ -233,7 +240,7 @@
 		return undef;
 	}
 
-	my $pluginName = $installManifest->{'module'};
+	my $pluginName = $installManifest->{$moduleType.'module'};
 
 	$installManifest->{'basedir'} = dirname($file);
 
@@ -243,6 +250,9 @@
 
 		return ($file, $installManifest);
 	}
+	elsif (!defined $pluginName) {
+		return (undef,$installManifest);
+	}
 
 	if (!$class->checkPluginVersion($installManifest)) {
 
@@ -347,7 +357,7 @@
 	my $max = $manifest->{'targetApplication'}->{'maxVersion'};
 
 	# Didn't match the version? Next..
-	if (!Slim::Utils::Versions->checkVersion($::VERSION, $min, $max)) {
+	if ($::VERSION && !Slim::Utils::Versions->checkVersion($::VERSION, $min, $max)) {
 
 		return 0;
 	}
@@ -357,6 +367,7 @@
 
 sub enablePlugins {
 	my $class = shift;
+	my $moduleType = shift || '';
 
 	my @incDirs = ();
 	my @loaded  = ();
@@ -366,7 +377,7 @@
 		my $manifest = $plugins->{$name};
 
 		# Skip plugins with no perl module.
-		next unless $manifest->{'module'};
+		next unless $manifest->{$moduleType.'module'};
 
 		# Skip plugins that can't be loaded.
 		if ($manifest->{'error'} ne 'INSTALLERROR_SUCCESS') {
@@ -394,7 +405,7 @@
 		$log->info("Enabling plugin: [$name]");
 
 		my $baseDir    = $manifest->{'basedir'};
-		my $module     = $manifest->{'module'};
+		my $module     = $manifest->{$moduleType.'module'};
 		my $loadModule = 0;
 
 		# Look for a lib dir that has a PAR file or otherwise.
@@ -450,10 +461,10 @@
 			}
 		}
 
-		# Add any available HTML to TT's INCLUDE_PATH
+		# Add any available HTML to TT's INCLUDE_PATH if Slim::Web::HTTP is loaded
 		my $htmlDir = catdir($baseDir, 'HTML');
 
-		if (-d $htmlDir) {
+		if (-d $htmlDir && Slim::Web::HTTP->can('addTemplateDirectory')) {
 
 			$log->debug("Adding HTML directory: [$htmlDir]");
 
Index: scanner.pl
===================================================================
--- scanner.pl	(revision 21163)
+++ scanner.pl	(working copy)
@@ -53,9 +53,10 @@
 use Slim::Utils::Strings qw(string);
 use Slim::Control::Request;
 
+
 sub main {
 
-	our ($rescan, $playlists, $wipe, $itunes, $musicip, $force, $cleanup, $prefsFile, $progress, $priority);
+	our ($rescan, $playlists, $wipe, $force, $cleanup, $prefsFile, $progress, $priority);
 	our ($quiet, $logfile, $logdir, $logconf, $debug, $help);
 
 	our $LogTimestamp = 1;
@@ -71,9 +72,6 @@
 		'rescan'       => \$rescan,
 		'wipe'         => \$wipe,
 		'playlists'    => \$playlists,
-		'itunes'       => \$itunes,
-		'musicip'      => \$musicip,
-		'musicmagic'   => \$musicmagic,
 		'prefsfile=s'  => \$prefsFile,
 		# prefsdir parsed by Slim::Utils::Prefs
 		'progress'     => \$progress,
@@ -87,10 +85,6 @@
 		'help'         => \$help,
 	);
 
-	if (defined $musicmagic && !defined $musicip) {
-		$musicip = $musicmagic;
-	}
-
 	Slim::Utils::Log->init({
 		'logconf' => $logconf,
 		'logdir'  => $logdir,
@@ -99,7 +93,7 @@
 		'debug'   => $debug,
 	});
 
-	if ($help || (!$rescan && !$wipe && !$playlists && !$musicip && !$itunes && !scalar @ARGV)) {
+	if ($help || (!$rescan && !$wipe && !$playlists && !scalar @ARGV)) {
 		usage();
 		exit;
 	}
@@ -142,15 +136,8 @@
 		Slim::Music::MusicFolderScan->init;
 	}
 
-	# Various importers - should these be hardcoded?
-	if ($itunes) {
-		initClass('Slim::Plugin::iTunes::Importer');
-	}
+	Slim::Utils::PluginManager->init('import',0);
 
-	if ($musicip) {
-		initClass('Slim::Plugin::MusicMagic::Importer');
-	}
-
 	#checkDataSource();
 
 	$log->info("SqueezeCenter done init...\n");
@@ -207,7 +194,6 @@
 			if ($wipe) {
 				Slim::Music::Import->resetImporters;
 			}
-
 			Slim::Music::Import->runScan;
 		};
 	}
@@ -288,7 +274,7 @@
 
 sub usage {
 	print <<EOF;
-Usage: $0 [debug options] [--rescan] [--wipe] [--itunes] [--musicip] <path or URL>
+Usage: $0 [debug options] [--rescan] [--wipe] <path or URL>
 
 Command line options:
 
@@ -297,8 +283,6 @@
 	--rescan       Look for new files since the last scan.
 	--wipe         Wipe the DB and start from scratch
 	--playlists    Only scan files in your playlistdir.
-	--itunes       Run the iTunes Importer.
-	--musicip      Run the MusicIP Importer.
 	--progress     Show a progress bar of the scan.
 	--prefsdir     Specify alternative preferences directory.
 	--priority     set process priority from -20 (high) to 20 (low)
@@ -318,18 +302,6 @@
 
 }
 
-sub initClass {
-	my $class = shift;
-
-	Slim::bootstrap::tryModuleLoad($class);
-
-	if ($@) {
-		logError("Couldn't load $class: $@");
-	} else {
-		$class->initPlugin;
-	}
-}
-
 sub cleanup {
 
 	# Make sure to flush anything in the database to disk.