diff -ru DBIx-Class-Schema-Loader.old/blib/lib/DBIx/Class/Schema/Loader/Base.pm DBIx-Class-Schema-Loader/blib/lib/DBIx/Class/Schema/Loader/Base.pm
--- DBIx-Class-Schema-Loader.old/blib/lib/DBIx/Class/Schema/Loader/Base.pm	2011-05-25 06:14:57.000000000 -0700
+++ DBIx-Class-Schema-Loader/blib/lib/DBIx/Class/Schema/Loader/Base.pm	2011-05-25 10:32:09.000000000 -0700
@@ -87,6 +87,7 @@
                                 preserve_case
                                 col_collision_map
                                 rel_collision_map
+                                relationship_name_map
                                 real_dump_directory
                                 result_component_map
                                 datetime_undef_if_invalid
@@ -327,6 +328,43 @@
       column_info     => hashref of column info (data_type, is_nullable, etc),
     }
 
+=head2 relationship_name_map
+
+Similar in idea to moniker_map, but different in the details.  It can be
+a hashref or a code ref.
+
+If it is a hashref, keys can be either the default relationship name, or the
+moniker.  The keys that are the default relationship name should map to the
+name of the key.  Keys that are monikers should map to hashes mapping
+relationship names to their translation.  You can do both at once, and the
+more specific moniker version will be picked up first.  So, for instance,
+you could have
+
+    {
+        bar => "baz",
+        Foo => {
+            bar => "blat",
+        },
+    }
+
+and relationships that would have been named C<bar> will now be named C<baz>
+except that in the table whose moniker is C<Foo> it will be named C<blat>.
+
+If it is a coderef, the arguments passed will be
+
+    name of the DBIC class we are building,
+    default relationship name that DBICSL would ordinarily give this column,
+    {
+        name         => default relationship name,
+        type         => the relationship type eg: C<has_many>,
+        this_moniker => name of the DBIC class we are building,
+        this_columns => columns in this table in the relationship,
+        that_moniker => name of the DBIC class we are related to,
+        that_columns => columns in the other table in the relationship,
+    }
+
+DBICSL will try to use the value returned as the relationship name.
+
 =head2 inflect_plural
 
 Just like L</moniker_map> above (can be hash/code-ref, falls back to default
@@ -1703,8 +1741,7 @@
     }
 }
 
-# use the same logic to run moniker_map, col_accessor_map, and
-# relationship_name_map
+# use the same logic to run moniker_map and col_accessor_map
 sub _run_user_map {
     my ( $self, $map, $default_code, $ident, @extra ) = @_;
 
diff -ru DBIx-Class-Schema-Loader.old/blib/lib/DBIx/Class/Schema/Loader/RelBuilder.pm DBIx-Class-Schema-Loader/blib/lib/DBIx/Class/Schema/Loader/RelBuilder.pm
--- DBIx-Class-Schema-Loader.old/blib/lib/DBIx/Class/Schema/Loader/RelBuilder.pm	2011-05-25 06:14:57.000000000 -0700
+++ DBIx-Class-Schema-Loader/blib/lib/DBIx/Class/Schema/Loader/RelBuilder.pm	2011-05-25 10:33:56.000000000 -0700
@@ -89,6 +89,7 @@
     inflect_singular
     relationship_attrs
     rel_collision_map
+    relationship_name_map
     _temp_classes
 /);
 
@@ -105,13 +106,14 @@
     # are better documented in L<DBIx::Class::Schema::Loader::Base>.
 
     my $self = {
-        base               => $base,
-        schema             => $base->schema,
-        inflect_plural     => $base->inflect_plural,
-        inflect_singular   => $base->inflect_singular,
-        relationship_attrs => $base->relationship_attrs,
-        rel_collision_map  => $base->rel_collision_map,
-        _temp_classes      => [],
+        base                   => $base,
+        schema                 => $base->schema,
+        inflect_plural         => $base->inflect_plural,
+        inflect_singular       => $base->inflect_singular,
+        relationship_attrs     => $base->relationship_attrs,
+        rel_collision_map      => $base->rel_collision_map,
+        relationship_name_map  => $base->relationship_name_map,
+        _temp_classes          => [],
     };
 
     weaken $self->{base}; #< don't leak
@@ -460,7 +462,57 @@
         }
     }
 
