BaseTreeItem which is the base view model for all tree items. Then, BasePhysicalTreeItem (contains a File Path) which PhsyicalTreeFile and PhsyicalTreeFolder (which stores child BaseTreeItems) both extend.ZipTreeFile or MyCustomCompressionTreeFile or TextDocumentTreeFile. ZipTreeFile would contain a collection of children (similar to PhysicalTreeFolder), but they would be of type BaseZipEntryViewModel (which extends BaseTreeItem) so that it can store a reference to the owning Zip file and other stuff to. TextDocumentTreeFile, one for a physical file, and one for a zipped file: