Z wykształcenia pedagog, ukończył studia na Wydziale Humanistycznym Uniwersytetu Mikołaja Kopernika w Toruniu, gdzie później pracował jako nauczyciel akademicki w Instytucie Pedagogiki i Psychologii.
Od 1980 związany z „Solidarnością”. Wchodził w skład podziemnych władz związku w Toruniu, redagował tygodnik „Kontra”, przygotowywał audycje Radia „Solidarność”. Od 1991 pełnił etatowo funkcję wiceprzewodniczącego, a następnie przez dwie kadencje przewodniczącego zarządu Regionu Toruńskiego NSZZ „Solidarność”.
Działalność polityczną rozpoczął w Ruchu Społecznym AWS, pełniąc między innymi funkcję przewodniczącego zarządu regionu w województwie toruńskim, a później w województwie kujawsko-pomorskim. W 1997 został wybrany na posła na Sejm III kadencji z ramienia Akcji Wyborczej Solidarność. W Sejmie pełnił funkcje wiceprzewodniczącego Komisji Polityki Społecznej i Komisji Nadzwyczajnej ds. Reformy Systemu Ubezpieczeń Społecznych. Wchodził w skład stałej delegacji do Zgromadzenia Parlamentarnego Rady Europy w Strasburgu. W marcu 2000 objął funkcję sekretarza stanu w Kancelarii Prezesa Rady Ministrów. Po zakończeniu pracy w Sejmie przystąpił do SKL-RNP, pełniąc funkcję szefa partii w województwie kujawsko-pomorskim. W 2002 bez powodzenia kandydował do sejmiku tego województwa z listy Wspólnoty 2002. W 2004 wstąpił do Platformy Obywatelskiej.
Pełnił także funkcję dyrektora generalnego w Centrum Wspierania Inicjatyw Pozarządowych – Stowarzyszenie Europa Nasz Dom, będące organizatorem Narodowego Konkursu Ekologicznego „Przyjaźni Środowisku”.
W 2005 z ramienia PO został wybrany na senatora VI kadencji w okręgu toruńskim. W wyborach parlamentarnych w 2007 po raz drugi uzyskał mandat senatorski, otrzymując 103 087 głosów. W 2011 z powodzeniem ubiegał się o reelekcję, w nowym okręgu jednomandatowym dostał 40 492 głosy. W 2015 nie został wybrany na kolejną kadencję. W 2018 wystartował na radnego miejskiego w Toruniu.
W 2018 odznaczony Krzyżem Kawalerskim Orderu Odrodzenia Polski oraz Krzyżem Wolności i Solidarności.