diff --git a/Build.PL b/Build.PL
index d3a7e1cce90dd7ad8ca0798d3064fe143ff4e72a..dfb4a93a7a0fc0bb688469de91332fd90e307972 100644
--- a/Build.PL
+++ b/Build.PL
@@ -10,7 +10,6 @@ my %opts = (
 		'Test::Compile' => 0,
 		'Test::Pod' => 0,
 		'Test::Command' => 0,
-		'Test::Synopsis' => 0,
 	},
 	module_name => 'Net::Travel::DE::VRR',
 	license => 'unrestricted',
diff --git a/bin/efa b/bin/efa
index f257532bc3fdc0405d3b0dfebf809a7177ad48b9..dcfca1229875503aae179b72bf4ee7e056dbbee9 100755
--- a/bin/efa
+++ b/bin/efa
@@ -115,8 +115,8 @@ for my $i ( 0 .. $#routes ) {
 		printf(
 			"%-5s ab  %-30s %-20s %s\n%-5s an  %-30s\n\n",
 			$c->get(
-				qw(dep_time dep_stop train_line train_dest arr_time
-				  arr_stop)
+				qw(departure_time departure_stop train_line
+				  train_destination arrival_time arrival_stop)
 			),
 		);
 	}
diff --git a/lib/Net/Travel/DE/VRR.pm b/lib/Net/Travel/DE/VRR.pm
index 79481944fc4cd5658f8788fac1f9ca7c27d93229..8f1b506513b9d533e8c427dc62566ffc85a98125 100644
--- a/lib/Net/Travel/DE/VRR.pm
+++ b/lib/Net/Travel/DE/VRR.pm
@@ -360,16 +360,16 @@ sub parse_pretty {
 			push( @{ $hash->{extra} }, $extra );
 		}
 
-		$hash->{dep_time} = $con->[0];
+		$hash->{departure_time} = $con->[0];
 
 		# always "ab"           $con->[1];
-		$hash->{dep_stop}   = $con->[2];
-		$hash->{train_line} = $con->[3];
-		$hash->{arr_time}   = $con->[4];
+		$hash->{departure_stop} = $con->[2];
+		$hash->{train_line}     = $con->[3];
+		$hash->{arrival_time}   = $con->[4];
 
-		# always "an"           $con->[5];
-		$hash->{arr_stop}   = $con->[6];
-		$hash->{train_dest} = $con->[7];
+		# always "an"                $con->[5];
+		$hash->{arrival_stop}      = $con->[6];
+		$hash->{train_destination} = $con->[7];
 
 		push( @elements, $hash );
 	}
@@ -605,33 +605,8 @@ returns a true value on success.
 
 =item $efa->routes()
 
-Returns an array of connection elements. Each connection element is an
-arrayref of connection part, and each connecton part is a hash containing the
-following elements:
-
-=over
-
-=item * dep_time
-
-Departure time as a string in HH:MM format
-
-=item * dep_stop
-
-Departure stop, e.g. "Essen HBf"
-
-=item * train_line
-
-Name of the train line, e.g. "S-Bahn S6"
-
-=item * arr_time
-
-Arrival time as a string in HH:MM format
-
-=item * arr_stop
-
-Arrival stop, e.g. "Berlin HBf"
-
-=back
+Returns a list of Net::Travel::DE::VRR::Route(3pm) elements. Each one contains
+one method of getting from start to stop.
 
 =back
 
diff --git a/lib/Net/Travel/DE/VRR/Route.pm b/lib/Net/Travel/DE/VRR/Route.pm
index 1b7109710b3ab885c1c5cc859e99449b360a83a4..7089120b08396cd648257ec8cb8288b069bba6bc 100644
--- a/lib/Net/Travel/DE/VRR/Route.pm
+++ b/lib/Net/Travel/DE/VRR/Route.pm
@@ -39,30 +39,57 @@ Net::Travel::DE::VRR::Route - Single route (connection) between two points
 
 =head1 SYNOPSIS
 
+	for my $route ( $efa->routes() ) {
+		for my $part ( $route->parts() ) {
+			# $part is a Net::Travel::DE::VRR::Route::Part object
+		}
+	}
+
 =head1 VERSION
 
 version 1.3
 
 =head1 DESCRIPTION
 
+Net::Travel::DE::VRR::Route describes a single method of getting from one
+point to another.  It holds a bunch of Net::Travel::DE::VRR::Route::Part(3pm)
+objects describing the parts of the route in detail.  Each part depends on the
+previous one.
+
+You usually want to acces it via C<< $efa->routes() >>.
+
 =head1 METHODS
 
 =over
 
+=item my $route = Net::Travel::DE::VRR::Route->new(I<@parts>)
+
+Creates a new Net::Travel::DE::VRR::Route elements consisting of I<parts>,
+which are Net::Travel::DE::VRR::Route::Part elements.
+
+=item $route->parts()
+
+Returns a list of Net::Travel::DE::VRR::Route::Part(3pm) elements describing
+the actual route.
+
 =back
 
 =head1 DIAGNOSTICS
 
