Each kind of project in the system needs to be loaded by a {@link org.netbeans.spi.project.ProjectFactory}, which defines how to recognize projects on disk, load their metadata into memory, and save their metadata back to disk. {@link org.netbeans.spi.project.ProjectState} is used to let the factory mark a project as being modified in memory.
Projects will normally put implementations of several interfaces such as {@link org.netbeans.spi.project.ActionProvider} into their lookup.