DETROIT – In horror movie franchises, the villain never goes away quietly. Even when the protagonist seems to be basking in the serenity of a resolved plotline, there's always one more twist to inject a final dose of suspense.

The Vikings' past three games against the Detroit Lions had been nothing if not a theater of the macabre, with botched kicks, late comebacks and calamitous turnovers taking turns to foil the Vikings' plans at the worst possible moments. Their game against the Lions on Thanksgiving Day contained some of the same frights — as any Hollywood slasher series would — along with a few new twists, and a climax that threatened to ruin more than a few turkey dinners in Minnesota.

But when it was all said and done, the Vikings survived.

They beat the Lions 30-23 at Ford Field, building a 17-point lead and weathering the kind of furious Matthew Stafford-led comeback that felled them twice last year. What would have been the Lions' third blocked kick of the day — and what would have been Nevin Lawson's game-tying 77-yard touchdown return — were negated by Darius Slay jumping offside on his way to blocking the kick with 1:15 left, letting Case Keenum finally kneel down twice to run out the clock.

The Vikings are now 9-2, holding a three-game lead over Detroit in the NFC North with five games to play.

"We know we have our work cut out every time we play these guys," Vikings wide receiver Adam Thielen said. "… They just have great players, a great coaching staff, and it's a tough team to take down. We know every time we come in here, we've got to play 60 minutes and play really well."

An offense that hadn't scored more than 16 points in its three previous meetings with the Lions posted 20 in the first half, with Keenum delivering a 22-yard touchdown strike to Kyle Rudolph while getting hit after earlier finding Rudolph for a 1-yard score. He also kept the ball on a zone read play for a 9-yard touchdown run in the first quarter.

Keenum finished the day with a passer rating of 121.8, completing 21 of his 30 passes for 282 yards and two scores. The Vikings are now 7-2 with him as a starter, and coach Mike Zimmer didn't leave any breadcrumbs to suggest there might be a switch to Teddy Bridgewater when the Vikings next play in Atlanta on Dec. 3.

The coach said after the Vikings' victory at Washington on Nov. 12 that he had a plan for the team's QB situation. Asked on Thursday if Keenum's play had simplified that plan, Zimmer said, "Yeah, it's simplified it. A lot."

And after Keenum helped the Vikings build a lead by hitting 14 of his 18 passes for 189 yards in the first half, the Vikings started the third quarter by steamrolling 75 yards in four plays, all of them runs, with Latavius Murray's 46-yard carry setting up his eventual 2-yard touchdown.

The score put the Vikings up 27-10, and with a defense that hadn't allowed a third-down conversion in the first two quarters, they seemed set up for a smooth ride to their first victory over Detroit in four tries.

But nothing against the Lions seems to be that easy.

While Detroit turned its first two drives of the second half into a pair of field goals, the Vikings lost a total of 11 yards on their next two drives, including a taunting penalty on Keenum after he flipped the ball with Ezekiel Ansah nearby following a sack.

"I talked to the ref after that. It's not something I meant to do at all," Keenum said. "I was just frustrated with getting sacked, something that I can avoid. I did a bad job in the pocket, didn't do my offensive line justice and I was kind of frustrated. I guess I threw the ball. I need to see it on film. I don't even remember what happened."

Forbath's first blocked kick of the day — an extra point in the first quarter — came when the Lions railroaded long snapper Kevin McDermott in a manner the Vikings thought should have been penalized.

The Vikings also lost a chance to deliver what might have been a decisive score when referee Tony Corrente's crew, which called a combined 17 accepted penalties, declined to throw a flag for pass interference when Lions safety Tavon Wilson leapt into Stefon Diggs just ahead of a deep throw's arrival from Keenum.

"We almost lost our composure a couple times," Zimmer said. "We study each crew going into the game. I told them that it could be like this [Thursday] and they've got to play clean, smart football, and I probably shouldn't say anything else."

Stafford then pulled the Lions closer, threading a 43-yard throw to Marvin Jones Jr. between Xavier Rhodes and Terence Newman after catching the Vikings with 12 men in the huddle. The Vikings' lead, sitting at a comfortable 17 points early in the third quarter, had dwindled to 27-23 in the first minute of the fourth.

This time, though, the Vikings would find their mettle strong enough.

Stafford — playing despite an ankle injury he sustained on the touchdown — overshot an open Golden Tate running down the middle of the field with Mackensie Alexander on third down, and Rhodes intercepted the quarterback's fourth-down pass intended for Jones with 2:50 remaining to end the Lions' last drive.

"I don't think Stafford's afraid to throw the ball anywhere; he trusts his guys," Zimmer said. "And so I think Xavier got a little frustrated with the one [pass interference] penalty [before halftime], but he's an awfully good competitor, too, and that play that he made on the fourth down was outstanding."