+None.
+
 =head1 DEPENDENCIES
 
-=over
-
-=back
+None.
 
 =head1 BUGS AND LIMITATIONS
 
+None known.
+
 =head1 SEE ALSO
 
+Net::Travel::DE::VRR(3pm), Net::Travel::DE::VRR::Route::Part(3pm).
+
 =head1 AUTHOR
 
 Copyright (C) 2011 by Daniel Friesel E<lt>derf@finalrewind.orgE<gt>
diff --git a/lib/Net/Travel/DE/VRR/Route/Part.pm b/lib/Net/Travel/DE/VRR/Route/Part.pm
index d512fbbb9354c56576d5bc3529636cce04eb5f4d..a85e96cc02e518fff71578f802277d7b12d5d957 100644
--- a/lib/Net/Travel/DE/VRR/Route/Part.pm
+++ b/lib/Net/Travel/DE/VRR/Route/Part.pm
@@ -9,7 +9,9 @@ use parent 'Class::Accessor';
 our $VERSION = '1.3';
 
 Net::Travel::DE::VRR::Route::Part->mk_ro_accessors(
-	qw(arr_stop arr_time dep_stop dep_time train_line train_dest));
+	qw(arrival_stop arrival_time departure_stop departure_time train_line
+	  train_destination)
+);
 
 sub new {
 	my ( $obj, %conf ) = @_;
@@ -36,30 +38,109 @@ points, without interchanges
 
 =head1 SYNOPSIS
 
+	for my $part ( $route->parts() ) {
+
+		if ( $part->extra() ) {
+			say join( "\n", $part->extra() );
+		}
+
+		printf(
+			"%s at %s -> %s at %s, via %s to %s",
+			$part->departure_time, $part->departure_stop,
+			$part->arrival_time,   $part->arrival_stop,
+			$part->train_line,     $part->train_destination,
+		);
+	}
+
 =head1 VERSION
 
 version 0.3
 
 =head1 DESCRIPTION
 
+B<Net::Travel::DE::VRR::Route::Part> holds one specific connection (without
+interchanges) between two points.  It specifies the start/stop point and time,
+the train line and its destination, and optional additional data.
+
+It is usually obtained by a call to Net::Travel::DE::VRR::Route(3pm)'s
+B<parts> method.
+
 =head1 METHODS
 
 =over
 
+=item $part = Net::Travel::DE::VRR::Route::Part->new(I<%data>)
+
+Creates a new Net::Travel::DE::VRR::Route::Part object. I<data> consists of:
+
+=over
+
+=item B<arrival_time> => I<HH>:I<MM>
+
+Arrival time
+
+=item B<arrival_stop> => I<name>
+
+Arrival stop (city plus station / address)
+
+=item B<departure_time> => I<HH:MM>
+
+Departure time
+
+=item B<departure_stop> => I<name>
+
+Departure stop (city plus station / address)
+
+=item B<train_destination> => I<name>
+
+Destination of the train connecting the stops
+
+=item B<train_line> => I<name>
+
+The train's line name.
+
+=item B<extra> => B<[> [ I<line1>, [ I<line2> [ I<...> ] ] ] B<]>
+
+Additional information about this connection.  Array-ref of newline-terminated
+strings.
+
+=back
+
+=item $part->get(I<name>)
+
+Returns the value of I<name> (B<arrival_time>, B<arrival_stop> etc., see
+B<new>).
+
+Each of these I<names> also has an accessor. So C<< $part->departure_time() >>
+is the same as C<< $part->get('departure_time') >>.
+
+=item $part->extra()
+
+Returns a list of additional information about this route part, if provided.
+Returns an empty list otherwise.
+
 =back
 
 =head1 DIAGNOSTICS
 
+None.
+
 =head1 DEPENDENCIES
 
 =over
 
+=item * Class::Accessor(3pm)
+
 =back
 
 =head1 BUGS AND LIMITATIONS
 
+None known.
+
 =head1 SEE ALSO
 
+Net::Travel::DE::VRR(3pm).
+
 =head1 AUTHOR
 
 Copyright (C) 2011 by Daniel Friesel E<lt>derf@finalrewind.orgE<gt>
diff --git a/t/02-synopsis.t b/t/02-synopsis.t
deleted file mode 100644
index fb2b63f9b3a2b54b17b8c8f73c5ac2dd17156771..0000000000000000000000000000000000000000
--- a/t/02-synopsis.t
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/usr/bin/env perl
-use strict;
-use warnings;
-
-use Test::More;
-
-eval "use Test::Synopsis";
-
-if ($@) {
-	plan skip_all => 'Test::Synopsis required for testing';
-}
-
-all_synopsis_ok();