code: private ZooClassDef newVersion(ClientSessionCache cache, ZooClassDef newSuper) {
  		if (nextVersion != null) {
  			throw new IllegalStateException();
  		}
  
  		if (newSuper == null) {
  			//no new version of super available
  			newSuper = superDef; 
  		}
  		
  		long oid = jdoZooGetContext().getNode().getOidBuffer().allocateOid();
  		ZooClassDef newDef = new ZooClassDef(className, oid, newSuper.getOid(), schemaId,
  		        versionId + 1);
  
  		//super-class
  		newDef.associateSuperDef(newSuper);
  		
  		//caches
  		cache.addSchema(newDef, false, jdoZooGetContext().getNode());
  		
  		//versions
  		newDef.prevVersionOid = jdoZooGetOid();
  		newDef.prevVersion = this;
  		nextVersion = newDef;
  		
  		//API class
  		newDef.versionProxy = versionProxy;
  		versionProxy.newVersion(newDef);
  		
  		//context
  		newDef.providedContext = 
  			new PCContext(newDef, providedContext.getSession(), providedContext.getNode());
  		
  		//fields
  		for (ZooFieldDef f: localFields) {
  			ZooFieldDef fNew = new ZooFieldDef(f, newDef);
  			newDef.localFields.add(fNew);
  			if (fNew.getProxy() != null) {
  				fNew.getProxy().updateVersion(fNew);
  			}
  		}
  		newDef.associateFields();
  		
  		return newDef;
  	}
docs: Schema versioning: We only create new schema instance when we add or remove fields.
  Renaming a field should not result in a new version!
  A new version is only required when the modified schema does not match the stored data. Such
  changes require also new versions of all sub-classes.
  WHY? If every class stored only their own fields would we still have a problem? Yes,
  because the new version of the referenced superclass has a different OID.
  @param cache
  
  @return New version.