The M54 is Telford's very own motorway, connecting Shropshire to Wolverhampton and the West Midlands via the M6.

Unfortunately the residents of Shropshire can only visit parts of the wider world that lie to the south as the M6 interchange only has south-facing sliproads and can't be used to get to or from the north. They can't even reach the M6 Toll, a motorway that ends almost head-on with the M54, because there's no direct connection to that either. Proposals for a new road to connect the M54 to the north and east have been drawn up but continue to falter.

Traffic from the M54 is a major contributor to the traffic problems on the M6 within the West Midlands area, since it and the M5 both unburden themselves onto the road, and between their two junctions the M6 is usually unbearably busy.

The M54 was granted a westward extension in the early 1990s, continuing the route all the way to Shrewsbury, though it would be a mistake to think an extension of the same road built to the same standard and heading in the same direction would be part of the M54. Instead, it's part of the A5. Shrewsbury Town Council have declared an interest before now in having that section of the A5 reclassified as M54 so that their town is on the motorway network.

M54 junction 5 moved house not long after the motorway opened, thanks to the rapidly changing structure of Telford as the New Town was built. The current incarnation replaces a limited access half-diamond junction that was located slightly closer towards junction 4. It marked the eastern end of the original three-lane section of M54, and the point is still visible today because the road surface to the west is still wide enough for dual three-lanes. Between there and the new junction 5, the road was painted down to two lanes when the eastward extension was opened with just two lanes.

Start
Wolverhampton
End
Telford
Passes
None
Connects to
Length
23 miles
Open Junctions Section
Dec 1975 J5-7 Forge → Cluddley
Nov 1983 J0-5 Hilton Park → Forge

Exit list

Drupal\Core\Render\Markup(1)
  • contents
  • Available methods (4)
  • protected string -> string(233) " <!-- THEME DEBUG --> <!-- THEME HOOK: 'views_view_field' --> <!-- BEGIN OUTPUT …"
    
    <!-- THEME DEBUG -->
    <!-- THEME HOOK: 'views_view_field' -->
    <!-- BEGIN OUTPUT from 'core/modules/views/templates/views-view-field.html.twig' -->
    
    <!-- END OUTPUT from 'core/modules/views/templates/views-view-field.html.twig' -->
    
    
  • public static create($string) -> string|\Drupal\Component\Render\MarkupInterface
    Creates a Markup object if necessary.
    
    If $string is equal to a blank string then it is not necessary to create a
    Markup object. If $string is an object that implements MarkupInterface it
    is returned unchanged.
    
    @param mixed $string
    The string to mark as safe. This value will be cast to a string.
    
    @return string|\Drupal\Component\Render\MarkupInterface
    A safe string.
    
    Defined in .../core/lib/Drupal/Component/Render/MarkupTrait.php:32
    public __toString() -> string
    Returns the string version of the Markup object.
    
    @return string
    The safe string content.
    
    Defined in .../core/lib/Drupal/Component/Render/MarkupTrait.php:51
    public count() -> int
    Returns the string length.
    
    @return int
    The length of the string.
    
    Defined in .../core/lib/Drupal/Component/Render/MarkupTrait.php:61
    public jsonSerialize() -> string
    Returns a representation of the object for use in JSON serialization.
    
    @return string
    The safe string content.
    
    Defined in .../core/lib/Drupal/Component/Render/MarkupTrait.php:71
