diff --git a/modules/Bio/EnsEMBL/Registry.pm b/modules/Bio/EnsEMBL/Registry.pm
index bac66edd34b85431c3bfaf9d19f33fba2069f09d..fc5bd7325cb01bd7249510b26bbb36cd337eb053 100644
--- a/modules/Bio/EnsEMBL/Registry.pm
+++ b/modules/Bio/EnsEMBL/Registry.pm
@@ -1436,9 +1436,6 @@ sub load_registry_from_db {
                                          -wait_timeout => $wait_timeout,
                                          -no_cache     => $no_cache );
 
-    ( my $sp = $species ) =~ s/_/ /g;
-    $self->add_alias( $species, $sp );
-
     if ($verbose) {
       printf( "Species '%s' loaded from database '%s'\n",
               $species, $coredb );
@@ -1475,9 +1472,6 @@ sub load_registry_from_db {
                                          -wait_timeout => $wait_timeout,
                                          -no_cache     => $no_cache );
 
-      ( my $sp = $species ) =~ s/_/ /g;
-      $self->add_alias( $species, $sp );
-
       if ($verbose) {
         printf( "Species '%s' (id:%d) loaded from database '%s'\n",
                 $species, $species_id, $multidb );
@@ -1503,8 +1497,6 @@ sub load_registry_from_db {
                                          -dbname       => $cdnadb,
                                          -wait_timeout => $wait_timeout,
                                          -no_cache     => $no_cache );
-    ( my $sp = $species ) =~ s/_/ /g;
-    $self->add_alias( $species, $sp );
 
     if ($verbose) {
       printf( "%s loaded\n", $cdnadb );
@@ -1527,8 +1519,6 @@ sub load_registry_from_db {
                                          -wait_timeout => $wait_timeout,
                                          -dbname       => $vegadb,
                                          -no_cache     => $no_cache );
-    ( my $sp = $species ) =~ s/_/ /g;
-    $self->add_alias( $species, $sp );
 
     if ($verbose) {
       printf( "%s loaded\n", $vegadb );
@@ -1553,8 +1543,6 @@ sub load_registry_from_db {
                                          -wait_timeout => $wait_timeout,
                                          -dbname       => $other_db,
                                          -no_cache     => $no_cache );
-    ( my $sp = $species ) =~ s/_/ /g;
-    $self->add_alias( $species, $sp );
 
     if ($verbose) {
       printf( "%s loaded\n", $other_db );
@@ -1577,8 +1565,6 @@ sub load_registry_from_db {
                                          -wait_timeout => $wait_timeout,
                                          -dbname   => $userupload_db,
                                          -no_cache => $no_cache );
-    ( my $sp = $species ) =~ s/_/ /g;
-    $self->add_alias( $species, $sp );
 
     if ($verbose) {
       printf( "%s loaded\n", $userupload_db );
@@ -1841,7 +1827,7 @@ sub load_registry_from_db {
                   searching is performed.
 
   Return type   : none
-  Exceptions    : none
+  Exceptions    : Throws if an alias is found in more than one species.
   Status        : Stable
 
 =cut
@@ -1863,12 +1849,57 @@ sub find_and_add_aliases {
     my @aliases;
     my $species = $dba->species();
 
+    # Some aliases are added programatically.
+    # 1) The "species_name"
+    # 2) The "species name"
+    # 3) The "sname" (1+last part)
+    # 4) The "snam" (1+3 letters)
+    # 5) The "spenam" (3+3 letters)
+
+    # Others are read from the meta table.
+    # 6) Any species.alias
+    # 7) The species.taxonomy_id
+    # 8) The assembly.name
+    # 9) The species.common_name (if it exists)
+
+    # Add the unaltered species name as an alias.
+    my $alias = $species;
+    push( @aliases, $alias );
+
+    # Remove the underscore from the species name and add the result as
+    # an alias.
+    $alias =~ tr [_] [ ];
+    push( @aliases, $alias );
+
+    # Add the first letter from the furst part of the species name,
+    # together with the whole second part as an alias.
+    $species =~ /^(.)[^_]*_(.*)$/;
+    $alias = $1 . $2;
+    push( @aliases, $alias );
+
+    # As above, but only use the three first letter from the second
+    # part.
+    $species =~ /^(.)[^_]*_(...).*$/;
+    $alias = $1 . $2;
+    push( @aliases, $alias );
+
+    # As above, but use three letters from first and second part.
+    $species =~ /^(...)[^_]*_(...).*$/;
+    $alias = $1 . $2;
+    push( @aliases, $alias );
+
+    # Get data from meta table:
+
     if ( defined($dbh) ) {
       my $dbname = $dba->dbc()->dbname();
       my $sth    = $dbh->prepare(
         sprintf(
           "SELECT meta_value FROM %s.meta "
-            . "WHERE meta_key = 'species.alias' "
+            . "WHERE meta_key IN ("
+            . "'species.alias', "
+            . "'species.taxonomy_id', "
+            . "'assembly.name', "
+            . "'species.common_name') "
             . "AND species_id = ?",
           $dbh->quote_identifier($dbname) ) );
 
@@ -1889,8 +1920,16 @@ sub find_and_add_aliases {
       my $meta_container = eval { $dba->get_MetaContainer() };
 
       if ( defined($meta_container) ) {
-        @aliases =
-          @{ $meta_container->list_value_by_key('species.alias') };
+        foreach my $key ( qw(
+          species.alias
+          species.taxonomy_id
+          assembly.name
+          species.common_name
+          ) )
+        {
+          push( @aliases,
+            @{ $meta_container->list_value_by_key($key) } );
+        }
       }
 
       # Need to disconnect so we do not spam the MySQL servers trying to
@@ -1903,6 +1942,12 @@ sub find_and_add_aliases {
     foreach my $alias (@aliases) {
       if ( !$class->alias_exists($alias) ) {
         $class->add_alias( $species, $alias );
+      } elsif ( $species ne $class->get_alias($alias) ) {
+        throw(
+          sprintf(
+            "Trying to add alias '%s' to species '%s', "
+              . " but it is already registrered for species '%s'\n",
+            $alias, $species, $class->get_alias($alias) ) );
       }
     }