docs: function createSiteCommands(serviceRegistry, commandService) {
  		
  		var dialogService = serviceRegistry.getService("orion.page.dialog"), //$NON-NLS-0$
  		    progressService = serviceRegistry.getService("orion.page.progress"); //$NON-NLS-0$
  		
  		var editCommand = new Command({
  			name: messages["Edit"],
  			tooltip: messages["Edit the site configuration"],
  			imageClass: "core-sprite-edit", //$NON-NLS-0$
  			id: "orion.site.edit", //$NON-NLS-0$
  			visibleWhen: function(item) {
  				if (item instanceof Array && item.length === 1) {
  					item = item[0];
  				}
  				
  				return item.HostingStatus;
  			},
  			hrefCallback: function(data) {
  				var item = (data.items instanceof Array ? data.items[0] : data.items);
  				return mSiteUtils.generateEditSiteHref(item);
  			}
  		});
  		commandService.addCommand(editCommand);
  
  		var userDataErr = 'userData.site requires a single site configuration to act upon'; //$NON-NLS-0$
  		var startCommand = new Command({
  			name: messages["Start"],
  			tooltip: messages["Start the site"],
  			imageClass: "core-sprite-start", //$NON-NLS-0$
  			id: "orion.site.start", //$NON-NLS-0$
  			visibleWhen: function(item) {
  				return wrap(item).some(function(s) {
  					return s.HostingStatus && s.HostingStatus.Status === "stopped"; //$NON-NLS-0$
  				});
  			},
  			/**
  			 * @param {SiteConfiguration} [userData.site] If passed, we'll mutate this site config.
  			 * @param {Function} [userData.startCallback]
  			 * @param {Function} [userData.errorCallback]
  			 */
  			callback: function(data) {
  				var items = wrap(data.items);
  				var userData = data.userData;
  				if (userData.site && items.length > 1) {
  					throw new Error(userDataErr);
  				}
  				var starts = items.map(function(item) {
  					var newItem = userData.site || {} /* just update the HostingStatus */;
  					newItem.HostingStatus = { Status: "started" }; //$NON-NLS-0$
  					var location = item.Location;
  					var siteService = mSiteClient.forLocation(serviceRegistry, location);
  					return siteService.updateSiteConfiguration(location, newItem);
  				});
  				progressService.showWhile(Deferred.all(starts))
  					.then(unwrap(data.items))
  					.then(userData.startCallback, userData.errorCallback);
  			}});
  		commandService.addCommand(startCommand);
  
  		/**
  		 * @param {Boolean} overwrite If true, the entire site configuration will be saved.
  		 * If false, only its HostingStatus field will be modified.
  		 * @param {SiteConfiguration} item
  		 */
  		var stopSite = function(overwrite, site) {
  			var newItem = overwrite ? site : {};
  			newItem.HostingStatus = { Status: "stopped" }; //$NON-NLS-0$
  			var location = site.Location;
  			var siteService = mSiteClient.forLocation(serviceRegistry, location);
  			return siteService.updateSiteConfiguration(location, newItem);
  		};
  
  		var stopCommand = new Command({
  			name: messages["Stop"],
  			tooltip: messages["Stop the site"],
  			imageClass: "core-sprite-stop", //$NON-NLS-0$
  			id: "orion.site.stop", //$NON-NLS-0$
  			visibleWhen: function(item) {
  				return wrap(item).some(function(s) {
  					return s.HostingStatus && s.HostingStatus.Status === "started"; //$NON-NLS-0$
  				});
  			},
  			/**
  			 * @param {SiteConfiguration} [data.userData.site] If passed, we'll mutate this site config.
  			 * @param {Function} [data.userData.stopCallback]
  			 * @param {Function} [data.userData.errorCallback]
  			 */
  			callback: function(data) {
  				var items = wrap(data.items);
  				var userData = data.userData;
  				if (userData.site && items.length > 1) {
  					throw new Error(userDataErr);
  				}
  				items = items || [userData.site];
  				var stops = items.map(stopSite.bind(null, !!userData.site));
  				progressService.showWhile(Deferred.all(stops))
  					.then(unwrap(data.items))
  					.then(userData.stopCallback, userData.errorCallback);
  			}});
  		commandService.addCommand(stopCommand);
  
  		var deleteCommand = new Command({
  			name: messages["Delete"],
  			tooltip: messages["Delete the site configuration"],
  			imageClass: "core-sprite-delete", //$NON-NLS-0$
  			id: "orion.site.delete", //$NON-NLS-0$
  			visibleWhen: function(items) {
  				return wrap(items).length > 0;
  			},
  			/**
  			 * @param {Function} [data.userData.deleteCallback]
  			 * @param {Function} [data.userData.errorCallback]
  			 */
  			callback: function(data) {
  				var items = wrap(data.items);
  				var userData = data.userData;
  				var itemName  = (items.length === 1) ? items[0].Name : '';
  				if (bidiUtils.isBidiEnabled()) {
  					itemName = bidiUtils.enforceTextDirWithUcc(itemName);
  				}
  				var msg = (items.length === 1)
  					? formatMessage(messages.ConfirmDeleteSingle, itemName)
  					: formatMessage(messages.ConfirmDeleteMultiple, items.length);
  				dialogService.confirm(msg, function(confirmed) {
  					if (confirmed) {
  						var deletes = items.map(function(item) {
  							// First stop the site if necessary
  							var maybeStop = (item.HostingStatus && item.HostingStatus.Status !== "stopped") ? stopSite(false, item) : item;
  							return Deferred.when(maybeStop).then(function() {
  								var location = item.Location;
  								var siteService = mSiteClient.forLocation(serviceRegistry, location);
  								return siteService.deleteSiteConfiguration(location);
  							});
  						});
  						Deferred.all(deletes).then(unwrap(data.items)).then(userData.deleteCallback, userData.errorCallback);
  					}
  				}, data.domNode);
  			}});
  		commandService.addCommand(deleteCommand);
  	}