Drupal\Core\Render\Markup(1)
  • contents
  • Available methods (4)
  • protected string -> string(780) " <!-- THEME DEBUG --> <!-- THEME HOOK: 'views_view_field' --> <!-- BEGIN OUTPUT …"
    
    <!-- THEME DEBUG -->
    <!-- THEME HOOK: 'views_view_field' -->
    <!-- BEGIN OUTPUT from 'core/modules/views/templates/views-view-field.html.twig' -->
    
    
    <!-- THEME DEBUG -->
    <!-- THEME HOOK: 'image_formatter' -->
    <!-- BEGIN OUTPUT from 'core/modules/image/templates/image-formatter.html.twig' -->
      
    
    <!-- THEME DEBUG -->
    <!-- THEME HOOK: 'image' -->
    <!-- BEGIN OUTPUT from 'themes/bootstrap/templates/system/image.html.twig' -->
    <img src="/sites/default/files/motorway/m/rbpr-ap-dc.gif" width="50" height="50" typeof="foaf:Image" />
    
    <!-- END OUTPUT from 'themes/bootstrap/templates/system/image.html.twig' -->
    
    
    
    <!-- END OUTPUT from 'core/modules/image/templates/image-formatter.html.twig' -->
    
    
    <!-- END OUTPUT from 'core/modules/views/templates/views-view-field.html.twig' -->
    
    
  • public static create($string) -> string|\Drupal\Component\Render\MarkupInterface
    Creates a Markup object if necessary.
    
    If $string is equal to a blank string then it is not necessary to create a
    Markup object. If $string is an object that implements MarkupInterface it
    is returned unchanged.
    
    @param mixed $string
    The string to mark as safe. This value will be cast to a string.
    
    @return string|\Drupal\Component\Render\MarkupInterface
    A safe string.
    
    Defined in .../core/lib/Drupal/Component/Render/MarkupTrait.php:32
    public __toString() -> string
    Returns the string version of the Markup object.
    
    @return string
    The safe string content.
    
    Defined in .../core/lib/Drupal/Component/Render/MarkupTrait.php:51
    public count() -> int
    Returns the string length.
    
    @return int
    The length of the string.
    
    Defined in .../core/lib/Drupal/Component/Render/MarkupTrait.php:61
    public jsonSerialize() -> string
    Returns a representation of the object for use in JSON serialization.
    
    @return string
    The safe string content.
    
    Defined in .../core/lib/Drupal/Component/Render/MarkupTrait.php:71
Drupal\Core\Render\Markup(1)
  • contents
  • Available methods (4)
  • protected string -> string(233) " <!-- THEME DEBUG --> <!-- THEME HOOK: 'views_view_field' --> <!-- BEGIN OUTPUT …"
    
    <!-- THEME DEBUG -->
    <!-- THEME HOOK: 'views_view_field' -->
    <!-- BEGIN OUTPUT from 'core/modules/views/templates/views-view-field.html.twig' -->
    
    <!-- END OUTPUT from 'core/modules/views/templates/views-view-field.html.twig' -->
    
    
  • public static create($string) -> string|\Drupal\Component\Render\MarkupInterface
    Creates a Markup object if necessary.
    
    If $string is equal to a blank string then it is not necessary to create a
    Markup object. If $string is an object that implements MarkupInterface it
    is returned unchanged.
    
    @param mixed $string
    The string to mark as safe. This value will be cast to a string.
    
    @return string|\Drupal\Component\Render\MarkupInterface
    A safe string.
    
    Defined in .../core/lib/Drupal/Component/Render/MarkupTrait.php:32
    public __toString() -> string
    Returns the string version of the Markup object.
    
    @return string
    The safe string content.
    
    Defined in .../core/lib/Drupal/Component/Render/MarkupTrait.php:51
    public count() -> int
    Returns the string length.
    
    @return int
    The length of the string.
    
    Defined in .../core/lib/Drupal/Component/Render/MarkupTrait.php:61
    public jsonSerialize() -> string
    Returns a representation of the object for use in JSON serialization.
    
    @return string
    The safe string content.
    
    Defined in .../core/lib/Drupal/Component/Render/MarkupTrait.php:71
