add separate viewport implementation