modified abstract implementation
modified abstract implementation (merged)
modified abstract implementation (merged once again...)