docs: @Override
  	@Metadata
  	public Conformance getServerConformance(HttpServletRequest theRequest) {
  		if (myConformance != null && myCache) {
  			return myConformance;
  		}
  
  		Conformance retVal = new Conformance();
  
  		retVal.setPublisher(myPublisher);
  		retVal.setDate(conformanceDate());
  		retVal.setFhirVersion(FhirVersionEnum.DSTU1.getFhirVersionString());
  		retVal.setAcceptUnknown(false); // TODO: make this configurable - this is a fairly big effort since the parser needs to be modified to actually allow it
  		
  		retVal.getImplementation().setDescription(myServerConfiguration.getImplementationDescription());
  		retVal.getSoftware().setName(myServerConfiguration.getServerName());
  		retVal.getSoftware().setVersion(myServerConfiguration.getServerVersion());
  		retVal.addFormat(Constants.CT_FHIR_XML);
  		retVal.addFormat(Constants.CT_FHIR_JSON);
  
  		Rest rest = retVal.addRest();
  		rest.setMode(RestfulConformanceModeEnum.SERVER);
  
  		Set<RestfulOperationSystemEnum> systemOps = new HashSet<RestfulOperationSystemEnum>();
  
  		List<ResourceBinding> bindings = new ArrayList<ResourceBinding>(myServerConfiguration.getResourceBindings());
  		Collections.sort(bindings, new Comparator<ResourceBinding>() {
  			@Override
  			public int compare(ResourceBinding theArg0, ResourceBinding theArg1) {
  				return theArg0.getResourceName().compareToIgnoreCase(theArg1.getResourceName());
  			}
  		});
  
  		for (ResourceBinding next : bindings) {
  
  			Set<RestfulOperationTypeEnum> resourceOps = new HashSet<RestfulOperationTypeEnum>();
  			RestResource resource = rest.addResource();
  
  			String resourceName = next.getResourceName();
  			RuntimeResourceDefinition def = myServerConfiguration.getFhirContext().getResourceDefinition(resourceName);
  			resource.getType().setValue(def.getName());
  			ServletContext servletContext  = (ServletContext) (theRequest == null ? null : theRequest.getAttribute(RestfulServer.SERVLET_CONTEXT_ATTRIBUTE));
  			String serverBase = myServerConfiguration.getServerAddressStrategy().determineServerBase(servletContext, theRequest);
              resource.getProfile().setReference(new IdDt(def.getResourceProfile(serverBase)));
  
  			TreeSet<String> includes = new TreeSet<String>();
  
  			// Map<String, Conformance.RestResourceSearchParam> nameToSearchParam = new HashMap<String,
  			// Conformance.RestResourceSearchParam>();
  			for (BaseMethodBinding<?> nextMethodBinding : next.getMethodBindings()) {
  				if (nextMethodBinding.getRestOperationType() != null) {
  					RestfulOperationTypeEnum resOp = RestfulOperationTypeEnum.VALUESET_BINDER.fromCodeString(nextMethodBinding.getRestOperationType().getCode());
  					if (resOp != null) {
  						if (resourceOps.contains(resOp) == false) {
  							resourceOps.add(resOp);
  							resource.addOperation().setCode(resOp);
  						}
  					}
  	
  					RestfulOperationSystemEnum sysOp = RestfulOperationSystemEnum.VALUESET_BINDER.fromCodeString(nextMethodBinding.getRestOperationType().getCode());
  					if (sysOp != null) {
  						if (systemOps.contains(sysOp) == false) {
  							systemOps.add(sysOp);
  							rest.addOperation().setCode(sysOp);
  						}
  					}
  				}
  				
  				if (nextMethodBinding instanceof SearchMethodBinding) {
  					handleSearchMethodBinding(rest, resource, resourceName, def, includes, (SearchMethodBinding) nextMethodBinding);
  				} else if (nextMethodBinding instanceof DynamicSearchMethodBinding) {
  					handleDynamicSearchMethodBinding(resource, def, includes, (DynamicSearchMethodBinding) nextMethodBinding);
  				}
  
  				Collections.sort(resource.getOperation(), new Comparator<RestResourceOperation>() {
  					@Override
  					public int compare(RestResourceOperation theO1, RestResourceOperation theO2) {
  						RestfulOperationTypeEnum o1 = theO1.getCode().getValueAsEnum();
  						RestfulOperationTypeEnum o2 = theO2.getCode().getValueAsEnum();
  						if (o1 == null && o2 == null) {
  							return 0;
  						}
  						if (o1 == null) {
  							return 1;
  						}
  						if (o2 == null) {
  							return -1;
  						}
  						return o1.ordinal() - o2.ordinal();
  					}
  				});
  
  			}
  
  			for (String nextInclude : includes) {
  				resource.addSearchInclude(nextInclude);
  			}
  
  		}
  
  		myConformance = retVal;
  		return retVal;
  	}