Photo: Sophie Mutevelian/World Productions/Netflix
The British crime drama Bodyguard keeps its audience guessing every which way: Who is really behind the terror attacks plaguing London? Why is someone trying to kill Britain’s war hawk of a home secretary, Julia Montague (Keeley Hawes)? And just how dedicated is Sgt. David Budd (Richard Madden) to protecting her from danger? Fueled by all that stressful mystery, the six-part series became the U.K.’s most-watched drama in a decade when it aired across the Atlantic earlier this fall.
“People were saying that they couldn’t breathe,” creator Jed Mercurio tells Vulture. “That they’re used to watching TV where they get up and go get themselves a drink, or they pause it and make a phone call. People were saying that they were rooted to the show, which was incredibly flattering.”
Now that the series is streaming on Netflix, viewers worldwide are having the same experience, as each hour of the six-episode series — all of which was written by Mercurio — unfolds in rapid and shocking succession. To learn how he plotted such agonizingly suspenseful TV sequences, we asked Mercurio to take us inside four of Bodyguard’s most gripping scenes. Don’t read further unless you’ve finished the season — spoilers abound!
Bodyguard opens with war vet-turned-police officer Sergeant David Budd traveling home to London with his two children when he suddenly discovers a suicide bomber hiding in the train car’s bathroom stall. Originally, Mercurio had scripted the sequence to take place on a parked train in London’s Waterloo Station, the UK’s largest and busiest depot, but then the production’s permission to film there was revoked. (The scene “didn’t fit our filming policy,” Waterloo’s Twitter account said. “At the time there was also a high likelihood that closing two platforms for the shoot would have caused or contributed to service disruption.”)
Mercurio rescheduled filming of the sequence for the end of Bodyguard’s five-month shoot, to give himself ample time to reconceive the chain of events. “That’s when we were able to think of shooting it on a moving train, and that then created all different levels of confinement and jeopardy,” he says. “Once we identified the train that we were going to shoot on, and the director [Thomas Vincent] and I had spent time on the train figuring out the physical layout, that’s when the scene really took shape.”
Photo: Neflix
First, there’s the moment when David is about to give the train’s guard the go-ahead to unlock the doors so he can throw off the potential bomber — until he suddenly loses his cell signal in a tunnel. “It’s just real life. I love to do things that kind of mess with the movie formula that you can always find the right place to park, you’ve always got a phone signal,” Mercurio says. “And I think audiences really respond to the limitations of real life when they intrude on drama.”
Photo: Neflix
After the suspect exits the bathroom, appearing innocent, David takes a look inside and finds Nadia (Anjli Mohindra), who he immediately assumes has been brainwashed into wearing a suicide vest by her husband. Their subsequent conversation has to establish David’s backstory — he served in the Middle East, and now questions the politicians who ordered those military operations — and establish an immediate kinship between them. “He regarded himself as a victim of that conflict in a way that possibly Nadia is because she’s been railroaded into wearing the suicide bomb,” Mercurio says. “It was important to set that up as if they were both collateral damage. They’re both expendable. So rather than them being on opposite sides, it throws them together against the forces of the police and national security.”
While Mercurio was disappointed not to root the show in an iconic London location like Waterloo, the delay in filming ultimately enhanced the sequence in other ways. “It meant the director and Richard [Madden] were approaching the material with the knowledge of having already shot the whole series, which was extremely helpful to establishing the shooting style and protagonist,” he says. The key was building the intensity, which peaks when armed police board the train and order Nadia to come out of the bathroom. David knows a sniper will fire at her if there’s a clear shot, so when Nadia rushes out, he holds her close and tells her to keep moving.
Photo: Neflix
“It’s just about the physical reality of the situation,” says Mercurio, who worked with police, counter-terrorism, and explosives disposal advisors to ensure the scene’s accuracy. “Looking at that particular location inside of the train, with the views through the window from the sniper position, we figured [out] physically what he needed to do in order to make sure the sniper didn’t have a critical shot. Because of the layout, it meant that they had to get their heads aligned and then keep turning, so that any kind of headshot would go through both of them.”
One of Bodyguard’s most shocking moments erupts 35 minutes into its second hour, when Julia’s car comes under fire during a routine ride. The driver is shot in the head and killed, leaving Julia and David covered in blood as they crouch behind their seats and the armored plating of the car. “It’s shocking because it’s going completely against the run of the episode. At that point, it feels like the episode is about the mistrust between the characters, and then this event comes out of nowhere and propels them both into a high-jeopardy situation, which as it develops gets tenser and tenser,” Mercurio says.
Advisers determined what kind of weapon would be required to make the shot, and then the effect its bullets would have on the human body. “It was purely about what would happen in real life,” Mercurio says of the blood-splatter. The intimate interplay between David and Julia as he tries to calm her was in the script, but the blocking of the scene — his reaching for her hand, the two of them only able to see each other through the tiny space between the car door and the front seat — happened when they figured out the best lines of sight in the actual vehicle during production.
Photo: Neflix
With backup still minutes away, David determines the sniper’s location and drives the car — backwards — to safety. But why risk it if the car really was impenetrable? It’s an ambiguous choice by design, meant to raise suspicions that David might be driving Julia to another location where he could kill her himself. “That’s an important part of the show. Once we’ve established in the first episode that he’s potentially part of the threat against her, then we know that we can play that game all the way ‘til the end,” Mercurio says.
Did anyone expect Bodyguard to kill off its female lead at the end of its third episode? Though some fans kept hope alive all the way to the finale that Julia was merely faking her death until her assassins were exposed, Mercurio says that was never a serious consideration: “It was something that was pretty easy to dismiss as a plot point. I think the idea of someone so high-profile being able to fake their death is really quite implausible.”
What was up for debate in his mind, however, was how to play the attack itself. While Julia’s onstage delivering her speech about “protecting our future” in the age of terrorism, David sees an aide named Tahir (Shubham Saraf) pacing outside the door in the hallway. Tahir says he just received a call from his boss and needs to warn Julia about a screw-up with her speech, and insists he’s carrying the research files she needs. David demands to see inside the briefcase; Tahir opens it, David gives a cursory look, and then delivers his stoic approval. Because the audience doesn’t see inside the case, we don’t know if David saw files and was satisfied, made a mistake by failing to check what was underneath them, or flat-out saw a bomb and didn’t care.
Photo: Neflix
“We did have quite a lot of discussions about how much sleight of hand we wanted to apply there,” Mercurio says. “We were creating the sense of a conspiracy, and we wanted that scene to end up being quite enigmatic, so we just decided that the contents wouldn’t be shown. And that was something we could exploit going forward.”
As ambiguously as David’s face may read to the audience, Madden had to play the truth of the moment. “Richard plays it as that character is under pressure, and he’s pissed off with the guy, and that’s why he’s cold with him,” Mercurio says. “But what the audience can then interpret from that is possibly that he is being very cold because he understands that he’s doing something very ruthless.”
Photo: Neflix
Another look open to interpretation: the one on David’s face moments before Julia’s speech, when she tells him he’s being reassigned — not (only) because he tried to strangle her in a PTSD-induced panic, but because she wants him standing beside her by choice, not out of duty. She made it clear that her feelings for him were genuine. Did he have them for her, too, or did he simply feel guilty realizing she hadn’t been playing him as he’d been playing her? “I think that he did develop feelings for her. I think that he’s just kind of shocked by what she says in that scene,” Mercurio says. “He realizes how difficult it would be to pursue a relationship, and also [that Julia might reveal] the way he’s behaved in terms of his PTSD. I don’t think he’s yet at the point in his illness where he’s prepared to accept that he needs help, so I think he just shuts all that down, which then does make him seem very cold and ruthless. But actually, I think it’s just so that he can concentrate on doing his job.”
There’s a good chance you watched this six-and-a-half-minute scene on the edge of your seat: When David wakes up with a suicide vest strapped to his chest, the lingering shock of Julia’s death means you can’t help but wonder if Bodyguard might kill off its other star, too. “I think once you do the unexpected and you take the viewers to a position of discomfort about being able to rely on characters surviving, then it does completely affect the way in which the drama is viewed,” Mercurio says. “That real sense of jeopardy is something that we worked really hard to create.”
Madden spent at least a week wearing the prop vest, including time spent filming the long, gut-wrenching sequence as David pleads his innocence to his colleagues and begs for help while the secrets he’s kept come home to roost and incriminate him. “It was tough. Richard’s an incredibly dedicated professional who’s always so well prepared and will always push himself to get the right take and the right performance, so that was one of the reasons I was so delighted that Richard agreed to do the role,” Mercurio says.
Photo: Neflix
But did Mercurio ever consider killing David in the finale? “Oh yeah, of course,” he says. “It was something that we very definitely played with as being a possibility. I loved the film from the ’70s called TheParallax View, with Warren Beatty, which has that kind of arc to it. There was a film [1999’s Arlington Road] with Jeff Bridges that was effectively a remake of that, and so I know it’s been done before. But I felt that for this TV show, it was probably too nihilistic to go that route.”
By submitting your email, you agree to our
Terms and Privacy Notice
and to receive email correspondence from us. This site is protected by reCAPTCHA and the Google
Privacy Policy and
Terms of Service apply.
or
Already a subscriber?
What is your email?
This email will be used to sign into all New York sites. By submitting your email, you agree to our Terms and Privacy Policy and to receive email correspondence from us.
Password must be at least 8 characters and contain:
Lower case letters (a-z)
Upper case letters (A-Z)
Numbers (0-9)
Special Characters (!@#$%^&*)
This password will be used to sign into all New York sites. By submitting your email, you agree to our Terms and Privacy Policy and to receive email correspondence from us.
You’re in!
As part of your account, you’ll receive occasional updates and offers from New York, which you can opt out of anytime.
or
Already a subscriber?
What is your email?
This email will be used to sign into all New York sites. By submitting your email, you agree to our Terms and Privacy Policy and to receive email correspondence from us.
Password must be at least 8 characters and contain:
Lower case letters (a-z)
Upper case letters (A-Z)
Numbers (0-9)
Special Characters (!@#$%^&*)
This password will be used to sign into all New York sites. By submitting your email, you agree to our Terms and Privacy Policy and to receive email correspondence from us.
You’re in!
As part of your account, you’ll receive occasional updates and offers from New York, which you can opt out of anytime.
Already a subscriber?
Already a subscriber?
`;
// integrate Sub(x) scripts and elements
if (hostname !== 'subs.nymag.com') { // do not integrate on this subdomain
document.head.appendChild(trackingScript);
document.body.insertAdjacentHTML('beforeend', subXAnimationElements);
}
There was an error processing the request. Please try again later."}).catch(e=>console.error("Error verifying email: ",e)))(r.querySelector(".content"),o.bannerCTAVerification)})):(l.remove(),s.remove()),o.dismissable||n.remove(),o.useAlertIcon||a.remove(),r.classList.add("show"),n.addEventListener("click",()=>{u(),r.classList.remove("show")})}else r.remove()}});
}, {"1":1,"6":6,"12":12,"35":35,"40":40}];
window.modules["global-nav.client"] = [function(require,module,exports){"use strict";const dom=require(3),auth=require(12),signInButton=dom.find(".user-signin"),signOutButton=dom.find(".user-signout"),globalNav=dom.find('[class^="global-nav"]'),body=dom.find("body"),dropdownItems=dom.findAll(".dropdown-wrap"),gtm=require(1),appendLandingPageParams=require(136),pageUri=require(124).getPageUri(),subscriptionPromoLinks=dom.findAll(".persist-params"),searchString=window.location.search||"";function closeDropdowns(e){let n=globalNav.querySelectorAll(".dropdown.open");dropdownItems.forEach(function(t){let o=t.querySelector(".dropdown");!n||t.contains(e.target)&&27!==e.keyCode||o.classList.remove("open")})}function gtmSendReport(e,n,t){let o={eventCategory:"ecommerce",eventAction:"componentClick",brand:e,dimension23:"global-nav",list:pageUri,pageZone:"header",variant:"nav-link"};"global-nav-link"===t&&(o.eventLabel=n.href),gtm.reportNow(o)}function updateElementTargetUrlsIfQueryStrings(e){if(searchString){const n=new URLSearchParams(searchString);let t=e.href;if(t.includes("?")){const o=t.split("?"),i=new URLSearchParams(o[1]);for(let e of n.entries())i.set(e[0],e[1]);t=`${o[0]}?${i.toString()}`,e.href=t}else e.href=`${t}?${n.toString()}`}}function init(e){const n=e.querySelectorAll(".to-landing-page");window.addEventListener("auth:init",()=>{signInButton.addEventListener("click",function(e){e.preventDefault(),auth.showEmbeddedLoginFlow("top navigation")}),signOutButton.addEventListener("click",function(e){e.preventDefault(),gtmSendReport("Sign Out",e.target,"user-info-link"),auth.logout()}),auth.isAuthenticated()&&e.classList.add("signed-in"),auth.isSubscriber()&&e.classList.add("subscribed"),e.querySelectorAll(".user-link").forEach(e=>{e.classList.add("active")}),subscriptionPromoLinks.forEach(e=>{updateElementTargetUrlsIfQueryStrings(e)}),appendLandingPageParams(n)})}dropdownItems.forEach(function(e){e.addEventListener("click",function(){e.querySelector(".dropdown").classList.toggle("open")})}),body.addEventListener("click",closeDropdowns),document.addEventListener("keydown",closeDropdowns),globalNav.addEventListener("click",function(e){let n=e.target;n.classList.contains("global-nav-track")&>mSendReport(n.text,n,"global-nav-link")}),module.exports=init;
}, {"1":1,"3":3,"12":12,"124":124,"136":136}];
window.modules["aaa-module-mounting.legacy"] = [function(require,module,exports){"use strict";const _pickBy=require(221),_each=require(408),Fingerprint2=require(407),DS=require(406),Eventify=require(246);function registerGlobals(){window.DS=DS,window.Eventify=Eventify,window.Fingerprint2=Fingerprint2,DS.value("Eventify",Eventify),DS.value("Fingerprint2",Fingerprint2),DS.value("$document",window.document),DS.value("$window",window)}function mountDollarSliceComponents(){DS.service("components",["$document","$module",function(e,n){var o=_pickBy(n.definitions,e=>e.providerStrategy===n.providers.controller),r=Object.keys(o);function t(e){return o=>{try{n.get(e,o)}catch(e){logMountError(o,e)}}}_each(r,n=>{var o=e.querySelectorAll('[data-uri*="/_components/'+n+'/"]'),r=e.querySelectorAll('[data-uri$="/_components/'+n+'"]');_each(o,t(n)),_each(r,t(n))}),this.components=r}]),DS.get("components")}function logMountError(e,n){const o=e.outerHTML.slice(0,e.outerHTML.indexOf(e.innerHTML));console.error("Error attaching controller to "+o,n)}registerGlobals(),"loading"===document.readyState?document.addEventListener("DOMContentLoaded",()=>{mountDollarSliceComponents()}):mountDollarSliceComponents();
}, {"221":221,"246":246,"406":406,"407":407,"408":408}];
window.modules["ads.legacy"] = [function(require,module,exports){"use strict";const _map=require(118),_forEach=require(107),_isString=require(268),_intersectionWith=require(409),_isEqual=require(274),_each=require(408),_debounce=require(182),_sortBy=require(205),page=require(124),visit=require(114);DS.service("adService",["Eventify","$cid","$document","$window",function(e,t,a,i){var o,n,s,r,d,c,u,l,g={},p=this,h=[],f=visit.getQueryParamsObject(["utm_campaign"]),m=document.querySelector('script[data-type="ad-a9"]'),b=[],w=!1,v=[],y=document.querySelector('script[data-name="ad-doubleverify"]');document.querySelector('script[data-name="concert-ads"]')||(i.NYM={},i.NYM.analytics={},i.NYM.analytics.adStartTime=i.performance.now(),i.googletag=i.googletag||{},i.googletag.cmd=i.googletag.cmd||[],u=i.googletag,(m||y)&&(i.googletag.cmd=i.googletag.cmd||[],i.googletag.cmd.push(function(){i.googletag.pubads().disableInitialLoad()})),m&&(l=i.setInterval(function(){void 0!==window.apstag&&void 0!==window.apstag.timeout&&(i.clearInterval(l),window.apstag.cleared=!0,l=null)},10),setTimeout(function(){l&&(i.clearInterval(l),i.googletag.pubads().refresh(),window.apstag||console.log("MESSAGE: Timeout for A9 load exceeded, aborting"))},500)),y&&(b.push(new Promise(function(e){w?e():v.push(e)})),c=i.setTimeout(T,2500)),o=function(e){var t,a,o=e.data,n=[];return o.loaded?e:(o.loaded=!0,t=null,(t=o.sizes?u.defineSlot(o.name,o.sizes,o.id).addService(u.pubads()):u.defineOutOfPageSlot(o.name,o.id).addService(u.pubads())).setTargeting("adid",o.id),f.hasOwnProperty("utm_campaign")&&t.setTargeting("utmcamp",f.utm_campaign),a=p.getAdCount(o.label),t.setTargeting("label",o.label+"_"+o.site+"-"+a),u.display(o.id),u.pubads().addEventListener("slotOnload",function(){i.NYM.analytics.firstAdLoadTime||(i.NYM.analytics.firstAdLoadTime=i.performance.now(),i.NYM.analytics.firstAdLoadLabel=e.data.label)}),n=_(o),Promise.all(b).then(function(){n?window.apstag&&window.apstag.cleared?window.apstag.fetchBids({slots:[n],timeout:window.apstag.timeout},function(){u.cmd.push(function(){window.apstag.setDisplayBids(),u.pubads().refresh([t],{changeCorrelator:!1})})}):y&&u.pubads().refresh([t],{changeCorrelator:!1}):u.pubads().refresh([t],{changeCorrelator:!1})}),e.slot=t,e)},n=function(e){var a,i,o,n=t(),s=e.getAttribute("data-name"),r=e.getAttribute("data-sizes"),d=e.getAttribute("data-label"),c=e.getAttribute("data-site");n=e.id,r&&r.length?(r=r.split(","),a=[],_map(r,function(e){e=e.split("x"),i=parseInt(e[0]),o=parseInt(e[1]),a.push([i,o])})):(e.classList.add("oop"),a=!1),this.data={id:n,name:s,sizes:a,loaded:!1,label:d,site:c},g[n]=this},r=function(e){u.cmd.push(function(){var t=o(e);g[e.data.id]=t})},s=function(e){var t=[];e.slot?(t=_(e))&&window.apstag&&window.apstag.cleared&&window.apstag.fetchBids({slots:[t],timeout:window.apstag.timeout},function(){u.cmd.push(function(){window.apstag.setDisplayBids(),u.pubads().refresh([e.slot],{changeCorrelator:!1})})}):e&&r(e)},u.cmd.push(function(){var e,t,o,n=page.getMeta("article:tag"),s=page.getMeta("author"),r=i.location.href,d=(e=a.head.querySelector(".head-gtm"),t=a.body.querySelector(".gtm"),e&&"top"===e.getAttribute("data-gtm")?"gtmtop":t&&"bottom"===t.getAttribute("data-gtm")?"gtmbottom":"");o=[],_forEach([n,s,d],function(e){_forEach(e.split(","),function(e){(e=e.trim().toLowerCase().replace(/\s/g,"-").replace(/\'|\’/g,"")).length&&o.push(e)})}),u.pubads().setTargeting("kw",o),u.pubads().setTargeting("entry_group",o),r=r.slice(r.lastIndexOf("/")+1),u.pubads().setTargeting("pn",r),u.companionAds().setRefreshUnfilledSlots(!0),u.pubads().enableAsyncRendering(),u.enableServices()}),this.load=r,this.create=function(e){return new n(e)},this.refresh=function(e){var t;_isString(e)?(t=this.getById(e),s(t)):s(e)},this.remove=function(e){var t=e.data.id;a.getElementById(t).innerHTML=""},this.getAdCount=function(e){var t,a=0,i=Object.keys(g);return _each(i,function(i){(t=g[i]).data.loaded&&t.data.label===e&&a++}),a},this.getById=function(e){return g[e]},d=_debounce(function(){var e={TopLeaderboard:1,RightColTopMPU:2,outOfPage:99,"homepageTakeover/TopLeaderboard":1},t=_sortBy(h,function(t){return e[t.data.label]||10});_forEach(t,function(e){return e.data.sizes?r(e):i.setTimeout(function(){r(e)},2e3)}),y&&window.PQ.cmd.push(()=>{try{window.PQ.loadSignals(["ids","bsc","vlp"],T)}catch(e){T(),console.error(`There has been an error loading Double Verify signals: ${e}`)}}),h=[]},10),this.addToPageLoadQueue=function(e){h.push(e),d()});function _(e){var t,a=e.sizes;return a=_intersectionWith(a,[[970,250],[970,90],[728,90],[300,600],[300,250],[320,100],[320,50]],_isEqual),e.sizes&&e.sizes.length&&(t={slotID:e.id,sizes:a,slotName:e.label}),t}function T(){i.clearTimeout(c),w=!0,_forEach(v,function(e){e()})}}]);
}, {"107":107,"114":114,"118":118,"124":124,"182":182,"205":205,"268":268,"274":274,"408":408,"409":409}];
window.modules["cid.legacy"] = [function(require,module,exports){"use strict";DS.service("$cid",function(){var r=Math.floor(100*Math.random());return function(){return"cid-"+ ++r}});
}, {}];
window.modules["client.legacy"] = [function(require,module,exports){"use strict";require("cid.legacy"),require("ads.legacy"),require("facebook.legacy"),require("aaa-module-mounting.legacy");
}, {"cid.legacy":"cid.legacy","aaa-module-mounting.legacy":"aaa-module-mounting.legacy","ads.legacy":"ads.legacy","facebook.legacy":"facebook.legacy"}];
window.modules["facebook.legacy"] = [function(require,module,exports){"use strict";DS.service("facebook",[function(){this.fb=function(i){window.FB&&window.FB[i].apply(this,Array.prototype.slice.call(arguments,1))}}]);
}, {}];
require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o typeof key === 'string' && key.match(/\.legacy$/)).forEach(key => window.require(key));
}
function tryToMount(fn, el, name) {
try {
fn(el); // init the controller
} catch (e) {
const elementTag = el.outerHTML.slice(0, el.outerHTML.indexOf(el.innerHTML));
console.error(`Error initializing controller for "${name}" on "${elementTag}"`, e);
}
}
/**
* mount client.js component controllers
*/
function mountComponentModules() {
Object.keys(window.modules).filter(key => typeof key === 'string' && key.match(/\.client$/)).forEach(key => {
let controllerFn = window.require(key);
if (typeof controllerFn === 'function') {
const name = key.replace('.client', ''),
instancesSelector = `[data-uri*="_components/${name}/"]`,
defaultSelector = `[data-uri$="_components${name}"]`,
instances = document.querySelectorAll(instancesSelector),
defaults = document.querySelectorAll(defaultSelector);
for (let el of instances) {
tryToMount(controllerFn, el, name);
}
for (let el of defaults) {
tryToMount(controllerFn, el, name);
}
}
});
}
// Make sure that a `window.process.env.NODE_ENV` is available in the client for any dependencies,
// services, or components that could require it
// note: the `` value is swapped for the actual environment variable in /lib/cmd/compile/scripts.js
window.process = window.process || {};
window.process.env = window.process.env || {};
if (!window.process.env.NODE_ENV) {
window.process.env.NODE_ENV = '';
}
// note: legacy controllers that require legacy services (e.g. dollar-slice) must
// wait for DOMContentLoaded to initialize themselves, as the files themselves must be mounted first
mountLegacyServices();
mountComponentModules();
// ]]