-    return ( $local_relname, $remote_relname, $remote_method );
+    # And let the user remap these names
+    my $local_info = {
+        name         => $local_relname,
+        type         => $remote_method,
+        this_moniker => $remote_moniker,
+        that_moniker => $local_moniker,
+        this_columns => $rel->{remote_columns},
+        that_columns => $rel->{local_columns},
+    };
+
+    my $remote_info = {
+        name         => $remote_relname,
+        type         => 'belongs_to',
+        this_moniker => $local_moniker,
+        that_moniker => $remote_moniker,
+        this_columns => $rel->{local_columns},
+        that_columns => $rel->{remote_columns},
+    };
+
+    my $map = $self->relationship_name_map;
+    if (not defined($map)) {
+        # We don't try to map the map.
+    }
+    elsif ('HASH' eq ref($map)) {
+        for my $info ($local_info, $remote_info) {
+            my $name = $info->{name};
+            my $type = $info->{type};
+            if ($map->{$type} and 'HASH' eq ref($map->{$type})
+                and $map->{$type}{$name}
+            ) {
+                $info->{name} = $map->{$type}{$name};
+            }
+            elsif ($map->{$name} and not 'HASH' eq ref($map->{$name})) {
+                $info->{name} = $map->{$name};
+            }
+        }
+    }
+    elsif ('CODE' eq ref($map)) {
+        for my $info ($local_info, $remote_info) {
+            $info->{name} = $map->(@$info{'this_moniker', 'name'}, $info);
+        }
+    }
+    else {
+        warn <<"EOF";
+Skipping relationship_name_map '$map' because it is not a hashref or coderef.
+See "relationship_name_map" in perldoc DBIx::Class::Schema::Loader::Base
+for the correct usage.
+EOF
+    }
+
+    return ( $local_info->{name}, $remote_info->{name}, $remote_method );
 }
 
 sub cleanup {
diff -ru DBIx-Class-Schema-Loader.old/lib/DBIx/Class/Schema/Loader/Base.pm DBIx-Class-Schema-Loader/lib/DBIx/Class/Schema/Loader/Base.pm
--- DBIx-Class-Schema-Loader.old/lib/DBIx/Class/Schema/Loader/Base.pm	2011-05-25 06:14:57.000000000 -0700
+++ DBIx-Class-Schema-Loader/lib/DBIx/Class/Schema/Loader/Base.pm	2011-05-25 11:16:49.000000000 -0700
@@ -87,6 +87,7 @@
                                 preserve_case
                                 col_collision_map
                                 rel_collision_map
+                                relationship_name_map
                                 real_dump_directory
                                 result_component_map
                                 datetime_undef_if_invalid
@@ -327,6 +328,43 @@
       column_info     => hashref of column info (data_type, is_nullable, etc),
     }
 
+=head2 relationship_name_map
+
+Similar in idea to moniker_map, but different in the details.  It can be
+a hashref or a code ref.
+
+If it is a hashref, keys can be either the default relationship name, or the
+moniker.  The keys that are the default relationship name should map to the
+name of the key.  Keys that are monikers should map to hashes mapping
+relationship names to their translation.  You can do both at once, and the
+more specific moniker version will be picked up first.  So, for instance,
+you could have
+
+    {
+        bar => "baz",
+        Foo => {
+            bar => "blat",
+        },
+    }
+
+and relationships that would have been named C<bar> will now be named C<baz>
+except that in the table whose moniker is C<Foo> it will be named C<blat>.
+
+If it is a coderef, the arguments passed will be
+
+    name of the DBIC class we are building,
+    default relationship name that DBICSL would ordinarily give this column,
+    {
+        name         => default relationship name,
+        type         => the relationship type eg: C<has_many>,
+        this_moniker => name of the DBIC class we are building,
+        this_columns => columns in this table in the relationship,
+        that_moniker => name of the DBIC class we are related to,
+        that_columns => columns in the other table in the relationship,
+    }
+
+DBICSL will try to use the value returned as the relationship name.
+
 =head2 inflect_plural
 
 Just like L</moniker_map> above (can be hash/code-ref, falls back to default
@@ -1703,8 +1741,7 @@
     }
 }
 
-# use the same logic to run moniker_map, col_accessor_map, and
-# relationship_name_map
+# use the same logic to run moniker_map and col_accessor_map
 sub _run_user_map {
     my ( $self, $map, $default_code, $ident, @extra ) = @_;
 
diff -ru DBIx-Class-Schema-Loader.old/lib/DBIx/Class/Schema/Loader/RelBuilder.pm DBIx-Class-Schema-Loader/lib/DBIx/Class/Schema/Loader/RelBuilder.pm
--- DBIx-Class-Schema-Loader.old/lib/DBIx/Class/Schema/Loader/RelBuilder.pm	2011-05-25 06:14:57.000000000 -0700
+++ DBIx-Class-Schema-Loader/lib/DBIx/Class/Schema/Loader/RelBuilder.pm	2011-05-25 11:16:59.000000000 -0700
@@ -89,6 +89,7 @@
     inflect_singular
     relationship_attrs
     rel_collision_map
+    relationship_name_map
     _temp_classes
 /);
 
@@ -105,13 +106,14 @@
     # are better documented in L<DBIx::Class::Schema::Loader::Base>.
 
     my $self = {
-        base               => $base,
-        schema             => $base->schema,
-        inflect_plural     => $base->inflect_plural,
-        inflect_singular   => $base->inflect_singular,
-        relationship_attrs => $base->relationship_attrs,
-        rel_collision_map  => $base->rel_collision_map,
-        _temp_classes      => [],
+        base                   => $base,
+        schema                 => $base->schema,
+        inflect_plural         => $base->inflect_plural,
+        inflect_singular       => $base->inflect_singular,
+        relationship_attrs     => $base->relationship_attrs,
+        rel_collision_map      => $base->rel_collision_map,
+        relationship_name_map  => $base->relationship_name_map,
+        _temp_classes          => [],
     };
 
     weaken $self->{base}; #< don't leak
