diff --git a/lib/App/FrameUtils.pm b/lib/App/FrameUtils.pm
index 2656681ebc78a142f7a506c006f26e7ba2d13bb5..5026e6855a7a95d94b22a9301a6ecd2719a2207f 100644
--- a/lib/App/FrameUtils.pm
+++ b/lib/App/FrameUtils.pm
@@ -39,52 +39,6 @@ sub get_destination
 	->{'ekimei'};
 }
 
-sub get_patterns_at_sta
-{
-    my ($master, $rosen_id, $eki) = @_;
-    my $rosen = MasterUtils::get_rosen_frame $master, $rosen_id;
-    my $pos_down = MasterUtils::get_eki_position $master, $rosen_id, $eki;
-    my $pos_up = $rosen->{'eki_num'} - $pos_down - 1;
-    my @services_down = @{ $rosen->{'dia'}->{'kudari'} };
-    my @services_up = @{ $rosen->{'dia'}->{'nobori'} };
-    my %stopping_patterns;
-
-    foreach my $ressya (@services_down)
-    {
-	my @jikoku = @{ $ressya->{'jikoku'} };
-	my $pos = 0;
-	while ($pos != $pos_down) { shift @jikoku; $pos++; }
-	if (!defined $jikoku[0]) { next; }
-	
-	my $ts = $jikoku[0];
-	my $time = $ts->{'hatsu'};
-	# Timestamp has no dep time (only arrival time for ex)
-	if (!defined $time) { next; }
-	# This service does not stop here
-	if ($ts->{'mode'} != 1) { next; }
-
-	$stopping_patterns{$ressya->{'syubetsu'}}++;
-    }
-    foreach my $ressya (@services_up)
-    {
-	my @jikoku = @{ $ressya->{'jikoku'} };
-	my $pos = 0;
-	while ($pos != $pos_up) { shift @jikoku; $pos++; }
-	if (!defined $jikoku[0]) { next; }
-	
-	my $ts = $jikoku[0];
-	my $time = $ts->{'hatsu'};
-	# Timestamp has no dep time (only arrival time for ex)
-	if (!defined $time) { next; }
-	# This service does not stop here
-	if ($ts->{'mode'} != 1) { next; }
-
-	$stopping_patterns{$ressya->{'syubetsu'}}++;
-    }
-
-    return scalar keys %stopping_patterns;
-}
-
 sub hassya_hyou
 {
     my $master = $_[0];
diff --git a/lib/App/MasterUtils.pm b/lib/App/MasterUtils.pm
index 6fc00e272ea979d483733629a57ab3b55e82dbae..4ba65ee1f16d960767c35713b9d2c9211a8bb487 100644
--- a/lib/App/MasterUtils.pm
+++ b/lib/App/MasterUtils.pm
@@ -141,4 +141,71 @@ sub get_routes
     @res ? return @res : Log::e "$id has no routes";
 }
 
+sub get_patterns_at_sta
+{
+    my ($master, $rosen_id, $eki) = @_;
+    my $rosen = get_rosen_frame $master, $rosen_id;
+    my $pos_down = get_eki_position $master, $rosen_id, $eki;
+    my $pos_up = $rosen->{'eki_num'} - $pos_down - 1;
+    my @services_down = @{ $rosen->{'dia'}->{'kudari'} };
+    my @services_up = @{ $rosen->{'dia'}->{'nobori'} };
+    my %stopping_patterns;
+
+    foreach my $ressya (@services_down)
+    {
+	my @jikoku = @{ $ressya->{'jikoku'} };
+	my $pos = 0;
+	while ($pos != $pos_down) { shift @jikoku; $pos++; }
+	if (!defined $jikoku[0]) { next; }
+	
+	my $ts = $jikoku[0];
+	my $time = $ts->{'hatsu'};
+	# Timestamp has no dep time (only arrival time for ex)
+	if (!defined $time) { next; }
+	# This service does not stop here
+	if ($ts->{'mode'} != 1) { next; }
+
+	$stopping_patterns{$ressya->{'syubetsu'}}++;
+    }
+    foreach my $ressya (@services_up)
+    {
+	my @jikoku = @{ $ressya->{'jikoku'} };
+	my $pos = 0;
+	while ($pos != $pos_up) { shift @jikoku; $pos++; }
+	if (!defined $jikoku[0]) { next; }
+	
+	my $ts = $jikoku[0];
+	my $time = $ts->{'hatsu'};
+	# Timestamp has no dep time (only arrival time for ex)
+	if (!defined $time) { next; }
+	# This service does not stop here
+	if ($ts->{'mode'} != 1) { next; }
+
+	$stopping_patterns{$ressya->{'syubetsu'}}++;
+    }
+
+    return scalar keys %stopping_patterns;
+}
+
+sub build_metadata
+{
+    my ($master) = @_;
+    my $metadata = {};
+    foreach my $rosen (keys %{ $master->{'rosen'} })
+    {
+	my $frame = {};
+
+	# Add number of stopping patterns for each station / route
+	my $patterns = {};
+	foreach my $eki (@{ $master->{'rosen'}->{$rosen}->{'eki'} })
+	{
+	    $patterns->{$eki} = get_patterns_at_sta $master, $rosen, $eki;
+	}
+	$frame->{'stopping_patterns'} = $patterns;
+	
+	$metadata->{$rosen} = $frame;
+    }
+    $master->{'metadata'} = $metadata;
+}
+
 1;
diff --git a/lib/App/Navi.pm b/lib/App/Navi.pm
index 92e9bb467f796fbff273865f6a662db8396f35a8..b6455f57fe1397fbc136d819f2d49988f4cec1ef 100644
--- a/lib/App/Navi.pm
+++ b/lib/App/Navi.pm
@@ -194,7 +194,7 @@ sub Raptor_simple
 			# This will most likely save a lot of time on routes with a great amount of stops / services (e.g. high-frequency lines)
 			my $all_patterns = MasterUtils::get_patterns $master, $r;
 			# TODO maybe move these computations to a "metadata" frame
-			my $stopping_patterns = FrameUtils::get_patterns_at_sta $master, $r, $pi;
+			my $stopping_patterns = $master->{'metadata'}->{$r}->{$pi};
 			if ($stopping_patterns < 2 && $all_patterns >= 3)
 			{
 			    $mark = 0;
diff --git a/src/oud2_parser.pl b/src/oud2_parser.pl
index eefe008475483afc27742f98b2bc86b4b2765689..867daff4e521cfd33c08be06c3e2dd29caf68080 100644
--- a/src/oud2_parser.pl
+++ b/src/oud2_parser.pl
@@ -416,6 +416,8 @@ foreach my $frame (values %{ $master{'rosen'} })
     $frame->{'eki'} = \@new_ekis;
 }
 
+MasterUtils::build_metadata \%master;
+
 # Parse transfer times
 my $recce = Marpa::R2::Scanless::R->new(
     {
@@ -449,11 +451,11 @@ $master{'transfer_times'} = $transfers;
 
 # FrameUtils::hassya_hyou \%master, 'sekihoku1_28';
 
-my $d = MasterUtils::search_eki \%master, '石北大通';
-my $a = MasterUtils::search_eki \%master, '一区下';
+my $d = MasterUtils::search_eki \%master, '帯広';
+my $a = MasterUtils::search_eki \%master, '釧路';
 
 sub eki { return MasterUtils::search_eki \%master, $_[0]; }
 
-Navi::Raptor_simple \%master, $d, $a, 1120;
+Navi::Raptor_simple \%master, $d, $a, 525;
 
 # FrameUtils::hassya_hyou \%master, (eki '古瀬');