Adam Thielen and Stefon Diggs became just the seventh duo in NFL history to each catch 100 passes each in a season. They did so as the two lifelines for a middling Vikings offense, limited in receiver depth after the front office's decision to move on from the reliable Jarius Wright last spring.

Grades are based on a 1-to-5 scale, with '5' marking excellence, '4' for above-average, '3' for average, '2' for below-average and '1' for failure to perform. Players that did not accrue a season (weren't on the active roster for at least six weeks) or played in three games or fewer are not graded. Below are individual grades, based on game and practice observations, weekly film reviews and interviews with coaches, for seven receivers who finished the season on the Vikings' active roster, injured reserve or practice squad. Unofficial NFL stats, such as QB pressures, missed tackles and targeted passes, are compiled by

Previously: (Running backs/tight ends) Kyle Rudolph, Dalvin Cook filled underwhelming roles. (Quarterbacks) Kirk Cousins' first Vikings season busted when it mattered most; (Defensive backs) Harrison Smith leads a deep secondary; (Linebackers) Anthony Barr's contract season leaves you wanting more; (Defensive linemen) Danielle Hunter's name now among the NFL's best

Adam Thielen (4.5) — Strung together another elite season with career highs in receptions (113), yards (1,373) and touchdowns (9). It was the third-most catches, trialing Cris Carter ('94-'95), and fourth-most receiving yardage, trailing Randy Moss ('99, '00 and '03) in a single season in Vikings history. Put talk of a slow preseason connection with Kirk Cousins at rest by setting the NFL record with eight straight 100-yard receiving games to begin a season, tying Calvin Johnson's all-time streak record. Played 1,011 snaps [96.2%]. One of five Vikings to play 1,000 snaps. Received two All-Pro votes. Five drops tied for team lead. Penalized once for a false start.

A physical and elusive target, Thielen dominated contested catches even when he was covered. Became an instant viral highlight reel with plays like this 14-yard catch over the helmet of Saints corner P.J. Williams to convert a third down in the Week 8 loss. Thielen lost his only fumble of the season when he was hit by Saints linebacker Alex Anzalone at the Saints' 15-yard line. The ensuing 54-yard return by Marshon Lattimore set up a Saints touchdown in the Week 8 loss. Emotions flared in New England, where he tied for his worst catch rate (5 of 10) of the season and yelled at officials and the Patriots sideline when safety Patrick Chung was injured during a pivotal 4th-and-1 run that was eventually challenged by Bill Belichick, who yelled back at Thielen. He then dropped a first-down pass as the drive fizzled.

Issues persisted in Seattle, where Thielen wasn't targeted until the third quarter of a close game. After a 35-yard catch in the fourth quarter, mics picked up Thielen shouting something to the effect of it's been there "all f—— day." More problems arose in the season finale loss to the Bears. Thielen was enraged after a third-down incompletion, one of only five targets that day, from Kirk Cousins, who threw the corner route early and contested that he didn't know Thielen was going to hesitate at the top of the route. Starting around the Saints and Lions games, defenses began treating Thielen like a true No. 1 receiver with double and bracket coverages on critical downs. Had only one 100-yard game, 125 yards against the Packers in Week 12, during the second half of the season.

The frustration was a product of supreme production declining. Cousins and Thielen still had the NFL's best catch rate [73.9%] of any duo to see 100 targets. Thielen was a premium bargain for the Vikings front office at a $6.1 million cap hit last season. He could receive a new contract this offseason, perhaps in line with Diggs' new deal. Currently set for an $8.1 million cap hit next season while under contract through 2020.

Earned $1.1 million in bonuses for surpassing 80 catches ($600,000) and earning a Pro Bowl bid ($500,000). Added another $1 million to next year's salary via an escalator clause for surpassing 90 catches this season.

Stefon Diggs (4.5) — Had a career year after signing a five-year contract extension in July worth up to $72 million. Caught 102 passes for 1,021 yards and tied for the team lead with nine touchdowns. Capable of beating man or zone coverage with efficient footwork and premiere athleticism. Sticky hands aren't just for commercials. Dropped one pass, trailing only DeAndre Hopkins (0) for the fewest among receivers with 100 targets. Made a fingertip snag on a three-yard touchdown in Green Bay. In the same fourth quarter, he blazed past Davon House for a 75-yard touchdown. Perhaps even more impressive was this double move on Tramon Williams for a two-point conversion. a season-high 128 yards in that game. Saw a career-high 149 targets, ninth most in the league, as Thielen and Diggs were the second-most targeted duo behind Pittsburgh's Antonio Brown and JuJu Smith-Schuster. Played 874 snaps [83.2%] in a career-high 15 games, missing one against the Lions due to a rib injury. Played through a knee injury in New England, where he was limited to six targets in 47 snaps. Stopped his route against New Orleans, leading to P.J. Williams' pick six for the Saints. Otherwise had a strong game with 10 catches for 119 yards and a touchdown. Penalized five times, including three false starts and a hold negating an eight-yard run in Seattle.

Turned to as a shallow threat asked to break tackles and gain yards. Saw his deep target percentage drop from 25.5% to 16.3% this season. Still produced, even if in a limited capacity. Ranked top 10 in both broken tackles (12) and yards after the catch (438) among receivers. His 10-yard average per catch was a career low. Stands to benefit greatly from an offense better at protecting the quarterback and scheming receivers into more advantageous situations.

Thanks for reaching 100 catches, Diggs upped his 2021 base salary by $666,667, his 2022 salary by $750,000 and his 2023 salary by $800,000, due to an escalator clause in his contract.

Aldrick Robinson (3.0) — Signed as a street free agent in Week 3 after the Vikings waived receiver Stacy Coley, one of a flurry of moves after the disappointing tie in Green Bay. Immediately became a go-to deep threat for Kirk Cousins, who spent three seasons with Robinson in Washington. Played 252 snaps [24%]. Caught two touchdowns in Los Angeles, 10 days after signing, from 16 and 17 yards away. The latter was targeted to tight end Kyle Rudolph, but a poorly-run route put in him in the right place at the right time. Caught a career-high five touchdowns, none closer than 13 yards away, on just 17 catches with 35 targets. Dropped two passes: a deep ball against Detroit and a wide-open slant on third down in the season finale loss to Chicago. Flashed as a streaky vertical threat. Eventually became the No. 3 receiver on most third downs. Penalized once for blocking Lions cornerback Marcus Cooper in the back, nullifying Dalvin Cook's 21-yard touchdown catch and run during the Week 16 win. Didn't catch any of his four targets in the season finale. Said he wants to return to Minnesota in 2019. Pending free agent.

Laquon Treadwell (2.0) — In his third NFL season, Treadwell parlayed a slightly more consistent summer into chances during the first half. Stable play didn't carry into the season. Saw career highs in catches (35), targets (53), yards (302) and his only touchdown on a 14-yard post route in Green Bay. But he also dropped three passes against the Packers, one on third down, another tipped into an interception and a third in overtime. Played 543 snaps [51.7%]. Five drops tied for team lead. Improved his release at the line, evident by beating Sam Shields' press coverage for a 19-yard catch and run in Los Angeles. Penalized once for unsportsmanlike conduct and later fined $13,369 after he threw his helmet in Week 8. Treadwell had tackled Saints cornerback Marshon Lattimore on a 54-yard fumble return. Then sped past Detroit's Teez Tabor on a 22-yard catch and run against the Lions, his season long. But was phased out of the offense after the Week 10 bye. Does not create consistent separation on quick routes, needed most by this version of the Vikings. Saw just 14 targets in the final seven games, including only three targets in two games under coordinator Kevin Stefanski. A healthy scratch in Detroit, Stefanski's second game as play caller, for the first time since his rookie season. Entering a contract year in 2019, but the Vikings can move on this spring by taking a $2.5 million cap hit.

Brandon Zylstra (2.0) — The Spicer, Minn. native and CFL star signed his first NFL contract with the Vikings in January 2018. Earned a roster spot despite dealing with a hamstring injury through his first training camp and preseason. Active for all 16 games, playing multiple roles on special teams where he saw 262 snaps [58.6%]. Had one kickoff coverage tackle and his lone reception for 23 yards in the Week 7 win at New York. Played 17 snaps [1.6%] on offense. Emergency punt returner. Returned four for 26 yards, stepping in when Marcus Sherels and Chad Beebe were injured. Probably should've called a fair catch when he was rocked on a punt return attempt in Detroit, drawing a catch interference penalty. Then shouldn't have called a fair catch on his second attempt the next week against Chicago. Got a hand on a season-ending Hail Mary attempt, his second target of the season. Could have a bright future with a healthy summer and more opportunities. Turns 26 in March.

Chad Beebe (N/A) — Signed with the Vikings after participating in May rookie minicamp on a tryout. Beebe, the Northern Illinois product and son of ex-NFL receiver Don Beebe, was cut and re-signed to the practice squad after his first camp and preseason. Quick-footed slot receiver impressed with reliable hands. Promoted to the active roster for an injured Stefon Diggs in Week 9. Appeared in three games. Played 46 snaps [4.4%]. Caught all four targets for 39 yards, including 21 yards in the debut against the Lions. Missed five games due to a hamstring injury. Activated for the Week 16 win in Detroit over first-round pick Laquon Treadwell, but did not play much. Turns 25 in June.

Jeff Badet (N/A) — Signed with the Vikings as an undrafted free agent for $22,000 guaranteed out of Oklahoma. Spent all season on the practice squad. One of 10 to re-sign on a futures deal on Jan. 2.