He began his career as a child actor, appearing in This Man Craig, Dr. Finlay's Casebook and Madame Bovary. Giving up his intention to become a photographer, he studied the junior course at the Royal Scottish Academy of Dramatic Arts and became a full-time professional, appearing in Armchair Theatre, Timeslip, The Liver Birds, Play for Today, Sutherland's Law, Last of the Summer Wine, a regular role in the national service comedy Get Some In!, Strike It Rich!, Lovejoy, The Tales of Para Handy, Nice Day at the Office, a regular role in Hamish Macbeth, Life Support, Dalziel and Pascoe, Heartbeat, To the Ends of the Earth, Taggart, The Field of Blood, a regular role in Rab C, Nesbitt, The Musketeers and Jonathan Strange & Mr Norrell.
He has appeared in many films, being a favourite performer of director Lindsay Anderson who cast him in If..., O Lucky Man! and Britannia Hospital. Other film roles include parts in Amadeus, A Christmas Carol, Heavenly Pursuits, Little Dorrit, The Great Escape II: The Untold Story, Loch Ness, The House of Mirth, The Rocket Post, Vanity Fair and Lassie.
On the stage, he has appeared in The Bevellers, The House, The Misanthrope, The Ship, Don't Fool With Love, Love Lies Bleeding, Waiting for Godot, The King of Scotland, Uncle Vanya, The Fairy Queen, Scenes Unseen, Yer Granny, Ivanov and Life of Galileo.
Radio work includes Afternoon Theatre, Dr Finlay: Adventures of a Black Bag, The Name of the Rose and readings for Poetry Please.