diff --git a/Changelog b/Changelog
index 0789911283e003600f8cd16bba5b29b3e3d1cef8..c4b095580106a23af72f206cf5c3efa994d6a858 100644
--- a/Changelog
+++ b/Changelog
@@ -1,3 +1,7 @@
+Travel::Routing::DE::VRR 2.18 - Wed Feb 26 2020
+
+    * Update KVV EFA URL
+
 Travel::Routing::DE::VRR 2.17 - Mon Apr 09 2018
 
     * Handle routes containing cancelled connections
diff --git a/bin/efa b/bin/efa
index 1af26707761d88748543f0f4c93982403623effa..cc14274c380a1c072befa46be42f901317eb08fe 100755
--- a/bin/efa
+++ b/bin/efa
@@ -16,7 +16,7 @@ use Exception::Class;
 use Getopt::Long qw/:config no_ignore_case/;
 use List::Util qw(first);
 
-our $VERSION = '2.17';
+our $VERSION = '2.18';
 my $ignore_info;
 my $efa;
 my $efa_url = 'http://efa.vrr.de/vrr/XSLT_TRIP_REQUEST2';
@@ -459,7 +459,7 @@ efa - Command line client for EFA-based public transit routing services
 
 =head1 VERSION
 
-version 2.17
+version 2.18
 
 =head1 DESCRIPTION
 
diff --git a/lib/Travel/Routing/DE/EFA.pm b/lib/Travel/Routing/DE/EFA.pm
index fcb14bd7a3610281a4afd540fc077c13d605b998..0d1bfca6fb36f2bbf35a7dce9334bede97c21a69 100644
--- a/lib/Travel/Routing/DE/EFA.pm
+++ b/lib/Travel/Routing/DE/EFA.pm
@@ -41,7 +41,7 @@ use Exception::Class (
 	},
 );
 
-our $VERSION = '2.17';
+our $VERSION = '2.18';
 
 sub set_time {
 	my ( $self, %conf ) = @_;
@@ -993,7 +993,7 @@ Travel::Routing::DE::EFA - unofficial interface to EFA-based itinerary services
 
 =head1 VERSION
 
-version 2.17
+version 2.18
 
 =head1 DESCRIPTION
 
diff --git a/lib/Travel/Routing/DE/EFA/Route.pm b/lib/Travel/Routing/DE/EFA/Route.pm
index d1d2f311ebdfca4cc5153863c3902810913f4118..2b67d113984eb86e0c92c9df532ae74973eb7c30 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.17';
+our $VERSION = '2.18';
 
 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.17
+version 2.18
 
 =head1 DESCRIPTION
 
diff --git a/lib/Travel/Routing/DE/EFA/Route/Message.pm b/lib/Travel/Routing/DE/EFA/Route/Message.pm
index 7410614390aaefdeccd209560a70a725076ffa55..db1a208261593da3e2e1f4d94a199f0acf001a5c 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.17';
+our $VERSION = '2.18';
 
 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.17
+version 2.18
 
 =head1 DESCRIPTION
 
diff --git a/lib/Travel/Routing/DE/EFA/Route/Part.pm b/lib/Travel/Routing/DE/EFA/Route/Part.pm
index 051594c44a64ed33c8889a2b1b75ca9f96d9c99e..232d502d763029ec07955b5abd1bb32a2b51a5a9 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.17';
+our $VERSION = '2.18';
 
 Travel::Routing::DE::EFA::Route::Part->mk_ro_accessors(
 	qw(arrival_platform arrival_stop
@@ -154,7 +154,7 @@ points, without interchanges
 
 =head1 VERSION
 
-version 2.17
+version 2.18
 
 =head1 DESCRIPTION
 
diff --git a/lib/Travel/Routing/DE/VRR.pm b/lib/Travel/Routing/DE/VRR.pm
index a318283ca94d49ad42b2e616396b6d6e3e7ff264..28a70cc82ecbb0dffdcffb734aac9010cafc62fd 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.17';
+our $VERSION = '2.18';
 
 use parent 'Travel::Routing::DE::EFA';
 
@@ -50,7 +50,7 @@ Travel::Routing::DE::VRR - unofficial interface to the efa.vrr.de German itinera
 
 =head1 VERSION
 
-version 2.17
+version 2.18
 
 =head1 DESCRIPTION