Do not dispose the underlying Timer every time the Enabled is set to false, keep it around for as long as this Timer exists. Throw ObjectDisposedException on Enabled setter. ArgumentException throwing according to docs. Removed 'disposed' field. DueTime for underlying timer changes only if enabled (as per docs). Check for already disposed in Dispose(). Not firing Elapsed if disposed. Unit tests.