]);
 }
 
-foreach my $src (<$SELF/data/news/*.rrd>) {
+our %news_name_map;
+
+if (!open NM, '<', "$SELF/data/news/name-map") {
+    die unless $!==&ENOENT;
+} else {
+    while (<NM>) {
+       s/^\s*//; s/\s+$//;
+       next unless m/^[^\#]/;
+       m/^(\S+)\s+(in|out|\*)\s+(\S+)$/ or die;
+       if ($2 eq '*') {
+           $news_name_map{$1,$_}= $3 foreach qw(in out);
+       } else {
+           $news_name_map{$1,$2}= $3;
+       }
+    }
+}
+
+sub news_name_sortkey {
+    return join '.', reverse split /\./, $_[0];
+}
+
+foreach my $src (sort { news_name_sortkey($a) cmp news_name_sortkey($b) }
+                <$SELF/data/news/*.rrd>) {
     my $site= $src;
     $site =~ s,\.rrd$,, or next;
     $site =~ s,.*/,,;
     my $inout= $1;
     $site =~ s/^([-.0-9a-z]+)_//;
     my $us= $1; # all very well but we ignore it
+    my $newsite= $news_name_map{$site,$inout};
+    next if $newsite eq '-';
+    $site= $newsite if defined $newsite;
     graph_of_group("News", $site, $inout,
          {
                Slower => 1,