Drupal\Core\Render\Markup(1)
  • contents
  • Available methods (4)
  • protected string -> string(780) " <!-- THEME DEBUG --> <!-- THEME HOOK: 'views_view_field' --> <!-- BEGIN OUTPUT …"
    
    <!-- THEME DEBUG -->
    <!-- THEME HOOK: 'views_view_field' -->
    <!-- BEGIN OUTPUT from 'core/modules/views/templates/views-view-field.html.twig' -->
    
    
    <!-- THEME DEBUG -->
    <!-- THEME HOOK: 'image_formatter' -->
    <!-- BEGIN OUTPUT from 'core/modules/image/templates/image-formatter.html.twig' -->
      
    
    <!-- THEME DEBUG -->
    <!-- THEME HOOK: 'image' -->
    <!-- BEGIN OUTPUT from 'themes/bootstrap/templates/system/image.html.twig' -->
    <img src="/sites/default/files/motorway/m/rbpr-ap-sc.gif" width="50" height="50" typeof="foaf:Image" />
    
    <!-- END OUTPUT from 'themes/bootstrap/templates/system/image.html.twig' -->
    
    
    
    <!-- END OUTPUT from 'core/modules/image/templates/image-formatter.html.twig' -->
    
    
    <!-- END OUTPUT from 'core/modules/views/templates/views-view-field.html.twig' -->
    
    
  • public static create($string) -> string|\Drupal\Component\Render\MarkupInterface
    Creates a Markup object if necessary.
    
    If $string is equal to a blank string then it is not necessary to create a
    Markup object. If $string is an object that implements MarkupInterface it
    is returned unchanged.
    
    @param mixed $string
    The string to mark as safe. This value will be cast to a string.
    
    @return string|\Drupal\Component\Render\MarkupInterface
    A safe string.
    
    Defined in .../core/lib/Drupal/Component/Render/MarkupTrait.php:32
    public __toString() -> string
    Returns the string version of the Markup object.
    
    @return string
    The safe string content.
    
    Defined in .../core/lib/Drupal/Component/Render/MarkupTrait.php:51
    public count() -> int
    Returns the string length.
    
    @return int
    The length of the string.
    
    Defined in .../core/lib/Drupal/Component/Render/MarkupTrait.php:61
    public jsonSerialize() -> string
    Returns a representation of the object for use in JSON serialization.
    
    @return string
    The safe string content.
    
    Defined in .../core/lib/Drupal/Component/Render/MarkupTrait.php:71
Drupal\Core\Render\Markup(1)
  • contents
  • Available methods (4)
  • protected string -> string(774) " <!-- THEME DEBUG --> <!-- THEME HOOK: 'views_view_field' --> <!-- BEGIN OUTPUT …"
    
    <!-- THEME DEBUG -->
    <!-- THEME HOOK: 'views_view_field' -->
    <!-- BEGIN OUTPUT from 'core/modules/views/templates/views-view-field.html.twig' -->
    
    
    <!-- THEME DEBUG -->
    <!-- THEME HOOK: 'image_formatter' -->
    <!-- BEGIN OUTPUT from 'core/modules/image/templates/image-formatter.html.twig' -->
      
    
    <!-- THEME DEBUG -->
    <!-- THEME HOOK: 'image' -->
    <!-- BEGIN OUTPUT from 'themes/bootstrap/templates/system/image.html.twig' -->
    <img src="/sites/default/files/motorway/m54/50.gif" width="50" height="50" typeof="foaf:Image" />
    
    <!-- END OUTPUT from 'themes/bootstrap/templates/system/image.html.twig' -->
    
    
    
    <!-- END OUTPUT from 'core/modules/image/templates/image-formatter.html.twig' -->
    
    
    <!-- END OUTPUT from 'core/modules/views/templates/views-view-field.html.twig' -->
    
    
  • public static create($string) -> string|\Drupal\Component\Render\MarkupInterface
    Creates a Markup object if necessary.
    
    If $string is equal to a blank string then it is not necessary to create a
    Markup object. If $string is an object that implements MarkupInterface it
    is returned unchanged.
    
    @param mixed $string
    The string to mark as safe. This value will be cast to a string.
    
    @return string|\Drupal\Component\Render\MarkupInterface
    A safe string.
    
    Defined in .../core/lib/Drupal/Component/Render/MarkupTrait.php:32
    public __toString() -> string
    Returns the string version of the Markup object.
    
    @return string
    The safe string content.
    
    Defined in .../core/lib/Drupal/Component/Render/MarkupTrait.php:51
    public count() -> int
    Returns the string length.
    
    @return int
    The length of the string.
    
    Defined in .../core/lib/Drupal/Component/Render/MarkupTrait.php:61
    public jsonSerialize() -> string
    Returns a representation of the object for use in JSON serialization.
    
    @return string
    The safe string content.
    
    Defined in .../core/lib/Drupal/Component/Render/MarkupTrait.php:71
