A year ago, general manager John Lynch and coach Kyle Shanahan inherited a mess.

The 49ers won five consecutive games to finish the season at 6-10. They may have improved their roster and schemes on both sides of the ball, but many of the 49ers' needs at the beginning of the 2017 offseason remain positions that require strengthening.

Coming off a 2-14 season that led to the firings of coach Chip Kelly and general manager Trent Baalke, the 49ers’ roster was in shambles.

Here is a look at the 49ers’ needs a year ago and where the 49ers stand at the beginning of the 2018 offseason at those same positions:

Quarterback

Then: The 49ers had no interest in retaining Colin Kaepernick, Blaine Gabbert or Christian Ponder. Quarterback was the top priority a year ago. And on the first day of the free-agent signing period, Shanahan targeted Brian Hoyer. The team also signed Matt Barkley and selected C.J. Beathard in the draft.

Now: Hoyer and Barkley are long gone. But, thanks to New England’s football czar Bill Belichick's generosity, the 49ers have their franchise quarterback. The team could keep Jimmy Garoppolo and Beathard as their top two QBs for the foreseeable future.

Wide receiver

Then: The 49ers likely had the worst grouping of wideouts in the league. One of the first moves of the new regime was the retain the club’s leading receiver from 2016, signing slot receiver Jeremy Kerley to a three-year extension. Kerley did not even make it to the regular season, as rookie Trent Taylor beat him out. On the first day of free agency, the 49ers signed Pierre Garçon, Marquise Goodwin and Aldrick Robinson.

Now: The 49ers still have a need at wide receiver, but it’s more nuanced. They can use a tall athlete who can be a presence in the red zone. Perhaps, the 49ers can find an underachieving veteran who Shanahan believes can shine in his offense. Or, the 49ers could just wait to draft a player to develop.

Edge rusher

Then: Ahmad Brooks was still good for a half-dozen sacks and Aaron Lynch was still considered an exceptionally talented player with tons of promise. But the new 49ers regime did not view either player as reliable. The 49ers signed veteran Elvis Dumervil to a two-year contract and used a sixth-round pick on Pita Taumoepenu.

Now: Brooks was cut in late-August and Lynch never stepped to the plate. Dumervil led the 49ers with 6.5 sacks. Nothing has really changed since the 49ers released Aldon Smith nearly three years ago. An outside pass-rusher is required for the 49ers’ defense to take the next step in defensive coordinator Robert Saleh’s scheme.

Cornerback

Then: The 49ers released their top cornerback, Tramaine Brock, after an alleged domestic violence incident. (Brock was later cleared.) That incident occurred three weeks after the start of free agency and three weeks before the draft. The 49ers decided to move Jimmie Ward to free safety, a position they continue to believe best suits him. Rashard Robinson was penciled in as a starter. Then, the club drafted Ahkello Witherspoon in the third round. Witherspoon had a good rookie season, but Robinson experienced a meltdown that led to the team’s decision to trade him to the New York Jets in late-October. Nickel back K’Waun Williams was a quality addition, as the 49ers signed him to a three-year extension through the 2020 season just a couple weeks into the regular season.

Now: Cornerback was a glaring weakness for the 49ers throughout the season. The 49ers believe Witherspoon has a bright future. But there do not appear to be any other starter-caliber players in the organization. Dontae Johnson struggled mightily late in the season, and it appears unlikely the team will place a priority on re-signing him. The team needs a starter and quality backups, too.

Linebacker

Then: Veteran NaVorro Bowman was returning from a torn Achilles, and it was uncertain if he could return to anywhere near his pre-injury form. One of the last moves of the previous regime was to sign Ray-Ray Armstrong to a contract extension. Malcolm Smith was the 49ers’ biggest defensive free-agent acquisition. The team added Brock Coyle to work as a backup, as well as a core special-teamer. Then, the club traded up to No. 31 to select Reuben Foster. The 49ers began reducing Bowman's playing time to take him off the field in passing situations. He was not pleased with his demotion. The 49ers decided to release him. Armstrong was also released. The club finished the season with Foster and Coyle as the starters.

Now: Smith missed the season with a torn pectoral he sustained in training camp. He and Foster are expected to be the starters. The 49ers are lacking quality depth at the inside spots.

Offensive guard

Then: Joshua Garnett had just finished an uninspiring rookie season, and there were legitimate questions if his style was a fit for Shanahan’s scheme. The staff figured an upgrade was needed at the other guard spot, where Zane Beadles started in 2016. In May, the 49ers signed veteran Brandon Fusco to a one-year contract. Fusco ended up as a starter. Garnett was ruled out for the season late in training camp, and the 49ers executed a trade with the Detroit Lions for Laken Tomlinson.

Now: There is optimism Tomlinson can improve into the kind of consistent performer Shanahan requires from the guard positions. But there will be competition, for sure. Garnett has tried to reshape his body to enter the competition this offseason. The 49ers will undoubtedly try to get better. Center Daniel Kilgore is scheduled for free agency. Also, the 49ers have to begin making plans for the future at the tackle positions. Joe Staley finished the season strong, but he enters his 12th season. Trent Brown is coming up on his contract year, and it’s uncertain whether he will be back in 2019.

Running back

Then: The 49ers had no depth behind Carlos Hyde in 2016. And Hyde was entering his contract year. The 49ers signed veteran Tim Hightower, traded for Kapri Bibbs, drafted Joe Williams and signed undrafted rookie Matt Breida.

Now: Hightower and Bibbs were cut before the start of the season. Hyde’s status with the organization remains uncertain, as he is scheduled to hit the open market. He said he wants to return. And it appears the 49ers want him back, but only at the right price. The team desires more playmaking ability. Breida will be back, and Williams gets his chance to earn a job after sitting out the season with a minor foot injury. Running back figures to be a need that could be addressed as late as the final day of the draft.

Tight end

Then: The 49ers inexplicably signed Vance McDonald to a contract extension in December 2016. The new regime signed blocking specialist Logan Paulsen, selected George Kittle in the draft, then signed undrafted rookie Cole Hikutini. Before the season began, McDonald was dealt to the Pittsburgh Steelers.

Now: Veteran Garrett Celek and Kittle came on strong late in the season after Garoppolo took over at quarterback. On the list of 49ers priorities for the offseason, tight end ranks down the list.

Kicker

Then: Veteran Phil Dawson was a free agent after wrapping up an impressive four-year run with the organization. Dawson joined the Arizona Cardinals, and the 49ers signed Robbie Gould to take his place.

Now: Gould, 35, is signed through the upcoming season. He led the NFL with 39 made field goals and had only two misses. He also kicked two game-winners as part of the 49ers’ season-ending five-game win streak.