diff --git a/conf/manager.conf.in b/conf/manager.conf.in
index 9c4b251845f71123ad15965ab833c1a434e9ef68..f665c521fd3fb19d2860e91a9e5ec3a2218578ec 100644
--- a/conf/manager.conf.in
+++ b/conf/manager.conf.in
@@ -9,7 +9,10 @@ templates_dir = @templatesdir@
 # templates theme
 templates_theme = edugain
 accounts_file = /var/lib/access-check/accounts.php
-federations = edugain
+
+[federations]
+list = edugain
+merge = 0
 
 [edugain]
 metadata = /var/lib/access-check/edugain.xml
diff --git a/lib/AccountManager/App.pm b/lib/AccountManager/App.pm
index 0e5c05d106c2548db75475768dc2c5cf0ab52832..995a945c5e512aaf5c864d5853bbaa638528ae27 100644
--- a/lib/AccountManager/App.pm
+++ b/lib/AccountManager/App.pm
@@ -114,7 +114,7 @@ sub new {
         );
     }
 
-    if (!$self->{configuration}->{setup}->{federations}) {
+    if (!$self->{configuration}->{federations}->{list}) {
         $self->{logger}->fatal(
             "No federations defined in configuration, aborting"
         );
@@ -250,10 +250,13 @@ sub abort {
 sub req_start {
     my ($self, %args) = @_;
 
-    my $federations = $self->{configuration}->{setup}->{federations};
+    my $federations = $self->{configuration}->{federations}->{list};
     my @federations = split(/, */, $federations);
-    if (@federations == 1) {
-        $self->req_select_sp(federation => $federations[0]);
+    if (
+        @federations == 1 ||
+        $self->{configuration}->{federations}->{merge}
+    ) {
+        $self->req_select_sp();
     } else {
         $self->req_select_federation();
     }
@@ -263,7 +266,7 @@ sub req_start {
 sub req_select_federation {
     my ($self, %args) = @_;
 
-    my $federations = $self->{configuration}->{setup}->{federations};
+    my $federations = $self->{configuration}->{federations}->{list};
     my @federations = split(/, */, $federations);
     my %federations = map { $_ => $self->{configuration}->{$_}->{label} } @federations;
 
@@ -279,27 +282,36 @@ sub req_select_federation {
 sub req_select_sp {
     my ($self, %args) = @_;
 
-    my $federation = $args{federation} ||
-                     $self->get_parameter(name => 'federation');
+    my $federation  = $self->{cgi}->param('federation'); # not mandatory
 
-    my $metadata_file = $self->get_metadata_file(federation => $federation);
+    my @federations = $federation ?
+        $federation :
+        split(/, */, $self->{configuration}->{federations}->{list});
 
-    my $metadata;
-    eval {
-        $metadata = AccountManager::Metadata->new(
-            file => $metadata_file
-        );
-    };
-    $self->abort(
-        log  => "Failed to load federation metadata: $EVAL_ERROR",
-        user => "internal"
-    ) if $EVAL_ERROR;
+    my @entities;
+    foreach $federation (@federations) {
+        my $file = $self->get_metadata_file(federation => $federation);
+
+        my $metadata;
+        eval {
+            $metadata = AccountManager::Metadata->new(
+                file => $file
+            );
+        };
+        $self->abort(
+            log  => "Failed to load federation metadata: $EVAL_ERROR",
+            user => "internal"
+        ) if $EVAL_ERROR;
+
+        my $entities = $metadata->parse(type => 'sp');
+        push @entities, @$entities;
+    }
 
     $self->respond(
         template => 'select_sp.tt2.html',
         data     => {
             action     => 'select_sp',
-            metadata   => $metadata->parse(type => 'sp'),
+            entities   => \@entities,
             federation => $federation,
         }
     );
@@ -308,10 +320,8 @@ sub req_select_sp {
 sub req_select_email {
     my ($self, %args) = @_;
 
-    my $federation = $self->get_parameter(name => 'federation');
     my $entityid   = $self->get_parameter(name => 'entityid');
-
-    my $metadata_file = $self->get_metadata_file(federation => $federation);
+    my $federation = $self->{cgi}->param('federation'); # not mandatory
 
     # Create a persistent service provider object
     my $sp = AccountManager::ServiceProvider->new(
@@ -323,20 +333,29 @@ sub req_select_email {
         # already present in DB, nothing todo
     } else {
         # extract information from metadata
-        my $metadata;
-
-        eval {
-            $metadata = AccountManager::Metadata->new(
-                file => $metadata_file
-            );
-        };
-        $self->abort(
-            log  => "Failed to load federation metadata: $EVAL_ERROR",
-            user => "internal"
-        ) if $EVAL_ERROR;
-
-        my $entities = $metadata->parse(id => $entityid);
-        my $entity = $entities->[0];
+        my @federations = $federation ?
+            $federation :
+            split(/, */, $self->{configuration}->{federations}->{list});
+
+        my $entity;
+        foreach $federation (@federations) {
+            my $file = $self->get_metadata_file(federation => $federation);
+            my $metadata;
+
+            eval {
+                $metadata = AccountManager::Metadata->new(
+                    file => $file
+                );
+            };
+            $self->abort(
+                log  => "Failed to load federation metadata: $EVAL_ERROR",
+                user => "internal"
+            ) if $EVAL_ERROR;
+
+            my $entities = $metadata->parse(id => $entityid);
+            $entity = $entities->[0];
+            last if $entity;
+        }
         $self->abort(
             log  => "No such SP $entityid in metadata",
             user => "no_such_entity"
diff --git a/templates/web/edugain/select_sp.tt2.html b/templates/web/edugain/select_sp.tt2.html
index 09cc6ecd774b98dd4b99f36f3fe0b8a73fb07c6c..cdac8844da2605f9aa94ac6d2fb353c2ef325d62 100644
--- a/templates/web/edugain/select_sp.tt2.html
+++ b/templates/web/edugain/select_sp.tt2.html
@@ -20,7 +20,7 @@
             <legend for="entityid">[% lh.maketext("Type the name or entityID of service to test:") %]</legend>
             <select id="entityid" name="entityid" class="required">
                 <option value=""></option>
-            [% FOREACH entity IN metadata.sort('display_name') %]
+            [% FOREACH entity IN entities.sort('display_name') %]
                 <option value="[% entity.entityid %]">[% entity.display_name %]</option>
             [% END %]
             </select>
diff --git a/templates/web/renater/select_sp.tt2.html b/templates/web/renater/select_sp.tt2.html
index 8633dedb4af9c4a4b7eda6152402975b9a09639c..7ba07815450a2dd51d1d623588a4cdd8185d91cc 100644
--- a/templates/web/renater/select_sp.tt2.html
+++ b/templates/web/renater/select_sp.tt2.html
@@ -20,7 +20,7 @@
             <legend for="entityid">[% lh.maketext("Type the name or entityID of service to test:") %]</legend>
             <select id="entityid" name="entityid" class="required">
                 <option value=""></option>
-            [% FOREACH entity IN metadata.sort('display_name') %]
+            [% FOREACH entity IN entities.sort('display_name') %]
                 <option value="[% entity.entityid %]">[% entity.display_name %]</option>
             [% END %]
             </select>