Drupal\Core\Render\Markup(1)
  • contents
  • Available methods (4)
  • protected string -> string(233) " <!-- THEME DEBUG --> <!-- THEME HOOK: 'views_view_field' --> <!-- BEGIN OUTPUT …"
    
    <!-- THEME DEBUG -->
    <!-- THEME HOOK: 'views_view_field' -->
    <!-- BEGIN OUTPUT from 'core/modules/views/templates/views-view-field.html.twig' -->
    
    <!-- END OUTPUT from 'core/modules/views/templates/views-view-field.html.twig' -->
    
    
  • public static create($string) -> string|\Drupal\Component\Render\MarkupInterface
    Creates a Markup object if necessary.
    
    If $string is equal to a blank string then it is not necessary to create a
    Markup object. If $string is an object that implements MarkupInterface it
    is returned unchanged.
    
    @param mixed $string
    The string to mark as safe. This value will be cast to a string.
    
    @return string|\Drupal\Component\Render\MarkupInterface
    A safe string.
    
    Defined in .../core/lib/Drupal/Component/Render/MarkupTrait.php:32
    public __toString() -> string
    Returns the string version of the Markup object.
    
    @return string
    The safe string content.
    
    Defined in .../core/lib/Drupal/Component/Render/MarkupTrait.php:51
    public count() -> int
    Returns the string length.
    
    @return int
    The length of the string.
    
    Defined in .../core/lib/Drupal/Component/Render/MarkupTrait.php:61
    public jsonSerialize() -> string
    Returns a representation of the object for use in JSON serialization.
    
    @return string
    The safe string content.
    
    Defined in .../core/lib/Drupal/Component/Render/MarkupTrait.php:71
Drupal\Core\Render\Markup(1)
  • contents
  • Available methods (4)
  • protected string -> string(780) " <!-- THEME DEBUG --> <!-- THEME HOOK: 'views_view_field' --> <!-- BEGIN OUTPUT …"
    
    <!-- THEME DEBUG -->
    <!-- THEME HOOK: 'views_view_field' -->
    <!-- BEGIN OUTPUT from 'core/modules/views/templates/views-view-field.html.twig' -->
    
    
    <!-- THEME DEBUG -->
    <!-- THEME HOOK: 'image_formatter' -->
    <!-- BEGIN OUTPUT from 'core/modules/image/templates/image-formatter.html.twig' -->
      
    
    <!-- THEME DEBUG -->
    <!-- THEME HOOK: 'image' -->
    <!-- BEGIN OUTPUT from 'themes/bootstrap/templates/system/image.html.twig' -->
    <img src="/sites/default/files/motorway/m/rbpr-an-sc.gif" width="50" height="50" typeof="foaf:Image" />
    
    <!-- END OUTPUT from 'themes/bootstrap/templates/system/image.html.twig' -->
    
    
    
    <!-- END OUTPUT from 'core/modules/image/templates/image-formatter.html.twig' -->
    
    
    <!-- END OUTPUT from 'core/modules/views/templates/views-view-field.html.twig' -->
    
    
  • public static create($string) -> string|\Drupal\Component\Render\MarkupInterface
    Creates a Markup object if necessary.
    
    If $string is equal to a blank string then it is not necessary to create a
    Markup object. If $string is an object that implements MarkupInterface it
    is returned unchanged.
    
    @param mixed $string
    The string to mark as safe. This value will be cast to a string.
    
    @return string|\Drupal\Component\Render\MarkupInterface
    A safe string.
    
    Defined in .../core/lib/Drupal/Component/Render/MarkupTrait.php:32
    public __toString() -> string
    Returns the string version of the Markup object.
    
    @return string
    The safe string content.
    
    Defined in .../core/lib/Drupal/Component/Render/MarkupTrait.php:51
    public count() -> int
    Returns the string length.
    
    @return int
    The length of the string.
    
    Defined in .../core/lib/Drupal/Component/Render/MarkupTrait.php:61
    public jsonSerialize() -> string
    Returns a representation of the object for use in JSON serialization.
    
    @return string
    The safe string content.
    
    Defined in .../core/lib/Drupal/Component/Render/MarkupTrait.php:71