@@ -460,7 +462,57 @@
         }
     }
 
-    return ( $local_relname, $remote_relname, $remote_method );
+    # And let the user remap these names
+    my $local_info = {
+        name         => $local_relname,
+        type         => $remote_method,
+        this_moniker => $remote_moniker,
+        that_moniker => $local_moniker,
+        this_columns => $rel->{remote_columns},
+        that_columns => $rel->{local_columns},
+    };
+
+    my $remote_info = {
+        name         => $remote_relname,
+        type         => 'belongs_to',
+        this_moniker => $local_moniker,
+        that_moniker => $remote_moniker,
+        this_columns => $rel->{local_columns},
+        that_columns => $rel->{remote_columns},
+    };
+
+    my $map = $self->relationship_name_map;
+    if (not defined($map)) {
+        # With no map we have nothing to do.
+    }
+    elsif ('HASH' eq ref($map)) {
+        for my $info ($local_info, $remote_info) {
+            my $name = $info->{name};
+            my $moniker = $info->{this_moniker};
+            if ($map->{$moniker} and 'HASH' eq ref($map->{$moniker})
+                and $map->{$moniker}{$name}
+            ) {
+                $info->{name} = $map->{$moniker}{$name};
+            }
+            elsif ($map->{$name} and not 'HASH' eq ref($map->{$name})) {
+                $info->{name} = $map->{$name};
+            }
+        }
+    }
+    elsif ('CODE' eq ref($map)) {
+        for my $info ($local_info, $remote_info) {
+            $info->{name} = $map->(@$info{'this_moniker', 'name'}, $info);
+        }
+    }
+    else {
+        warn <<"EOF";
+Skipping relationship_name_map '$map' because it is not a hashref or coderef.
+See "relationship_name_map" in perldoc DBIx::Class::Schema::Loader::Base
+for the correct usage.
+EOF
+    }
+
+    return ( $local_info->{name}, $remote_info->{name}, $remote_method );
 }
 
 sub cleanup {
diff -ru DBIx-Class-Schema-Loader.old/t/45relationships.t DBIx-Class-Schema-Loader/t/45relationships.t
--- DBIx-Class-Schema-Loader.old/t/45relationships.t	2011-05-25 06:14:57.000000000 -0700
+++ DBIx-Class-Schema-Loader/t/45relationships.t	2011-05-25 11:16:24.000000000 -0700
@@ -1,5 +1,5 @@
 use strict;
-use Test::More tests => 6;
+use Test::More tests => 14;
 use Test::Exception;
 use lib qw(t/lib);
 use make_dbictest_db;
@@ -16,6 +16,79 @@
     'skip_relationships blocks generation of fooref rel',
   );
 
+# test hashref as relationship_name_map
+my $hash_relationship = schema_with(
+    relationship_name_map => {
+        fooref => "got_fooref",
+        bars   => "ignored",
+        Foo    => {
+            bars => "got_bars",
+            fooref => "ignored",
+        },
+    }
+);
+is( ref($hash_relationship->source('Foo')->relationship_info('got_bars')),
+    'HASH',
+    'single level hash in relationship_name_map picked up correctly'
+  );
+is( ref($hash_relationship->source('Bar')->relationship_info('got_fooref')),
+    'HASH',
+    'double level hash in relationship_name_map picked up correctly'
+  );
+
+# test coderef as relationship_name_map
+my $code_relationship = schema_with(
+    relationship_name_map => sub {
+        my ($moniker, $name, $args) = @_;
+
+        if ($moniker eq 'Foo') {
+            is ($name, 'bars', 'correct second argument for Foo passed');
+            is_deeply(
+                $args,
+                {
+		    name         => 'bars',
+		    type         => 'has_many',
+		    this_moniker => 'Foo',
+		    this_columns => ['fooid'],
+		    that_moniker => 'Bar',
+		    that_columns => ['fooref'],
+		},
+		'correct args for Foo passed'
+              );
+	    return 'bars_caught';
+        }
+	elsif ($moniker = 'Bar') {
+            is ($name, 'fooref', 'correct second argument for Bar passed');
+            is_deeply(
+                $args,
+                {
+		    name         => 'fooref',
+		    type         => 'belongs_to',
+		    this_moniker => 'Bar',
+		    this_columns => ['fooref'],
+		    that_moniker => 'Foo',
+		    that_columns => ['fooid'],
+		},
+		'correct args for Foo passed'
+              );
+	
+            return 'fooref_caught';
+	}
+	else {
+	    die "Bad moniker '$moniker'";
+	}
+    }
+  );
+is( ref($code_relationship->source('Foo')->relationship_info('bars_caught')),
+    'HASH',
+    'relationship_name_map overrode local_info correctly'
+  );
+is( ref($code_relationship->source('Bar')->relationship_info('fooref_caught')),
+    'HASH',
+    'relationship_name_map overrode remote_info correctly'
+  );
+
+
 
 # test relationship_attrs
 throws_ok {
