diff --git a/Changelog b/Changelog
index aa604e6dd31e4d3463cf07306b589be99019c093..0d18b7e250beec7d43b26907cdcda3029facc473 100644
--- a/Changelog
+++ b/Changelog
@@ -1,3 +1,9 @@
+Travel::Routing::DE::VRR 2.21 - Sat Jul 22 2023
+
+    * Add service VRR3
+    * Update service URLs for VVO, VRN
+    * Remove discontinued services SVV, TLEM, VBL, Verbundlinie, VOR
+
 Travel::Routing::DE::VRR 2.20 - Fri Mar 26 2021
 
     * EFA/Route/Part: Add occupancy accessor
diff --git a/bin/efa b/bin/efa
index ec9d69572fd6764eccf7e23ccab6af09aacb7647..a92cec789aad7dca5b2e27f9765ae1f34173fa00 100755
--- a/bin/efa
+++ b/bin/efa
@@ -14,7 +14,7 @@ use Exception::Class;
 use Getopt::Long qw/:config no_ignore_case/;
 use List::Util qw(first);
 
-our $VERSION = '2.20';
+our $VERSION = '2.21';
 my $ignore_info;
 my $efa;
 my $efa_url = 'http://efa.vrr.de/vrr/XSLT_TRIP_REQUEST2';
@@ -472,7 +472,7 @@ efa - Command line client for EFA-based public transit routing services
 
 =head1 VERSION
 
-version 2.20
+version 2.21
 
 =head1 DESCRIPTION
 
diff --git a/lib/Travel/Routing/DE/EFA.pm b/lib/Travel/Routing/DE/EFA.pm
index a64129b9fa04a7d9d12c412f89badd1bb1bc3db3..b13545a41c650baa92a2bc982d88ad71977c9167 100644
--- a/lib/Travel/Routing/DE/EFA.pm
+++ b/lib/Travel/Routing/DE/EFA.pm
@@ -42,7 +42,7 @@ use Exception::Class (
 	},
 );
 
-our $VERSION = '2.20';
+our $VERSION = '2.21';
 
 sub set_time {
 	my ( $self, %conf ) = @_;
@@ -981,7 +981,7 @@ Travel::Routing::DE::EFA - unofficial interface to EFA-based itinerary services
 
 =head1 VERSION
 
-version 2.20
+version 2.21
 
 =head1 DESCRIPTION
 
@@ -1252,7 +1252,7 @@ None known.
 
 =head1 AUTHOR
 
-Copyright (C) 2009-2021 by Birte Kristina Friesel E<lt>derf@finalrewind.orgE<gt>
+Copyright (C) 2009-2023 by Birte Kristina Friesel E<lt>derf@finalrewind.orgE<gt>
 
 =head1 LICENSE
 
diff --git a/lib/Travel/Routing/DE/EFA/Route.pm b/lib/Travel/Routing/DE/EFA/Route.pm
index 078878ca193ee0dd09d2968acac64ae34afaf2d8..856d16040170632c26ef8ae880f64a8f754e4aea 100644
--- a/lib/Travel/Routing/DE/EFA/Route.pm
+++ b/lib/Travel/Routing/DE/EFA/Route.pm
@@ -8,7 +8,7 @@ use parent 'Class::Accessor';
 
 use Travel::Routing::DE::EFA::Route::Part;
 
-our $VERSION = '2.20';
+our $VERSION = '2.21';
 
 Travel::Routing::DE::EFA::Route->mk_ro_accessors(
 	qw(duration ticket_text ticket_type fare_adult fare_child vehicle_time));
@@ -52,7 +52,7 @@ Travel::Routing::DE::EFA::Route - Single route (connection) between two points
 
 =head1 VERSION
 
-version 2.20
+version 2.21
 
 =head1 DESCRIPTION
 
diff --git a/lib/Travel/Routing/DE/EFA/Route/Message.pm b/lib/Travel/Routing/DE/EFA/Route/Message.pm
index f1b887eea60684c22ebe8c72348595aca8a10809..e03fa26ec9fe1089f0017d3d3561dbd3030ce6f2 100644
--- a/lib/Travel/Routing/DE/EFA/Route/Message.pm
+++ b/lib/Travel/Routing/DE/EFA/Route/Message.pm
@@ -6,7 +6,7 @@ use 5.010;
 
 use parent 'Class::Accessor';
 
-our $VERSION = '2.20';
+our $VERSION = '2.21';
 
 Travel::Routing::DE::EFA::Route::Message->mk_ro_accessors(
 	qw(is_detailed summary subject subtitle raw_content));
@@ -58,7 +58,7 @@ route or route part.
 
 =head1 VERSION
 
-version 2.20
+version 2.21
 
 =head1 DESCRIPTION
 
diff --git a/lib/Travel/Routing/DE/EFA/Route/Part.pm b/lib/Travel/Routing/DE/EFA/Route/Part.pm
index 88ec4ecbe1743a544b513555d3252b59213ffb44..5d6cb99b781eedfaaa5883b03d12cc09304f5ef1 100644
--- a/lib/Travel/Routing/DE/EFA/Route/Part.pm
+++ b/lib/Travel/Routing/DE/EFA/Route/Part.pm
@@ -6,7 +6,7 @@ use 5.010;
 
 use parent 'Class::Accessor';
 
-our $VERSION = '2.20';
+our $VERSION = '2.21';
 
 my %occupancy = (
 	MANY_SEATS    => 1,
@@ -168,7 +168,7 @@ points, without interchanges
 
 =head1 VERSION
 
-version 2.20
+version 2.21
 
 =head1 DESCRIPTION
 
diff --git a/lib/Travel/Routing/DE/VRR.pm b/lib/Travel/Routing/DE/VRR.pm
index bf08c68122bf9ba5fd491a384e09bc35e643f3ad..e13522ff6096c5ef3bc8b30fbe8e3504676f5539 100644
--- a/lib/Travel/Routing/DE/VRR.pm
+++ b/lib/Travel/Routing/DE/VRR.pm
@@ -6,7 +6,7 @@ use 5.010;
 
 no if $] >= 5.018, warnings => "experimental::smartmatch";
 
-our $VERSION = '2.20';
+our $VERSION = '2.21';
 
 use parent 'Travel::Routing::DE::EFA';
 
@@ -49,7 +49,7 @@ Travel::Routing::DE::VRR - unofficial interface to the efa.vrr.de German itinera
 
 =head1 VERSION
 
-version 2.20
+version 2.21
 
 =head1 DESCRIPTION