Italy international, Nicolo Zaniolo’s brace gave Roma the edge over Porto in their Champions League last-16 first leg.
Zaniolo, one of Roma’s few bright sparks in a poor season, controlled Edin Dzeko’s pass before drilling a low effort past Iker Casillas.
He added a second from six yards out after Dzeko’s 20-yard shot hit the post.
But Porto got an away goal when Adrian Lopez scored after Tiquinho Soares’ mis-hit shot landed in his path.
Roma, who are sixth in Serie A, had the better chances, with Dzeko having a shot tipped on to the post by Casillas.
It is a first defeat for Porto – excluding penalty shootouts – in 27 games. They had won their last five Champions League matches to come through the group stages unbeaten.
The second leg in Porto is on Wednesday, 6 March.
Roma signed Zaniolo from Inter Milan for £4m (4.5m euros) in the summer as part of the £33m move that took Radja Nainggolan in the other direction.
Called up to the Italy squad before even making a Serie A appearance, he made his Roma debut against Real Madrid in the Champions League in September.
He has gone on to make 22 appearances, scoring five goals – two more than Nainggolan has managed for Inter Milan.
Against Porto, he became the youngest Italian player to score two goals in a Champions League game – and came off to a standing ovation with five minutes left.