internal save