added singleton implementation