Drupal\Core\Render\Markup(1)
  • contents
  • Available methods (4)
  • protected string -> string(233) " <!-- THEME DEBUG --> <!-- THEME HOOK: 'views_view_field' --> <!-- BEGIN OUTPUT …"
    
    <!-- THEME DEBUG -->
    <!-- THEME HOOK: 'views_view_field' -->
    <!-- BEGIN OUTPUT from 'core/modules/views/templates/views-view-field.html.twig' -->
    
    <!-- END OUTPUT from 'core/modules/views/templates/views-view-field.html.twig' -->
    
    
  • public static create($string) -> string|\Drupal\Component\Render\MarkupInterface
    Creates a Markup object if necessary.
    
    If $string is equal to a blank string then it is not necessary to create a
    Markup object. If $string is an object that implements MarkupInterface it
    is returned unchanged.
    
    @param mixed $string
    The string to mark as safe. This value will be cast to a string.
    
    @return string|\Drupal\Component\Render\MarkupInterface
    A safe string.
    
    Defined in .../core/lib/Drupal/Component/Render/MarkupTrait.php:32
    public __toString() -> string
    Returns the string version of the Markup object.
    
    @return string
    The safe string content.
    
    Defined in .../core/lib/Drupal/Component/Render/MarkupTrait.php:51
    public count() -> int
    Returns the string length.
    
    @return int
    The length of the string.
    
    Defined in .../core/lib/Drupal/Component/Render/MarkupTrait.php:61
    public jsonSerialize() -> string
    Returns a representation of the object for use in JSON serialization.
    
    @return string
    The safe string content.
    
    Defined in .../core/lib/Drupal/Component/Render/MarkupTrait.php:71
Junction   Eastbound               Westbound  
M6 J10A
0.0 km
Birmingham
Coventry
Walsall
M6 Link

M6

M6
N/A
LanesLanesLanesLanesLanesLanesLanes LanesLanesLanesLanes
0 miles, 2 lanes 0 miles, 2 lanes
1
3.2 km
Cannock
A460
A460 A460 Cannock
A460
LanesLanesLanesLanesLanes LanesLanesLanesLanesLanes
0 miles, 3 lanes 0 miles, 3 lanes
2
5.7 km
Wolverhampton
Stafford
(M6 N Link)
A449
A449
(M6)


A449


Wolverhampton
A449
LanesLanesLanesLanesLanes LanesLanesLanesLanesLanes
0 miles, 2 lanes 0 miles, 2 lanes
3
17.8 km
Wolverhampton (W)
A41
A41 A41 Whitchurch
Weston
A41
LanesLanesLanesLanes LanesLanesLanesLanes
0 miles, 2 lanes 0 miles, 2 lanes
4
25.5 km
Telford (E)
A464
Kidderminster
(A442)
Services Telford
A4640 A464

A464
(A442)
Telford (E)
A464
Ironbridge
(A442)
Services Telford
LanesLanesLanesLanes LanesLanesLanesLanes
0 miles, 2 lanes 0 miles, 2 lanes
5
28.6 km
Telford (Cen)
A5
A5


B5072
Telford (Cen)
B5072
LanesLanesLanesLanesLanes LanesLanesLanesLanesLanes
0 miles, 3 lanes 0 miles, 3 lanes
6
31.3 km
Telford (W)
A518
Whitchurch
(A442)
Ironbridge
A5223
A518 A5223
(A442)
Telford (W)
A518
Whitchurch
(A442)
LanesLanesLanesLanesLanes LanesLanesLanesLanesLanes
0 miles, 2 lanes 0 miles, 2 lanes
7
35.0 km
Telford (A5)
Birmingham
M54
Wellington
B5061
B5061




NORTH WALES
Shrewsbury
A5
Wellington
B5061
LanesLanesLanesLanes Signs LanesLanesLanesLanes Signs
0 miles, lanes 0 miles, lanes
Routes

Picture credits

With thanks to Chris McKenna and Steven Jukes for information on this page.