Index: Slim/Schema.pm
===================================================================
--- Slim/Schema.pm	(revision 21488)
+++ Slim/Schema.pm	(working copy)
@@ -87,6 +87,11 @@
 	'LOCAL_RATING_STORAGE' => \&_defaultRatingImplementation,
 );
 
+my $trackPostScanners = {};
+my $contributorPostScanners = {};
+my $albumPostScanners = {};
+my $genrePostScanners = {};
+
 =head1 METHODS
 
 All methods below are class methods on L<Slim::Schema>. Please see
@@ -1539,10 +1544,115 @@
 	return $ratingImplementations{$impl}->( $track, $rating );
 }
 
+sub registerTrackPostScanner {
+	my ($self, $name, $args) = @_;
+
+	if(defined($args) && ref($args) eq 'HASH') {
+		logger('scan.import')->info("Registered track post scanner: $name");
+		$trackPostScanners->{$name} = $args;
+	}elsif(!defined($args)) {
+		logger('scan.import')->info("Unregistered track post scanner: $name");
+		delete $trackPostScanners->{$name};
+	}else {
+		logger('scan.import')->error("Argument must be a hash");
+	}
+}
+
+sub executeTrackPostScanners {
+	my ($self, $track) = @_;
+
+	$self->_executePostScanners($track,$trackPostScanners);
+}
+
+sub registerGenrePostScanner {
+	my ($self, $name, $args) = @_;
+
+	if(defined($args) && ref($args) eq 'HASH') {
+		logger('scan.import')->info("Registered genre post scanner: $name");
+		$genrePostScanners->{$name} = $args;
+	}elsif(!defined($args)) {
+		logger('scan.import')->info("Unregistered genre post scanner: $name");
+		delete $genrePostScanners->{$name};
+	}else {
+		logger('scan.import')->error("Argument must be a hash");
+	}
+}
+
+sub executeGenrePostScanners {
+	my ($self, $genre) = @_;
+
+	$self->_executePostScanners($genre,$genrePostScanners);
+}
+
+sub registerContributorPostScanner {
+	my ($self, $name, $args) = @_;
+
+	if(defined($args) && ref($args) eq 'HASH') {
+		logger('scan.import')->info("Registered contributor post scanner: $name");
+		$contributorPostScanners->{$name} = $args;
+	}elsif(!defined($args)) {
+		logger('scan.import')->info("Unregistered contributor post scanner: $name");
+		delete $contributorPostScanners->{$name};
+	}else {
+		logger('scan.import')->error("Argument must be a hash");
+	}
+}
+
+sub executeContributorPostScanners {
+	my ($self, $contributor) = @_;
+
+	$self->_executePostScanners($contributor,$contributorPostScanners);
+}
+
+sub registerAlbumPostScanner {
+	my ($self, $name, $args) = @_;
+
+	if(defined($args) && ref($args) eq 'HASH') {
+		logger('scan.import')->info("Registered album post scanner: $name");
+		$albumPostScanners->{$name} = $args;
+	}elsif(!defined($args)) {
+		logger('scan.import')->info("Unregistered album post scanner: $name");
+		delete $albumPostScanners->{$name};
+	}else {
+		logger('scan.import')->error("Argument must be a hash");
+	}
+}
+
+sub executeAlbumPostScanners {
+	my ($self, $album) = @_;
+
+	$self->_executePostScanners($album,$albumPostScanners);
+}
+
 #
 # Private methods:
 #
 
+sub _executePostScanners {
+	my ($self, $obj, $scanners) = @_;
+
+	my @sortedScanners = sort { 
+		if(exists $scanners->{$a}->{'weight'} && exists $scanners->{$b}->{'weight'}) {
+			return $scanners->{$a}->{'weight'} <=> $scanners->{$b}->{'weight'};
+		}elsif(exists $scanners->{$a}->{'weight'}) {
+			return $scanners->{$a}->{'weight'} <=> 50;
+		}elsif(exists $scanners->{$b}->{'weight'}) {
+			return 50 <=> $scanners->{$b}->{'weight'};
+		}else {
+			return 0;
+		}
+	} keys %$scanners;
+
+	for my $key (@sortedScanners) {
+		if(defined($scanners->{$key}->{'func'})) {
+			eval {$scanners->{$key}->{'func'}->($obj) };
+			if ($@) {
+				logger('scan.import')->warn("Error when scanning ".ref($obj)." with $key scanner: $@");
+			}
+		}
+	}
+}
+
 sub _defaultRatingImplementation {
 	my ( $track, $rating ) = @_;
 
@@ -2487,9 +2597,12 @@
 			}
 		}
 
+		$self->executeAlbumPostScanners($albumObj);
 		$albumObj->update;
 	}
 
+	$self->executeTrackPostScanners($track);
+
 	# Save any changes - such as album.
 	$track->update;
 
Index: Slim/Schema/Contributor.pm
===================================================================
--- Slim/Schema/Contributor.pm	(revision 21488)
+++ Slim/Schema/Contributor.pm	(working copy)
@@ -151,6 +151,8 @@
 		});
 
 		push @contributors, $contributorObj;
+
+		Slim::Schema->executeContributorPostScanners($contributorObj);
 	}
 
 	return wantarray ? @contributors : $contributors[0];
Index: Slim/Schema/Genre.pm
===================================================================
--- Slim/Schema/Genre.pm	(revision 21488)
+++ Slim/Schema/Genre.pm	(working copy)
@@ -86,6 +86,8 @@
 		});
 
 		push @genres, $genreObj;
+
+		Slim::Schema->executeGenrePostScanners($genreObj);
 	}
 
 	return wantarray ? @genres : $genres[0];