The 2025 VIseu local election was held on 12 October 2025 to elect the members for Viseu City Council, Viseu Municipal Assembly and the city's 25 parish assemblies.
Incumbent Mayor Fernando Ruas, from the Social Democratic Party (PSD), ran for a second consecutive term. Former Mayor of Mangualde and former MP João Azevedo was chosen as the candidate of the Socialist Party (PS) again, after his defeat in 2021. Chega (CH) party chose the MP Bernardo Pessanha. The CDS – People's Party (CDS–PP), who once held the mayorship of the city, chose former MP and former member of the Viseu City Council, Hélder Amaral.
In a historic and upset result, the Socialist Party (PS) surpassed the PSD and won the most votes for Viseu city council, with João Azevedo becoming the first center-left mayor in Viseu's history. Incumbent mayor Fernando Ruas (PSD) failed to be elected to another term and defending the Social Democrats winning streak in the city since 1989. Chega elected a councillor, with 8.5% of the votes, and could become kingmaker in the council. Nearly 62% of all registered voters cast a ballot, the highest share since 2001.
Background In the 2021 election, the PSD held on to their majority with nearly 47% of the votes and elected 6 councillors, with former mayor Fernando Ruas, in office between 1990 and 2013, returning to the post. Ruas became the PSD mayoral candidate after the sudden death of then mayor António Almeida Henriques of COVID-19, in April 2021. The PS, led by João Azevedo, former mayor of Mangualde (2009–2019), achieved its best showing ever in Viseu with more than 38% of the votes and elected 5 councillors. The rest of parties, Chega, the Liberal Initiative, CDS – People's Party, the Left Bloc, People Animals Nature and the Unitary Democratic Coalition polled badly, all with results below 3%.
Electoral system Each party or coalition must present a list of candidates. The winner of the most voted list for the municipal council is automatically elected mayor, similar to first-past-the-post (FPTP). The lists are closed and the seats in each municipality are apportioned according to the D'Hondt method. Unlike in national legislative elections, independent lists are allowed to run.
Parties and candidates Party/Coalition Politicalposition Candidate 2021 resultRef. Votes (%) SeatsPSDSocial Democratic PartyCenter-rightFernando Ruas46.7%PSSocialist PartyCenter-leftJoão Azevedo38.3% CHEnough! Right-wingto far-right Bernardo Pessanha 3.0% IL Liberal Initiative Center-rightto right-wing Hélio Marta 2.2% CDS–PPCDS – People's PartyRight-wingHélder Amaral2.0% CDUUnitary Democratic Coalition Left-wingto far-leftLeonel Ferreira1.2% ADNNational Democratic AlternativeFar-rightPaulo Quintão
Campaign period Party slogans Party or alliance Original slogan English translation Refs PSD « Viseu Cresce com Futuro. » "Viseu Grows with a Future." PS « Nova energia para Viseu. » "New energy for Viseu." CH « Mudar Viseu. » « Change Viseu » IL « Prontos para liberalizar Viseu. » "Ready to liberalize Viseu." CDS–PP « Viseu com mais ambição. » "Viseu with more ambition." CDU « Com a CDU, futuro de confiança no concelho de Viseu. » "With CDU, future of trust in the municipality of Viseu."
Candidates' debates + 2025 Viseu local election debates Date Organisers Moderator(s) PSD PS CH IL CDS–PP CDU Refs 20 Sep 2025 RTP3 António EstevesPPPPPP
Opinion polling Polling firm/Link Fieldwork date Sample size PSD CDS PS CH IL BE CDU Lead 2025 local election 12 Oct 2025 40.9 2.042.3 8.5 1.9 1.0 3.41.52025 Legislative election18 May 202540.721.522.34.51.51.18.418.42024 EP election9 Jun 202438.329.99.88.33.51.78.58.42024 Legislative election10 Mar 202435.625.719.74.03.41.210.48.42022 Legislative election30 Jan 202236.61.939.28.23.83.61.65.12.6 2021 local election 26 Sep 2021 46.72.038.33.02.22.01.24.68.4
Results Municipal Council
| colspan="11" align=center| |- ! rowspan="2" colspan=2 style="background-color:#E9E9E9" align=left|Parties ! rowspan="2" style="background-color:#E9E9E9" align=right|Votes ! rowspan="2" style="background-color:#E9E9E9" align=right|% ! rowspan="2" style="background-color:#E9E9E9" align=right|±pp swing ! colspan="2" style="background-color:#E9E9E9" align="center"|Councillors |- style="background-color:#E9E9E9" ! style="background-color:#E9E9E9" align="center"|Total ! style="background-color:#E9E9E9" align="center"|±
|24,095||42.27||4.0||4||0
|23,292||40.86||5.8||4||1 |- |style="width: 9px" bgcolor=#202056 align="center" | |align=left|Chega |4,886||8.57||5.7||1||1
|1,119||1.96||0.1||0||0 |- |style="width: 9px" bgcolor=#00ADEF align="center" | |align=left|Liberal Initiative |1,116||1.96||0.2||0||0
|545||0.96||0.2||0||0
|165||0.29||||0|| |- |colspan=2 width="330" align=left style="background-color:#E9E9E9"|Total valid |width="50" align="right" style="background-color:#E9E9E9"|55,218 |width="40" align="right" style="background-color:#E9E9E9"|96.88 |width="40" align="right" style="background-color:#E9E9E9"|0.3 |width="40" align="right" style="background-color:#E9E9E9"|9 |width="40" align="right" style="background-color:#E9E9E9"|0 |- |colspan=2|Blank ballots |1,136||1.99||0.2||colspan=3 rowspan=4| |- |colspan=2|Invalid ballots |644||1.13||0.1 |- |colspan=2 align=left style="background-color:#E9E9E9"|Total |width="50" align="right" style="background-color:#E9E9E9"|56,998 |width="40" align="right" style="background-color:#E9E9E9"|100.00 |width="40" align="right" style="background-color:#E9E9E9"| |- |colspan=2|Registered voters/turnout ||92,583||61.56||5.1 |- | colspan=11 align=left | Source:
Municipal Assembly
| colspan="11" align=center| |- ! rowspan="2" colspan=2 style="background-color:#E9E9E9" align=left|Parties ! rowspan="2" style="background-color:#E9E9E9" align=right|Votes ! rowspan="2" style="background-color:#E9E9E9" align=right|% ! rowspan="2" style="background-color:#E9E9E9" align=right|±pp swing ! colspan="2" style="background-color:#E9E9E9" align="center"|Seats |- style="background-color:#E9E9E9" ! style="background-color:#E9E9E9" align="center"|Total ! style="background-color:#E9E9E9" align="center"|±
|22,324||39.17||5.1||12||2
|21,753||38.16||2.3||12||1 |- |style="width: 9px" bgcolor=#202056 align="center" | |align=left|Chega |6,161||10.81||6.9||3||2 |- |style="width: 9px" bgcolor=#00ADEF align="center" | |align=left|Liberal Initiative |1,552||2.72||0.0||0||0
|1,294||2.27||0.0||0||0
|1,073||1.88||1.3||0||1
|709||1.24||0.6||0||0
|197||0.35||||0|| |- |colspan=2 width="330" align=left style="background-color:#E9E9E9"|Total valid |width="50" align="right" style="background-color:#E9E9E9"|55,063 |width="40" align="right" style="background-color:#E9E9E9"|96.60 |width="40" align="right" style="background-color:#E9E9E9"|0.6 |width="40" align="right" style="background-color:#E9E9E9"|27 |width="40" align="right" style="background-color:#E9E9E9"|0 |- |colspan=2|Blank ballots |1,263||2.22||0.4||colspan=3 rowspan=4| |- |colspan=2|Invalid ballots |673||1.18||0.2 |- |colspan=2 align=left style="background-color:#E9E9E9"|Total |width="50" align="right" style="background-color:#E9E9E9"|56,999 |width="40" align="right" style="background-color:#E9E9E9"|100.00 |width="40" align="right" style="background-color:#E9E9E9"| |- |colspan=2|Registered voters/turnout ||92,583||61.57||5.1 |- | colspan=11 align=left | Source:
Parish Assemblies
|- class="unsortable" !rowspan=2|Parish!!%!!S!!%!!S!!%!!S!!%!!S!!%!!S!!%!!S !rowspan=2|TotalS |- class="unsortable" style="text-align:center;" !colspan=2 | PSD !colspan=2 | PS !colspan=2 | CH !colspan=2 | IND !colspan=2 | MPT !colspan=2 | IL |- | style="text-align:left;" | Abraveses | style="background:; color:white;"|38.7 | 6 | 36.5 | 5 | 11.3 | 1 |colspan="2" bgcolor="#AAAAAA"| |colspan="2" bgcolor="#AAAAAA"| | 6.2 | 1 | 13 |- | style="text-align:left;" | Barreiros e Cepões | 16.9 | 1 | 19.8 | 2 |colspan="2" bgcolor="#AAAAAA"| |colspan="2" bgcolor="#AAAAAA"| | style="background:; color:white;"|59.0 | 6 |colspan="2" bgcolor="#AAAAAA"| | 9 |- | style="text-align:left;" | Boa Aldeia, Farminhão e Torredeita | style="background:; color:white;"|60.9 | 6 | 35.5 | 3 |colspan="2" bgcolor="#AAAAAA"| |colspan="2" bgcolor="#AAAAAA"| |colspan="2" bgcolor="#AAAAAA"| |colspan="2" bgcolor="#AAAAAA"| | 9 |- | style="text-align:left;" | Bodiosa | style="background:; color:white;"|51.0 | 5 | 38.4 | 4 | 8.5
|colspan="2" bgcolor="#AAAAAA"| |colspan="2" bgcolor="#AAAAAA"| |colspan="2" bgcolor="#AAAAAA"| | 9 |- | style="text-align:left;" | Calde | style="background:; color:white;"|55.5 | 5 | 41.0 | 4 |colspan="2" bgcolor="#AAAAAA"| |colspan="2" bgcolor="#AAAAAA"| |colspan="2" bgcolor="#AAAAAA"| |colspan="2" bgcolor="#AAAAAA"| | 9 |- | style="text-align:left;" | Campo | style="background:; color:white;"|32.0 | 3 | 18.1 | 2 | 5.2
| 26.0 | 3 |colspan="2" bgcolor="#AAAAAA"| | 10.7 | 1 | 9 |- | style="text-align:left;" | Cavernães | style="background:; color:white;"|69.9 | 7 | 25.4 | 2 |colspan="2" bgcolor="#AAAAAA"| |colspan="2" bgcolor="#AAAAAA"| |colspan="2" bgcolor="#AAAAAA"| |colspan="2" bgcolor="#AAAAAA"| | 9 |- | style="text-align:left;" | Cota | style="background:; color:white;"|65.0 | 6 | 31.1 | 3 |colspan="2" bgcolor="#AAAAAA"| |colspan="2" bgcolor="#AAAAAA"| |colspan="2" bgcolor="#AAAAAA"| |colspan="2" bgcolor="#AAAAAA"| | 9 |- | style="text-align:left;" | Coutos de Viseu | style="background:; color:white;"|64.9 | 6 | 30.2 | 3 |colspan="2" bgcolor="#AAAAAA"| |colspan="2" bgcolor="#AAAAAA"| |colspan="2" bgcolor="#AAAAAA"| |colspan="2" bgcolor="#AAAAAA"| | 9 |- | style="text-align:left;" | Fail e Vila Chã de Sá | style="background:; color:white;"|49.2 | 5 | 37.4 | 3 | 9.8 | 1 |colspan="2" bgcolor="#AAAAAA"| |colspan="2" bgcolor="#AAAAAA"| |colspan="2" bgcolor="#AAAAAA"| | 9 |- | style="text-align:left;" | Fragosela | 30.8 |3 | 31.1 | 3 |colspan="2" bgcolor="#AAAAAA"| | style="background:#777777; color:white;"|35.4 | 3 |colspan="2" bgcolor="#AAAAAA"| |colspan="2" bgcolor="#AAAAAA"| | 9 |- | style="text-align:left;" | Lordosa | 33.4 | 3 | style="background:; color:white;"|63.0 | 6 |colspan="2" bgcolor="#AAAAAA"| |colspan="2" bgcolor="#AAAAAA"| |colspan="2" bgcolor="#AAAAAA"| |colspan="2" bgcolor="#AAAAAA"| | 9 |- | style="text-align:left;" | Mundão | style="background:; color:white;"|45.1 | 4 | 29.0 | 3 | 21.0 | 2 |colspan="2" bgcolor="#AAAAAA"| |colspan="2" bgcolor="#AAAAAA"| |colspan="2" bgcolor="#AAAAAA"| | 9 |- | style="text-align:left;" | Orgens | style="background:; color:white;"|61.0 | 6 | 33.3 | 3 |colspan="2" bgcolor="#AAAAAA"| |colspan="2" bgcolor="#AAAAAA"| |colspan="2" bgcolor="#AAAAAA"| |colspan="2" bgcolor="#AAAAAA"| | 9 |- | style="text-align:left;" | Povolide | style="background:; color:white;"|51.7 | 5 | 44.9 | 4 |colspan="2" bgcolor="#AAAAAA"| |colspan="2" bgcolor="#AAAAAA"| |colspan="2" bgcolor="#AAAAAA"| |colspan="2" bgcolor="#AAAAAA"| | 9 |- | style="text-align:left;" | Ranhados | style="background:; color:white;"|40.3 | 4 | 39.6 | 4 | 8.7 | 1 |colspan="2" bgcolor="#AAAAAA"| |colspan="2" bgcolor="#AAAAAA"| | 5.7
| 9 |- | style="text-align:left;" | Repeses e São Salvador | 34.6 | 5 | style="background:; color:white;"|52.3 | 7 | 7.1 | 1 |colspan="2" bgcolor="#AAAAAA"| |colspan="2" bgcolor="#AAAAAA"| |colspan="2" bgcolor="#AAAAAA"| | 13 |- | style="text-align:left;" | Ribafeita | style="background:; color:white;"|52.9 | 5 | 44.2 | 4 |colspan="2" bgcolor="#AAAAAA"| |colspan="2" bgcolor="#AAAAAA"| |colspan="2" bgcolor="#AAAAAA"| |colspan="2" bgcolor="#AAAAAA"| | 9 |- | style="text-align:left;" | Rio de Loba | 29.2 | 4 | style="background:; color:white;"|49.4 | 7 | 7.1 | 1 | 9.8 | 1 |colspan="2" bgcolor="#AAAAAA"| |colspan="2" bgcolor="#AAAAAA"| | 13 |- | style="text-align:left;" | Santos Evos | style="background:; color:white;"|57.6 | 6 | 36.4 | 3 | 3.6
|colspan="2" bgcolor="#AAAAAA"| |colspan="2" bgcolor="#AAAAAA"| |colspan="2" bgcolor="#AAAAAA"| | 9 |- | style="text-align:left;" | São Cipriano e Vil de Souto