TAMPA, Fla. Tampa Bay resting most of its starters for the playoffs didn't stop Carolina from treating its season finale as a meaningful game and giving Vinny Testaverde a nice send-off.
DeAngelo Williams rushed for 121 yards and two second-half touchdowns, helping the Panthers beat the NFC South champion Buccaneers 31-23 with the retiring 44-year-old Testaverde taking the last snap in the same city where he began his NFL career in 1987.
Matt Moore threw for 174 yards and two TDs for Carolina (7-9) in his third pro start, preventing Tampa Bay (9-7) from joining the 1999 St. Louis Rams as the only teams since 1970 to go unbeaten in division play the year after going winless.
Instead, the Bucs will enter the playoffs on a two-game losing streak after treating the past two weeks much like the preseason.
Williams scored on runs of 1 and 32 yards, and Moore threw TD passes of 2 yards to Christian Fauria and 20 yards to Dante Rosario for Carolina, which finished a disappointing season that's raised speculation about the future of coach John Fox.
Testaverde, the first pick in the 1987 draft by the Bucs, entered the game after the Panthers stopped Tampa Bay's final drive on downs with 35 seconds remaining. He received polite applause from what was left of a crowd of 65,609, then took a knee on the last play.
The veteran of 21 seasons hugged his wife as he left the field, saying: "That's it. It's all over."
With coach Jon Gruden intent on keeping as many regulars as possible healthy for next weekend's playoff game against the New York Giants, Tampa Bay played without seven starters five of them on offense.
Luke McCown started in place of Jeff Garcia at quarterback and running back Earnest Graham also got the day off, finishing 102 yards shy of 1,000 rushing after entering training camp as the fourth-string tailback.
With middle linebacker Barrett Ruud sitting out, Jeremiah Trotter made his first start for the Bucs after being inactive for 13 of the first 15 games.
Strong safety Jermaine Phillips also was held out of the finale by Gruden, who removed most of the remaining regulars on defense by halftime.
Moore led touchdown drives of 72 and 68 yards, and Ryne Robinson redeemed himself for fumbling a punt return deep in Carolina territory by running a kickoff back 60 yards to set up a 19-yard field goal that put the Panthers up 17-13 at the half.
The Bucs trailed at that point, mostly because of McCown's inability to get them in the end zone after Phillip Buchanon's interception and short return to the Panthers 18 and Robinson's fumble at the Carolina 17.
The fourth-year quarterback led a 98-yard drive longest in Bucs history and erased the halftime deficit on a short pass that Michael Bennett turned into a 23-yard TD. But it didn't take the Panthers long to regain the lead 24-20 on Williams' first touchdown.
Tampa Bay cut it to 24-23 on Matt Bryant's third field goal before Williams, who carried 20 times and averaged 6.1 per attempt, broke his 32-yarder around the right side to put the Panthers in front by eight with 6:24 to go.
McCown, who sacked four times, completed 21 of 28 passes for 236 yards, two touchdowns and one interception. With Graham watching from the sideline in shorts and a T-shirt, the quarterback led his team in rushing with 47 yards on five attempts.
Testaverde, one of four starting QBs the injury-riddled Panthers used this season, announced Saturday that he was retiring after the game. In six starts for Carolina, he was 94-of-172 for 952 yards, five TDs and six interceptions.
His body wore down late in the season, and he was sidelined by back pain and a right Achilles' tendon injury that kept him out of games and practices the past month.