Gagner's new contract will reportedly pay him an average of $4.8 million US per season.
The deal allows the 23-year-old centre and the Oilers to avoid a salary-arbitration hearing that was scheduled for later in the day. Gagner, who made $2.275 million last season, reportedly was asking for $5.5 million a year, with Edmonton offering $3.5 million.
Gagner had 14 goals and 24 assists in 48 games last season, for an average of 0.79 points per game. In his previous five NHL seasons, all with Edmonton, he averaged 15 goals, 29 assists and 73 games played, for an average of 0.60 points per game.
"So happy to remain an Edmonton Oiler for at least three more years," Gagner tweeted. "Thanks to everyone for the support. Time to get to work."