diff --git a/xCAT-UI/js/configure/discover.js b/xCAT-UI/js/configure/discover.js
index 8c55d67db..c208103c8 100644
--- a/xCAT-UI/js/configure/discover.js
+++ b/xCAT-UI/js/configure/discover.js
@@ -1,28 +1,39 @@
 /*associate the step name with step number*/
 var steps = ['Discover Hardware', 
              'Cluster Patterns',
-             'Switch Ports',
+             'Supernode Numbers',
              'More Cluster Patterns',
-             'Prepare Management Node',
              'Power On Hardware',
-             'Discover HW Control Points',
+             'Discover Frames',
+             'Prepare Management Node',
              'Update Definitions',
-             'Configure HW Control Points',
-             'Create Nodes',
+             'Create Lpars',
              'Complete'];
 
 /*associate the function with step number*/
 var initFunctions = [initSelectPlatform,
                      initBasicPattern,
-                     initSwitch,
-                     initAdvancedPattern];
+                     initSupernode,
+                     initSiteTable,
+                     initPoweronHardware,
+                     initDiscoverFrames,
+                     initConfig,
+                     initUpdateDefinition,
+                     initCreateLpar,
+                     complete];
 
 /*associate the function witch should be called before the page changed(when click next or back)
  * if there is no need to call functions, use undefined.*/
-var nextFunctions = [undefined,
+var nextFunctions = [getPlatform,
+                     checkBasicPattern,
+                     checkSupernode,
+                     checkSiteTable,
+                     undefined,
+                     checkFrameMtms,
+                     undefined,
+                     undefined,
                      collectInputValue,
-                     collectInputValue,
-                     collectInputValue];
+                     undefined];
 /*save current step number*/
 var currentStep = 0;
 
@@ -81,7 +92,7 @@ function createDiscoverButtons(){
 	cancelButton.bind('click', function(){
 		$('#discoverTab').empty();
 		for (var name in discoverEnv){
-			delete discoverEnv[name];
+			removeDiscoverEnv(name);
 		}
 		loadDiscoverPage();
 	});
@@ -106,6 +117,7 @@ function createDiscoverButtons(){
  * @return
  */
 function createNextButton(){
+	var tempFlag = true;
 	if ((steps.length - 1) == currentStep){
 		return undefined;
 	}
@@ -113,11 +125,15 @@ function createNextButton(){
 	var nextButton = createButton('Next');
 	nextButton.bind('click', function(){
 		if (nextFunctions[currentStep]){
-			nextFunctions[currentStep]();
+			tempFlag = nextFunctions[currentStep]('next');
+		}
+		
+		if (!tempFlag){
+			return;
 		}
 		currentStep ++;
 		updateDiscoverStep();
-		initFunctions[currentStep]();
+		initFunctions[currentStep]('next');
 	});
 	
 	return nextButton;
@@ -131,6 +147,7 @@ function createNextButton(){
  * @return
  */
 function createBackButton(){
+	var tempFlag = true;
 	if (0 == currentStep){
 		return undefined;
 	}
@@ -138,11 +155,16 @@ function createBackButton(){
 	var backButton = createButton('Back');
 	backButton.bind('click', function(){
 		if (nextFunctions[currentStep]){
-			nextFunctions[currentStep]();
+			tempFlag = nextFunctions[currentStep]('back');
 		}
+		
+		if (!tempFlag){
+			return;
+		}
+		
 		currentStep--;
 		updateDiscoverStep();
-		initFunctions[currentStep]();
+		initFunctions[currentStep]('back');
 	});
 	
 	return backButton;
@@ -166,6 +188,35 @@ function getDiscoverEnv(envName){
 		return '';
 	}
 }
+
+/**
+ * set the input value on discover page
+ * 
+ * @param 
+ *        envName :  value's name(discoverEnv's key)
+ * 	      envValue:  value
+ * @return null.
+ */
+function setDiscoverEnv(envName, envValue){
+	if (envName){
+		discoverEnv[envName] = envValue;
+	}
+}
+
+/**
+ * delete the input value on discover page
+ * 
+ * @param 
+ *        envName :  value's name(discoverEnv's key)
+ * 
+ * @return null.
+ */
+function removeDiscoverEnv(envName){
+	if (discoverEnv[envName]){
+		delete discoverEnv[envName];
+	}
+}
+
 /**
  * Expand the noderange into node names.
  * 
@@ -239,6 +290,29 @@ function expandNR(nodeRange){
 	return retArray;
 }
 
+/**
+ * collect all inputs' value from the page
+ * 
+ * @param 
+ * 
+ * @return true: this step is correct, can go to the next page
+ *         false: this step contains error.
+ */
+function collectInputValue(){
+	$('#discoverContentDiv input[type=text]').each(function(){
+		var name = $(this).attr('name');
+		var value = $(this).attr('value');
+		if('' != value){
+			setDiscoverEnv(name, value);
+		}
+		else{
+			removeDiscoverEnv(name);
+		}
+	});
+	
+	return true;
+}
+
 /**
  * Step 1: show the wizard's function 
  *         platform selector(system P or system X)
@@ -249,20 +323,44 @@ function expandNR(nodeRange){
  */
 function initSelectPlatform(){
 	var temp = '';
+	var type = '';
 	$('#discoverContentDiv').empty();
-	temp += '<h2>' + steps[currentStep] + '</h2>';
+	$('.tooltip').remove();
+	temp += '<div style="min-height:360px"><h2>' + steps[currentStep] + '</h2>';
 	temp += '<p>This wizard will guide you through the process of defining the naming conventions within' + 
 		'your cluster, discovering the hardware on your network, and automatically defining it in the xCAT' +
 		'database.<br/>Choose which type of hardware you want to discover, and then click Next.</p>';
 	
 	temp += '<input type="radio" name="platform" disabled="true"><span  style="color:gray;"> System x hardware (not implemented yet)</span></input><br/>';
-	temp += '<input type="radio" name="platform" checked="checked"> System p hardware (only partially implemented)</input><br/>';
-	temp += '<br/><br/><br/><br/><br/>';
+	temp += '<input type="radio" name="platform" id="ih"> System p hardware (P7 IH)</input><br/>';
+	temp += '<input type="radio" name="platform" id="nonih"> System p hardware (Non P7 IH)</input><br/>';
+	temp += '</div>';
 	$('#discoverContentDiv').append(temp);
 	
+	if (getDiscoverEnv('machineType')){
+		type = getDiscoverEnv('machineType');
+	}
+	else{
+		type = 'ih';
+	}
+	
+	$('#discoverContentDiv #' + type).attr('checked', 'checked');
 	createDiscoverButtons();
 }
 
+/**
+ * Step 1: Get the platform type
+ * 
+ * @param 
+ * 
+ * @return
+ */
+function getPlatform(){
+	var radioValue = $('#discoverContentDiv :checked').attr('id');
+	setDiscoverEnv('machineType', radioValue);
+
+	return true;
+}
 /**
  * Step 2: Cluster basic patterns 
  *         users can input the switches' name range, the number of port, start ip and port prefix
@@ -276,117 +374,1159 @@ function initSelectPlatform(){
  */
 function initBasicPattern(){
 	$('#discoverContentDiv').empty();
-	var showString = '<h2>' + steps[currentStep] + '</h2>';
+	$('.tooltip').remove();
+	var showString = '<div style="min-height:360px" id="patternDiv"><h2>' + steps[currentStep] + '</h2>';
 	showString += '<table><tbody>';
-	//switch title
-	showString += '<tr><th colspan=5>Service LAN Switches</th></tr>';
-	//switch name 
-	showString += '<tr><td>Hostname Range:</td><td><input type="text" title="Format: Node[1-10] or Node1-Node10" name="switchName" value="' + getDiscoverEnv('switchName') + '"></input></td>';
-	showString += '<td width=20></td>';
-	//switch start ip	
-	showString += '<td>Starting IP Address:</td><td><input type="text" name="switchIp" value="' + getDiscoverEnv('startIp') + '"></td></tr>';
-	//Number of Ports Per Switch
-	showString += '<tr><td>Number of Ports Per Switch:</td><td><input type="text" name="portNumPerSwitch" value="' + getDiscoverEnv('portNumPerSwitch') + '"></td>';
-	showString += '<td width=20></td>';
-	//ports' name prefix
-	showString += '<td>Switch Port Prefix:</td><td><input type="text" title="a" name="portPrefix" value="' + getDiscoverEnv('portPrefix') + '"></td></tr>';
-	//hmc title
-	showString += '<tr><th colspan=5>HMCs</th></tr>';
-	//hmc name
-	showString += '<tr><td>Hostname Range:</td><td><input type="text" title="Format: Node[1-10] or Node1-Node10" name="hmcName" value="' + getDiscoverEnv('hmcName') + '"></td>';
-	showString += '<td width=20></td>';
-	//hmc start ip
-	showString += '<td>Starting IP Address:</td><td><input type="text" name="hmcIp" value="' + getDiscoverEnv('hmcIp') + '"></td></tr>';
-	//Number of Frames per HMC
-	showString += '<tr><td>Number of Frames per HMC:</td><td><input type="text" name="bpaNumPerHmc" value="' + getDiscoverEnv('bpaNumPerHmc') + '"></td></tr>';
-	//BPA title
-	showString += '<tr><th colspan=5>Frames (BPAs)</th></tr>';
-	//BPA Name
-	showString += '<tr><td>Hostname Range:</td><td><input type="text" title="Format: Node[1-10] or Node1-Node10" name="bpaName" value="' + getDiscoverEnv('bpaName') + '"></td>';
-	showString += '<td width=20></td>';
-	//BPA start ip
-	showString += '<td>Starting IP Address:</td><td><input type="text" name="bpaIp" value="' + getDiscoverEnv('bpaIp') + '"></td></tr>';
-	//Number of Drawers per Frame
-	showString += '<tr><td>Number of Drawers per Frame:</td><td><input type="text" name="fspNumPerBpa" value="' + getDiscoverEnv('fspNumPerBpa') + '"></td></tr>';
-	//FSP title
-	showString += '<tr><th colspan=5>Drawers (FSPs/CECs)</th></tr>';
-	//FSP name
-	showString += '<tr><td>Hostname Range:</td><td><input type="text" title="Format: Node[1-10] or Node1-Node10" name="fspName" value="' + getDiscoverEnv('fspName') + '"></td>';
-	showString += '<td width=20></td>';
-	//FSP start ip
-	showString += '<td>Starting IP Address:</td><td><input type="text" name="fspIp" value="' + getDiscoverEnv('fspIp') + '"></td></tr>';
+	//Frame title
+	showString += '<tr><td><h3>Frames:</h3></td></tr>';
+	//Frame Name
+	showString += '<tr><td>Name Range:</td><td><input type="text" title="Format: Frame[1-6] or F1-F6" ' +
+				  'name="frameName" value="' + getDiscoverEnv('frameName') + '"></td>';
+	//use the super node configure file to calculate the cec's number
+	showString += '<td></td><td></td></tr>';
+
+	//CEC title
+	showString += '<tr><td><h3>Drawers:</h3></td></tr>';
+	//CEC name
+	showString += '<tr><td>Name Range:</td><td><input type="text" title="Format: CEC[1-60] or F[1-6]C[1-10]" ' +
+			      'name="cecName" value="' + getDiscoverEnv('cecName') + '"></td>';
 	//Number of LPARs per Drawer:
-	showString += '<tr><td>Number of LPARs per Drawer:</td><td><input type="text" name="lparNumPerFsp" value="' + getDiscoverEnv('lparNumPerFsp') + '"></td></tr>';
-	showString += '</tbody></table>';
+	showString += '<td>Number of LPARs per Drawer:</td><td><input type="text" name="lparNumPerCec" value="' + 
+				  getDiscoverEnv('lparNumPerCec') + '"></td></tr>';
+
+	//Lpar title
+	showString += '<tr><td><h3>Lpars:</h3></td></tr>';
+	//lpar name
+	showString += '<tr><td>Name Range:</td><td><input type="text" title="Format: F[1-6]C[1-10]L[1-8]" ' + 
+				  'name="lparName" value="' + getDiscoverEnv('lparName') + '"></td><td></td><td></td></tr>';
+	
+	//hmc title
+	showString += '<tr><td><h3>HMCs:</h3></td></tr>';
+	//hmc name
+	showString += '<tr id="hmcTr"><td>Name Range:</td><td><input type="text" title="Format: HMC[01-10] or HMC01-HMC10" name="hmcName" value="' + getDiscoverEnv('hmcName') + '"></td>';
+	//Number of Frames per HMC
+	showString += '<td>Number of Frames per HMC:</td><td><input type="text" name="frameNumPerHmc" value="' + 
+				  getDiscoverEnv('frameNumPerHmc') + '"></td></tr>';
+	showString += '<tr><td>Hardware Managment:</td><td><input type="radio" name="managetype" value="hmc" title="Hardware Management Console">HMC&nbsp;&nbsp;';
+	showString += '<input type="radio" name="managetype" value="dfm" title="Direct FSP Management">DFM</td></tr>';
+	showString += '</tbody></table></div>';
+	
 	$('#discoverContentDiv').append(showString);
-	$('#discoverContentDiv input[type=text][title]').tooltip({
+	
+	$('#discoverContentDiv [title]').tooltip({
 		position: "center right",
 		offset: [-2, 10],
 		effect: "fade",
 		opacity: 1
 	});
+	
+	//change the radio inputs' checked status
+	if (getDiscoverEnv('hmcFlag')){
+		$('#discoverContentDiv :radio[value=hmc]').attr('checked', 'checked');
+	}
+	else{
+		$('#discoverContentDiv :radio[value=dfm]').attr('checked', 'checked');
+	}
+	
 	createDiscoverButtons();
 }
 
 /**
- * Step 2: Cluster basic patterns 
- *         save all of users' input into the global object discoverEnv
- * 
+ * Step 2: check basic patterns 
+ * 			when user input the basic patterns, we should check if the input is correct. 
  * @param 
  * 
  * @return
  */
-function collectInputValue(){
-	$('#discoverContentDiv input[type=text]').each(function(){
-		var name = $(this).attr('name');
-		var value = $(this).attr('value');
-		if('' != value){
-			discoverEnv[name] = value;
-		}
-		else{
-			if(discoverEnv[name]){
-				delete discoverEnv[name];
-			}
-		}
-	});
+function checkBasicPattern(operType){
+	collectInputValue();
+
+	//click back button, do not need check, only collect input value is ok.
+	if ('back' == operType){
+		return true;
+	}
 	
-	return;
+	$('#patternDiv .ui-state-error').remove();
+	
+	var errMessage = '';
+	var tempName = '';
+	var frameNum = 0;
+	var cecNum = 0;
+	var lparNum = 0;
+	var hmcNum = 0;
+	var cecNumPerFrame = getDiscoverEnv('cecNumPerFrame');
+	var frameNumPerHmc = getDiscoverEnv('frameNumPerHmc');
+	var lparNumPerCec = getDiscoverEnv('lparNumPerCec');
+	
+	//check the frame name
+	tempName = getDiscoverEnv('frameName');
+	if (!tempName){
+		errMessage += 'Input the Frame Name Range.<br/>';
+	}
+	else{
+		frameNum = expandNR(tempName).length;
+	}
+	
+	//check the cec name
+	tempName = getDiscoverEnv('cecName');
+	if (!tempName){
+		errMessage += 'Input the CEC Name Range.<br/>';
+	}
+	else{
+		cecNum = expandNR(tempName).length;
+	}
+	
+	//lpar number per cec
+	if (!lparNumPerCec){
+		errMessage += 'Input the Lpar Number Per Drawer.<br/>';
+	}
+	
+	//check the lpar name
+	tempName = getDiscoverEnv('lparName');
+	if (!tempName){
+		errMessage += 'Input the Lpar Name Range.<br/>';
+	}
+	else{
+		lparNum = expandNR(tempName).length;
+	}
+	
+	//check the hmc name 
+	tempName = getDiscoverEnv('hmcName');
+	if (!tempName){
+		errMessage += 'Input the HMC Name Range.<br/>';
+	}
+	else{
+		hmcNum = expandNR(tempName).length;
+	}
+	
+	//frame number per hmc
+	if (!frameNumPerHmc){
+		errMessage += 'Input the Frame Number Per HMC.<br/>';
+	}
+	
+	//the hardware management type is hmc.
+	if ('hmc' == $('#discoverContentDiv :checked').attr('value')){
+		setDiscoverEnv('hmcFlag', true);
+	}
+	else{
+		removeDiscoverEnv('hmcFlag');
+	}
+	
+	//the input value check is finished.
+	if ('' != errMessage){
+		$('#patternDiv').prepend('<div class="ui-state-error ui-corner-all"><p>' + errMessage + '</p></div>');
+		return false;
+	}
+	
+	//check the connections between all numbers.
+	if (getDiscoverEnv('hmcFlag')){
+		if ((Number(frameNumPerHmc) * hmcNum) < frameNum){
+			errMessage += 'The frame number should less than ' + Number(cecNumPerFrame) * frameNum + 
+			' ("the number of hmc" * "the number of frame managed by per hmc")';
+		}
+	}
+	
+	if ((Number(lparNumPerCec) * cecNum) != lparNum){
+		errMessage += 'The number of Lpars calculate by Name Range should be ' + Number(lparNumPerCec) * cecNum +
+					  '("the number of Drawers" * "the number of lpar per drawer")';
+	}
+	
+	if ('' != errMessage){
+		$('#patternDiv').prepend('<div class="ui-state-error ui-corner-all"><p>' + errMessage + '</p></div>');
+		return false;
+	}
+	
+	setDiscoverEnv('cecNum', cecNum);
+	setDiscoverEnv('frameNum', frameNum);
+	setDiscoverEnv('lparNum', lparNum);
+	setDiscoverEnv('hmcNum', hmcNum);
+	return true;
 }
 
 /**
- * Step 3: define switch ports  
+ * Step 3: allowed the users to edit the super node condigure file 
  *          
  * @param 
  * 
  * @return
  */
-function initSwitch(){
+function initSupernode(){
 	$('#discoverContentDiv').empty();
-	var showString = '<h2>' + steps[currentStep] + '</h2>';
-	showString += '<table><tbody>';
-	//Discovery Information title
-	showString += '<tr><th colspan=5>Switch Port Assignments</th></tr>';
-	//Dynamic IP Range for DHCP
-	showString += '<tr><td>Dynamic IP Range for DHCP:</td><td><input type="text" name="ipRange" value="' + getDiscoverEnv('ipRange') + '"></td>';
-	showString += '<td width=20></td>';
-	//IP Address to Broadcast
-	showString += '<td>IP Address to Broadcast From:</td><td><input type="text" name="broadcastIp" value="' + getDiscoverEnv('broadcastIp') + '"></td></tr>';
+	$('.tooltip').remove();
+	$('#discoverContentDiv').append('<div style="min-height:360px" id="supernodeDiv"><h2>' + steps[currentStep] + '</h2></div>');
+	createDiscoverButtons();
+	
+	//add the introduction about the page
+	var infoStr = '<div>The supernode-list file lists what supernode numbers should be ';
+	infoStr += 'given to each CEC in each frame. Here is a sample file:<br/>';
+	infoStr += 'frame1: 0, 1, 16<br/>frame2: 17, 32<br/>frame3: 33, 48, 49<br/>';
+	infoStr += 'frame4: 64 , 65, 80<br/>frame5: 81, 96<br/>frame6: 97(1), 112(1), 113(1), 37(1), 55, 71<br/>';
+	infoStr += 'The name before the colon is the node name of the frame BPC. The numbers after the colon ' +
+			   'are the supernode numbers to assign to the groups of CECs in that frame from bottom to top. ' +
+			   'Each supernode contains 4 CECs, unless it is immediately followed by "(#)", in which case the ' +
+			   'number in parenthesis indicates how many CECs are in this supernode.</div>';
+	var InfoBar = createInfoBar(infoStr);
+	$('#discoverContentDiv #supernodeDiv').append(InfoBar);
+	
+	var frameArray = expandNR(getDiscoverEnv('frameName'));
+	var showStr = '<center><table><tbody>';
+	for (var i in frameArray){
+		showStr += '<tr><td>' + frameArray[i] + ':</td><td><input type="text" name="sp_' + frameArray[i] + 
+				   '" value="' + getDiscoverEnv('sp_' + frameArray[i]) + '"></td></tr>';
+	}
+	showStr += '</tbody></table></center>';
+	$('#discoverContentDiv #supernodeDiv').append(showStr);
+}
+
+/**
+ * Step 3: check the super node configure file 
+ *          
+ * @param 
+ * 
+ * @return
+ */
+function checkSupernode(operType){
+	collectInputValue();
+	
+	if ('back' == operType){
+		return true;
+	}
+	
+	$('#supernodeDiv .ui-state-error').remove();
+	
+	var errString = '';
+	var eceNum = 0;
+	var args = '';
+	var frameArray = expandNR(getDiscoverEnv('frameName'));
+	for (var i in frameArray){
+		var sp_config = getDiscoverEnv('sp_' + frameArray[i]);
+		if (sp_config){
+			eceNum += calcCec(sp_config);
+			if (0 == i){
+				args += frameArray[i] + ': ' + sp_config;
+			}
+			else{
+				args += '\n' + frameArray[i] + ': ' + sp_config;
+			}
+		}
+		else{
+			errString += 'Input the super node configure for ' + frameArray[i] + '<br/>';
+		}
+	}
+	
+	if (errString){
+		$('#supernodeDiv').prepend('<div class="ui-state-error ui-corner-all"><p>' + errString + '</p></div>');
+		return false;
+	}
+	
+	var cecArray = expandNR(getDiscoverEnv('cecName'));
+	if (eceNum != cecArray.length){
+		errString += 'The number of CEC calculated from supernode configure is ' + eceNum + ', but the number ' + 
+					 'calculated from CECs\' Name Range is ' + cecArray.length + '. Reconfigure the supernode please.';
+		$('#supernodeDiv').prepend('<div class="ui-state-error ui-corner-all"><p>' + errString + '</p></div>');
+		return false;
+	}
+	
+	$.ajax({
+		url : 'lib/systemcmd.php',
+		dataType : 'json',
+		data : {
+			cmd : 'echo -e "' + args + '" > /tmp/websupernode.txt'
+		}
+	});
+	return true;
+}
+
+function calcCec(spConfigStr){
+	var tempArray = spConfigStr.split(',');
+	var num = 0;
+	var reg = /\(([1-4])\)/;
+	for (var i in tempArray){
+		var regRes = reg.exec(tempArray[i]);
+		if (regRes && regRes[1]){
+			num += Number(regRes[1]);
+		}
+		else{
+			num += 4;
+		}
+	}
+	
+	return num;
+}
+
+/**
+ * Step 4: show the field which need to be configured in site table 
+ *          
+ * @param 
+ * 
+ * @return
+ */
+function initSiteTable(operType){
+	$('#discoverContentDiv').empty();
+	$('.tooltip').remove();
+	var showDiv = $('<div style="min-height:360px" id="siteDiv"><h2>' + steps[currentStep] + '(Site info)</h2></div>');
+	var statBar = createStatusBar('siteTableStat');
+	statBar.append(createLoader());
+	showDiv.append(statBar);
+	$('#discoverContentDiv').append(showDiv);
+	
+	if (getDiscoverEnv('domainname')){
+		showSiteArea();
+		return;
+	}
+	
+	$.ajax({
+		url : 'lib/cmd.php',
+		dataType : 'json',
+		data : {
+			cmd : 'tabdump',
+			tgt : '',
+			args : 'site',
+			msg : ''
+		},
+		
+		success : function(data){
+			setDiscoverEnv('domainname', '');
+			setDiscoverEnv('nameserver','');
+			for (var i in data.rsp){
+				var tempArray = data.rsp[i].split(',');
+				var tempValue = tempArray[1];
+				switch (tempArray[0]){
+					case '"domain"':{
+						setDiscoverEnv('domainname', tempValue.substr(1, tempValue.length - 2));
+					}
+					break;
+					case '"nameservers"':{
+						setDiscoverEnv('nameserver', tempValue.substr(1, tempValue.length - 2));
+					}
+					break;
+				}
+			}
+
+			showSiteArea();
+		}
+	});	
+}
+
+/**
+ * Step 4: when the values are ready, create the table 
+ *          
+ * @param 
+ * 
+ * @return
+ */
+function showSiteArea(){
+	var showString = '<table><tbody>';
+	//domain name:
+	showString += '<tr><td>Domain Name:</td><td><input type="text" name="domainname" value="' + getDiscoverEnv('domainname') + 
+				  '" title="The DNS domain name used for the cluster."></td></tr>';
+
+	//Name server
+	showString += '<tr><td>Name server:</td><td><input type="text" name="nameserver" value="' + getDiscoverEnv('nameserver') + 
+				  '" title="A comma delimited list of DNS servers that each node in the cluster should use - often the xCAT management node."></td></tr>';
+	
+	//ntp server
+	showString += '<tr><td>DHCP Dynamic Range:</td><td><input type="text" name="ipStart" value="' + getDiscoverEnv('ipStart') + 
+	              '" title="A start Ip address for DHCP dynamic range.">-<input type="text" name="ipEnd" disabled="disabled" value="' + 
+	              getDiscoverEnv('ipEnd') + '"></td></tr>';
 	showString += '</tbody></table>';
-	$('#discoverContentDiv').append(showString);
+	
+	$('#discoverContentDiv div').eq(0).append(showString);
+	
+	$('#discoverContentDiv [title]').tooltip({
+		position: "center right",
+		offset: [-2, 10],
+		effect: "fade",
+		opacity: 1
+	});
+	
+	$('#discoverContentDiv input[name=ipStart]').bind('change', function(){
+		var reg = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-4])$/;
+		if (reg.test($(this).attr('value'))){
+			var tempNum = Number(getDiscoverEnv('frameNum')) * 4 + Number(getDiscoverEnv('cecNum')) * 4 +
+			              Number(getDiscoverEnv('lparNum')) + Number(getDiscoverEnv('hmcNum'));
+			var ipEnd = calcEndIp($(this).attr('value'), tempNum);
+			if (!reg.test(ipEnd)){
+				ipEnd = '';
+			}
+			$('#discoverContentDiv input[name=ipEnd]').attr('value', ipEnd);
+		}
+		else{
+			$('#discoverContentDiv input[name=ipEnd]').attr('value', '');
+		}
+	});
+	
+	//show the current network interface configure
+	$.ajax({
+		url : 'lib/systemcmd.php',
+		dataType : 'json',
+		data : {
+			cmd : 'ifconfig | grep -E "encap|Mask"'
+		},
+	
+		success : function(data){
+			$('#discoverContentDiv #siteTableStat').html('Current network interface configuration:<br/><pre>' + 
+						data.rsp + '</pre>');
+		}
+	});
 	createDiscoverButtons();
 }
 
-function initAdvancedPattern(){
+function calcEndIp(ipStart, num){
+	var sum = 0;
+	var tempNum = Number(num);
+	var temp = /(\d+)\.(\d+)\.(\d+)\.(\d+)/;
+	var ipArray = temp.exec(ipStart);
+	
+	ipArray.shift();
+	sum = Number(ipArray[3]) + tempNum;
+	if (sum <= 254){
+		ipArray[3] = sum;
+		return (ipArray.join('.'));
+	}
+	
+	ipArray[3] = sum % 254;
+	
+	sum = Number(ipArray[2]) + parseInt(sum / 254);
+	if (sum <= 255){
+		ipArray[2] = sum;
+		return (ipArray.join('.'));
+	}
+	
+	ipArray[2] = sum % 255;
+	
+	sum = Number(ipArray[1]) + parseInt(sum / 255);
+	if (sum <= 255){
+		ipArray[1] = sum;
+		return (ipArray.join('.'));
+	}
+	
+	ipArray[1] = sum % 255;
+	ipArray[0] = ipArray[0] + parseInt(sum / 255);
+	return (ipArray.join('.'));
+}
+/**
+ * Step 4: check the input are all filled 
+ *          
+ * @param 
+ * 
+ * @return
+ */
+function checkSiteTable(operType){
+	$('#discoverContentDiv input[name=ipStart]').trigger('change');
+	collectInputValue();
+	
+	if ('back' == operType){
+		return true;
+	}
+	
+	$('#discoverContentDiv .ui-state-error').remove();
+	var errMessage = '';
+	if (!getDiscoverEnv('domainname')){
+		errMessage += 'Input the domain name.<br/>';
+	}
+	
+	if (!getDiscoverEnv('nameserver')){
+		errMessage += 'Input the name server.<br/>';
+	}
+	
+	if (!getDiscoverEnv('ipEnd')){
+		errMessage += 'Input the DHCP Dynamic Range.<br/>';
+	}
+	
+	if ('' == errMessage){
+		return true;
+	}
+	
+	$('#discoverContentDiv #siteDiv').prepend('<div class="ui-state-error ui-corner-all"><p>' + errMessage + '</p></div>');
+	return false;
+}
+
+/**
+ * Step 5: told users to power on machines
+ *          
+ * @param 
+ * 
+ * @return
+ */
+function initPoweronHardware(){
 	$('#discoverContentDiv').empty();
-	var showString = '<h2>' + steps[currentStep] + '</h2>';
-	showString += '<table><tbody>';
-	showString += '<tr><th colspan=5>Building Blocks</th></tr>';
-	//Starting Subnet IP for Cluster Mgmt LAN:
-	showString += '<tr><td>Starting Subnet IP for Cluster Mgmt LAN:</td><td><input type="text" name="MgmtIp" value="' + getDiscoverEnv('MgmtIp') + '"></td>';
-	showString += '<td width=20></td>';
-	//Compute Node Hostname Range
-	showString += '<td>Compute Node Hostname Range:</td><td><input type="text" name="cnName" value="' + getDiscoverEnv('cnName') + '"></td></tr>';
-	showString += '</tbody></table>';
-	$('#discoverContentDiv').append(showString);
+	$('.tooltip').remove();
+	var showStr = '<div style="min-height:360px"><h2>' + steps[currentStep] + 
+			'</h2><h3>Do the following manual steps now:</h3>';
+	showStr += '<ul><li>1. Power on all of the HMCs.</li>';
+	showStr += '<li>2. Power on all of frames.</li>';
+	showStr += '<li>3. Click Next to discover the hardware on the service network.</li></ul></div>';
+	
+	$('#discoverContentDiv').append(showStr);
+	
 	createDiscoverButtons();
+}
+
+/**
+ * Step 6: discover all frames from the cluster and map all mtms with frame name
+ *          
+ * @param 
+ * 
+ * @return
+ */
+function initDiscoverFrames(){
+	$('#discoverContentDiv').empty();
+	$('.tooltip').remove();
+	var showDiv = $('<div style="min-height:360px" id="discoverShow"><h2>' + steps[currentStep] + '</h2>');
+	var statBar = createStatusBar('framedisc');
+	showDiv.append(statBar);
+	$('#discoverContentDiv').append(showDiv);
+	$('#discoverShow').append('<center><table><tr><td id="frameTd">' 
+			+ '</td><td style="width:20px"></td><td id="mtmsTd"></td></tr></table></center>');
+	
+	if (getDiscoverEnv('framemtmsmap')){
+		$('#framedisc').html('Mapping the frame name and mtms which discovered by lsslp.<br\>' + 
+							 'Select the frame name, then select the mtms.');
+		var mapArray = getDiscoverEnv('framemtmsmap').split(':');
+		for(var i in mapArray){
+			var tempArray = mapArray[i].split(',');
+			showMap(tempArray[0], tempArray[1] + '-' + tempArray[2]);
+		}
+		
+		createDiscoverButtons();
+		return;
+	}
+	
+	statBar.append('Discovering all Frames by lsslp.').append(createLoader());
+	//use lsslp to find all bpas in cluster
+	$.ajax({
+		url : 'lib/cmd.php',
+		dataType : 'json',
+		data : {
+			cmd : 'webrun',
+			tgt : '',
+			args : 'discover;frame',
+			msg : ''
+		},
+		
+		success : function(data){
+			var tempInfo = data.rsp[0];
+			if (-1 != tempInfo.indexOf('Error')){
+				$('#framedisc').html(tempInfo);
+				createDiscoverButtons();
+				return;
+			}
+			
+			var mtmsArray = tempInfo.split(';');
+			var frameArray = expandNR(getDiscoverEnv('frameName'));
+			//chech the defined number and discovered number
+			if (mtmsArray.length != frameArray.length){
+				$('#framedisc').html('Error: Definded Number is ' + frameArray.length + 
+									', but lsslp discovered Number is ' + mtmsArray.length + ', please check your configure!');
+				createDiscoverButtons();
+				return;
+			}
+			
+			$('#framedisc').html('Mapping the frame name and mtms which discovered by lsslp.<br\>' + 
+			 		'Select the frame name, then select the mtms.');
+			
+			for (var i in frameArray){
+				$('#frameTd').append('<p><input name="frameradio" type="radio" onclick="createMap(this)"><span>' +
+						frameArray[i] + '</span></p>');
+				
+			}
+			for (var i in mtmsArray){
+				$('#mtmsTd').append('<p><input name="mtmsradio" type="radio" onclick="createMap(this)"><span>' + 
+						mtmsArray[i] + '</span></p>');
+			}
+			
+			createDiscoverButtons();
+		}
+	});
+}
+
+function createMap(obj){
+	var fname = '';
+	var mname = '';
+	
+	if ($('#discoverShow :checked').size() < 2){
+		return;
+	}
+	
+	if('frameradio' == $(obj).attr('name')){
+		fname = $(obj).next().html();
+		mname = $('#discoverShow input[name=mtmsradio]:checked').next().html();
+	}
+	else{
+		fname = $('#discoverShow input[name=frameradio]:checked').next().html();
+		mname = $(obj).next().html();
+	}
+	
+	$('#discoverShow :checked').parent().remove();
+	showMap(fname, mname);
+}
+
+function showMap(fname, mname){
+	var rowClass = '';
+	
+	if ($('#discoverShow fieldset').size() < 1){
+		$('#discoverShow').append('<fieldset><legend>Frame and MTMS map</legend><center><table></table></center></fieldset>');
+	}
+	
+	if (0 == $('#discoverShow fieldset tr').size() % 2){
+		rowClass = 'odd';
+	}
+	else{
+		rowClass = 'even';
+	}
+	
+	$('#discoverShow fieldset table').append('<tr class="' + rowClass + '"><td>' + fname + 
+			'</td><td width="20px">&lt;----&gt;</td><td>' + mname +
+			'</td><td><span class="ui-icon ui-icon-trash" style="cursor:pointer;" onclick="deleteMap(this)"></span></td></tr>');
+}
+
+function deleteMap(obj){
+	var mname = $(obj).parent().prev().html();
+	var fname = $(obj).parent().prev().prev().prev().html();
+	
+	$(obj).parent().parent().remove();
+	
+	$('#frameTd').append('<p><input name="frameradio" type="radio" onclick="createMap(this)"><span>' + fname + '</span></p>');
+	$('#mtmsTd').append('<p><input name="mtmsradio" type="radio" onclick="createMap(this)"><span>' + mname + '</span></p>');
+}
+
+/**
+ * Step 6: write the frame and mtms map file
+ *          
+ * @param 
+ * 
+ * @return
+ */
+function checkFrameMtms(operType){
+	//check the number of radio button
+	var vpdFileCon = '';
+	$('#discoverShow .ui-state-error').remove();
+	if (0 < $('#discoverShow :radio').size()){
+		$('#discoverContentDiv #discoverShow').prepend('<div class="ui-state-error ui-corner-all"><p>' + 
+				'Map all of the frame with mtms.</p></div>');
+		return false;
+	}
+	
+	//find out all maps
+	var maps = '';
+	$('#discoverShow fieldset tr').each(function(){
+		var fname = $(this).children().eq(0).html();
+		var mtms = $(this).children().eq(2).html();
+		var pos = mtms.lastIndexOf('-');
+
+		maps += (fname + ',' + mtms.substring(0, pos) + ',' + mtms.substring(pos + 1) + ':');
+		vpdFileCon += fname + ':\n';
+		vpdFileCon += '  objtype=node\n  serial=' + mtms.substring(pos + 1) + '\n';
+		vpdFileCon += '  mtm=' + mtms.substring(0, pos) + '\n  side=A\n';
+	});
+	
+	maps = maps.substr(0, maps.length - 1);
+	setDiscoverEnv('framemtmsmap', maps);
+	
+	if ('back' == operType){
+		return true;
+	}
+	
+	//write the maps into vpd table
+	$.ajax({
+		url : 'lib/systemcmd.php',
+		dataType : 'json',
+		data : {
+			cmd : 'echo -e "' + vpdFileCon + '" > /tmp/webvpd.stanza'
+		}
+	});
+	
+	return true;
+}
+
+/**
+ * Step 7: create the xcatsetup configure file and run xcatsetup to define all objects 
+ * 		   in xcat database.   
+ *          
+ * @param 
+ * 
+ * @return
+ */
+function initConfig(operType){
+	$('#discoverContentDiv').empty();
+	$('.tooltip').remove();
+	var showStr = '<div style="min-height:360px"><h2>' + steps[currentStep] + '<br/><br/></h2>';
+	var iconClass = '';
+	if ('back' == operType){
+		iconClass = 'ui-icon-check';
+	}
+	else{
+		iconClass = 'ui-icon-wrench';
+	}
+	showStr += '<ul>';
+	showStr += '<li id="fileLine"><span class="ui-icon ' + iconClass + '"></span>Create configure file for xcatsetup.</li>';
+	showStr += '<li id="setupLine"><span class="ui-icon ' + iconClass + '"></span>Wrote Objects into xCAT database by xcatsetup.</li>';
+	showStr += '<li id="dhcpLine"><span class="ui-icon ' + iconClass + '"></span>Configured DHCP.</li>';
+	showStr += '</ul></div>';
+	
+	$('#discoverContentDiv').append(showStr);
+	
+	if ('back' == operType){
+		createDiscoverButtons();
+		return;
+	}
+	
+	createSetupFile();
+}
+/**
+ * Step 7: create the xcat configure file
+ *          
+ * @param 
+ * 
+ * @return
+ */
+function createSetupFile(){
+	var fileContent = '';
+	
+	$('#fileLine').append(createLoader());
+	//site info
+	fileContent += 'xcat-site:\n';
+	fileContent += '  domain = ' + getDiscoverEnv('domainname') + '\n';
+	if (getDiscoverEnv('hmcFlag')){
+		//do nothing
+	}
+	else{
+		fileContent += '  use-direct-fsp-control = 1\n';
+	}
+	
+	//dhcp ip range
+	fileContent += 'xcat-service-lan:\n';
+	fileContent += '  dhcp-dynamic-range = ' + getDiscoverEnv('ipStart') + '-' + getDiscoverEnv('ipEnd') + '\n';
+	
+	//hmc
+	if (getDiscoverEnv('hmcName')){
+		fileContent += 'xcat-hmcs:\n';
+		fileContent += '  hostname-range = ' + getDiscoverEnv('hmcName') + '\n';
+	}
+	
+	//frame
+	fileContent += 'xcat-frames:\n';
+	fileContent += '  hostname-range = ' + getDiscoverEnv('frameName') + '\n';
+	fileContent += '  num-frames-per-hmc = ' + getDiscoverEnv('frameNumPerHmc') + '\n';
+	fileContent += '  vpd-file = /tmp/webvpd.stanza\n';
+	
+	//cec
+	fileContent += 'xcat-cecs:\n';
+	fileContent += '  hostname-range = ' + getDiscoverEnv('cecName') + '\n';
+	fileContent += '  delete-unused-cecs = 1\n';
+	fileContent += '  supernode-list = /tmp/websupernode.txt\n';
+	
+	//lpar
+	fileContent += 'xcat-lpars:\n';
+	fileContent += '  num-lpars-per-cec = ' + getDiscoverEnv('lparNumPerCec') + '\n';
+	fileContent += '  hostname-range = ' + getDiscoverEnv('lparName') + '\n';
+	
+	$.ajax({
+		url : 'lib/systemcmd.php',
+		dataType : 'json',
+		data : {
+			cmd : 'echo -e "' + fileContent + '" > /tmp/webxcat.conf'
+		},
+		
+		success : function(){
+			$('#fileLine img').remove();
+			var tempSpan = $('#fileLine').find('span');
+			tempSpan.removeClass('ui-icon-wrench');
+			tempSpan.addClass('ui-icon-check');
+			runSetup();
+		}
+	});
+}
+
+/**
+ * Step 7: run the xcatsetup command
+ *          
+ * @param 
+ * 
+ * @return
+ */
+function runSetup(){
+	$('#setupLine').append(createLoader());
+	$.ajax({
+		url : 'lib/cmd.php',
+		dataType : 'json',
+		data : {
+			cmd : 'xcatsetup',
+			tgt : '',
+			args : '/tmp/webxcat.conf',
+			msg : ''
+		},
+		
+		success : function(){
+			$('#setupLine img').remove();
+			var tempSpan = $('#setupLine').find('span');
+			tempSpan.removeClass('ui-icon-wrench');
+			tempSpan.addClass('ui-icon-check');
+			configDHCP();
+		}
+	});
+}
+/**
+ * Step 7: create the dhcp configure file
+ *          
+ * @param 
+ * 
+ * @return
+ */
+function configDHCP(){
+	$('#dhcpLine').append(createLoader());
+	$.ajax({
+		url : 'lib/cmd.php',
+		dataType : 'json',
+		data : {
+			cmd : 'makedhcp',
+			tgt : '',
+			args : '-n',
+			msg : ''
+		},
+		
+		success : function(){
+			$('#dhcpLine img').remove();
+			var tempSpan = $('#dhcpLine').find('span');
+			tempSpan.removeClass('ui-icon-wrench');
+			tempSpan.addClass('ui-icon-check');
+			createDiscoverButtons();
+		}
+	});
+}
+
+/**
+ * Step 8: discover all hmc,cec in cluster and update into xcat database
+ *          
+ * @param 
+ * 
+ * @return
+ */
+function initUpdateDefinition(operType){
+	$('#discoverContentDiv').empty();
+	$('.tooltip').remove();
+	var showStr = '<div style="min-height:360px"><h2>' + steps[currentStep] + '<br/><br/></h2>';
+	showStr += '<ul>';
+	showStr += '<li id="frameLine"><span class="ui-icon ui-icon-wrench"></span>Update Frames into xCAT database.</li>';
+	showStr += '<li id="hmcLine1"><span class="ui-icon ui-icon-wrench"></span>Discover HMCs.</li>';
+	showStr += '<li id="hmcLine2"><span class="ui-icon ui-icon-wrench"></span>Update HMCs into xCAT database.</li>';
+	showStr += '<li id="cecLine"><span class="ui-icon ui-icon-wrench"></span>Discover CECs and update into xCAT database.</li>';
+	showStr += '</ul></div>';
+	
+	$('#discoverContentDiv').append(showStr);
+	
+	if ('back' == operType){
+		createDiscoverButtons();
+		return;
+	}
+	
+	lsslpWriteFrame();
+}
+
+/**
+ * Step 8: write all the lsslp -s FRAME info into database
+ *          
+ * @param 
+ * 
+ * @return
+ */
+function lsslpWriteFrame(){
+	$('#frameLine').append(createLoader());
+	$.ajax({
+		url : 'lib/cmd.php',
+		dataType : 'json',
+		data : {
+			cmd : 'lsslp',
+			tgt : '',
+			args : '-s;BPA;-w',
+			msg : ''
+		},
+		
+		success : function(){
+			$('#frameLine img').remove();
+			var tempSpan = $('#frameLine').find('span');
+			tempSpan.removeClass('ui-icon-wrench');
+			tempSpan.addClass('ui-icon-check');
+			lsslpWriteHMC();
+		}
+	});
+}
+
+/**
+ * Step 8: write all the lsslp -s HMC info into database
+ *          
+ * @param 
+ * 
+ * @return
+ */
+function lsslpWriteHMC(){
+	$('#hmcLine1').append(createLoader());
+	$.ajax({
+		url : 'lib/cmd.php',
+		dataType : 'json',
+		data : {
+			cmd : 'webrun',
+			tgt : '',
+			args : 'discover;hmc',
+			msg : ''
+		},
+		
+		success : function(data){
+			//modify the page elements
+			$('#hmcLine1 img').remove();
+			var tempSpan = $('#hmcLine1').find('span');
+			tempSpan.removeClass('ui-icon-wrench');
+			tempSpan.addClass('ui-icon-check');
+			$('#hmcLine2').append(createLoader());
+			
+			var hmcArray = expandNR(getDiscoverEnv('hmcName'));
+			var mtmsArray = data.rsp[0].split(';');
+			var tempPar = '';
+			
+			if(hmcArray.length != mtmsArray.length){
+				//error info
+				$('#hmcLine2 img').remove();
+				$('#discoverContentDiv div').append('<div class="ui-state-error ui-corner-all"><p>' +
+						'Error: Defined ' + hmcArray.length  + ' hmcs, but discovered ' + mtmsArray.length + 
+						' hmcs. Check the configuration please.</p></div>');
+				createDiscoverButtons();
+				return;
+			}
+			
+			//create the hmc and mtms pair string
+			for (var i in hmcArray){
+				var tPos = mtmsArray[i].lastIndexOf('-');
+				if ('' == tempPar){
+					tempPar += hmcArray[i] + ',' + mtmsArray[i].substring(0, tPos) + ',' +mtmsArray[i].substring(tPos + 1);
+				}
+				else{
+					tempPar += ':' + hmcArray[i] + ',' + mtmsArray[i].substring(0, tPos) + ',' +mtmsArray[i].substring(tPos + 1);
+				}
+			}
+			
+			//write the mtms and hmcname pair into vpd table
+			$.ajax({
+				url : 'lib/cmd.php',
+				dataType : 'json',
+				data : {
+					cmd : 'webrun',
+					tgt : '',
+					args : 'updatevpd;' + tempPar,
+					msg : ''
+				},
+				success: function(){
+					//run lsslp and write all infomation into datatable
+					$.ajax({
+						url : 'lib/cmd.php',
+						dataType : 'json',
+						data : {
+							cmd : 'lsslp',
+							tgt : '',
+							args : '-s;HMC;-w',
+							msg : ''
+						},
+						success: function(){
+							$('#hmcLine2 img').remove();
+							var tempSpan = $('#hmcLine2').find('span');
+							tempSpan.removeClass('ui-icon-wrench');
+							tempSpan.addClass('ui-icon-check');
+							lsslpWriteCec();
+						}
+				});
+				}
+		});
+		}
+	});
+}
+
+/**
+ * Step 8: write all the lsslp -s cec info into database
+ *          
+ * @param 
+ * 
+ * @return
+ */
+function lsslpWriteCec(){
+	$('#cecLine').append(createLoader());
+	$.ajax({
+		url : 'lib/cmd.php',
+		dataType : 'json',
+		data : {
+			cmd : 'lsslp',
+			tgt : '',
+			args : '-s;FSP;-w',
+			msg : ''
+		},
+		success: function(){
+			$('#cecLine img').remove();
+			var tempSpan = $('#cecLine').find('span');
+			tempSpan.removeClass('ui-icon-wrench');
+			tempSpan.addClass('ui-icon-check');
+			createDiscoverButtons();
+		}
+	});
+}
+
+/**
+ * Step 9: create lpars
+ *          
+ * @param 
+ * 
+ * @return
+ */
+function initCreateLpar(){
+	$('#discoverContentDiv').empty();
+	$('.tooltip').remove();
+	var showDiv = $('<div style="min-height:360px" id="createlparDiv"><h2>' + steps[currentStep] + '</h2>');
+	switch (getDiscoverEnv('machineType')){
+		case 'ih':{
+			ihCreateLpar(showDiv);
+		}
+		break;
+		case 'nonih':{
+			nonihCreateLpar(showDiv);
+		}
+		break;
+		default:
+		break;
+	}
+	$('#discoverContentDiv').append(showDiv);
+	createDiscoverButtons();
+}
+
+function ihCreateLpar(parentDiv){
+	var showStr = 'Partition Rule:<br/>' + 
+		'If all the octants configuration value are same in one CEC,  it will be  " -r  0-7:value".<br/>' +
+		'If the octants use the different configuration value in one cec, it will be "-r 0:value1,1:value2,...7:value7", or "-r 0:value1,1-7:value2".<br/>' +
+		'The octants configuration value for one Octant could be  1, 2, 3, 4, 5 . The meanings of the octants configuration value  are as following:<br/>' +
+		'1 - 1 partition with all cpus and memory of the octant<br/>' +
+		'2 - 2 partitions with a 50/50 split of cpus and memory<br/>' +
+		'3 - 3 partitions with a 25/25/50 split of cpus and memory<br/>' +
+		'4 - 4 partitions with a 25/25/25/25 split of cpus and memory<br/>' +
+		'5 - 2 partitions with a 25/75 split of cpus and memory<br/>' +
+		'Define the configuration rule for one CEC, and create all Lpars on all CECs by this rule. Or ignore this step.';
+	
+	parentDiv.append(createInfoBar(showStr));
+	parentDiv.append('<div><center><table><tr><td>Partition Configuration:</td>' +
+				     '<td><input name="partconf" type="text" value="' + getDiscoverEnv('partconf')+ 
+				     '"></td><td></td></tr></table></center></div>');
+	
+	var lparButton = createButton('Create Lpars');
+	parentDiv.find('td').eq(2).append(lparButton);
+	
+	lparButton.bind('click', function(){
+		var reg = /(([0-7]|[0-7]-[0-7]):[1-5],)*(([0-7]|[0-7]-[0-7]):[1-5])$/g;
+		var lparCount = 0;
+		$('#discoverContentDiv .ui-state-error').remove();
+		collectInputValue();
+		var inputStr = getDiscoverEnv('partconf');
+		var testArray = reg.exec(inputStr);
+		if (!testArray || inputStr != testArray[0]){
+			$('#discoverContentDiv').prepend('<div class="ui-state-error ui-corner-all">' + 
+	                 '<p>Input the correct configuration rule.</p></div>');
+			return;
+		}
+
+		var ruleArray = inputStr.split(',');
+		for(var i in ruleArray){
+			var octantCount = 0;
+			var octantArray = ruleArray[i].split(':');
+			var octantRule = Number(octantArray[1]);
+			var pos = octantArray[0].indexOf('-');
+			if (5 == octantRule){
+				octantRule = 2;
+			}
+
+			if (-1 == pos){
+				octantCount = 1;
+			}
+			else{
+				var startIndex = Number(octantArray[0].substring(0, pos));
+				var endIndex = Number(octantArray[0].substring(pos + 1));
+				octantCount = endIndex - startIndex + 1;
+			}
+			
+			lparCount += octantCount * octantRule;
+		}
+		
+		if(getDiscoverEnv('lparNumPerCec') != lparCount){
+			$('#discoverContentDiv').prepend('<div class="ui-state-error ui-corner-all">' + 
+            	'<p>The Lpar number per CEC is ' + getDiscoverEnv('lparNumPerCec') + ', but the configuration ' +
+            	'rule calculation is ' + lparCount + '.</p></div>');
+			return;
+		}
+		
+		var diaDiv = $('<div id="createLparDiv"></div>');
+		diaDiv.append('<ul></ul>');
+		diaDiv.append(createLoader());
+		diaDiv.dialog({
+			modal: true,
+			width: 600,
+			title: 'Creating Lpars...'
+		});
+		
+		$('.ui-dialog-titlebar-close').hide();
+		
+		var cecArray = expandNR(getDiscoverEnv('cecName'));
+		for (var i in cecArray){
+			$.ajax( {
+				url : 'lib/cmd.php',
+				dataType : 'json',
+				data : {
+					cmd : 'mkvm',
+					tgt : cecArray[i] + 'nodes',
+					args : '-i;1;-m;non-interleaved;-r;' + inputStr,
+					msg : cecArray[i] + ';' + cecArray.length
+				},
+
+				success : function(data) {
+					//update the dialogure
+					var tempArray = data.msg.split(';');
+					updateCreateLparDia(tempArray[0], Number(tempArray[1]));
+				}
+			});
+		}
+	});
+}
+
+function updateCreateLparDia(cecname, cecNum){
+	$('#createLparDiv ul').append('<li>Creating lpars on ' + cecname + ' competed.</li>');
+	
+	if (cecNum != $('#createLparDiv li').size()){
+		return;
+	}
+	
+	$('#createLparDiv').empty();
+	$('#createLparDiv').append('<p>All lpars are created. You must:<br/>1. reboot the all CECS. <br/>'+
+							   '2.use chvm to assign the I/O slots to the new LPAR.</p>');
+	
+	var chvmButton = createButton('OK');
+	$('#createLparDiv').append(chvmButton);
+	chvmButton.bind('click', function(){
+		$('#createLparDiv').dialog('destroy');
+		$('#createLparDiv').remove();
+	});
+}
+function nonihCreateLpar(parentDiv){
+	var showStr = 'The machine type is not P7 IH, so you had to create lpars by command line manually.';
+	parentDiv.append(createInfoBar(showStr));
+	return;
+}
+/**
+ * Step 10: compelte
+ *          
+ * @param 
+ * 
+ * @return
+ */
+function complete(){
+	$('#discoverContentDiv').empty();
+	$('.tooltip').remove();
+	var showStr = '<div style="min-height:360px"><h2>' + steps[currentStep] + '<br/><br/></h2>';
+	showStr += 'You can go to the <a href="index.php">nodes page</a> to check nodes which were defined just now.';
+	$('#discoverContentDiv').append(showStr);
+	
+	createDiscoverButtons();
+
 }
\ No newline at end of file
diff --git a/xCAT-server/lib/xcat/plugins/web.pm b/xCAT-server/lib/xcat/plugins/web.pm
index be12cbb28..127391948 100644
--- a/xCAT-server/lib/xcat/plugins/web.pm
+++ b/xCAT-server/lib/xcat/plugins/web.pm
@@ -1094,7 +1094,7 @@ sub web_createimage{
         close($CONFILE);
 
         #write exlist for stateless
-        open($CONFILE, ">/install/custom/netboot/$ostype/$profile.exlist");
+        open($CONFILE, ">$installdir/custom/netboot/$ostype/$profile.exlist");
         print $CONFILE "#INCLUDE:/opt/xcat/share/xcat/IBMhpc/IBMhpc.$ostype.$osarch.exlist#\n";
         close($CONFILE);
 
@@ -1106,7 +1106,10 @@ sub web_createimage{
         for my $soft (@softArray){
             $soft = lc($soft);
             if ('gpfs' eq $soft){
-                web_gpfsConfigure($ostype, $profile, $installdir);
+                web_gpfsConfigure($ostype, $profile, $osarch, $installdir);
+            }
+            elsif ('rsct' eq $soft){
+                web_rsctConfigure($ostype, $profile, $osarch, $installdir);
             }
         }
 
@@ -1132,6 +1135,7 @@ sub web_createimage{
         my $retInfo = xCAT::Utils->runcmd( "${cmdPath}/genimage -i $bootif -n $netdriver -o $ostype -p $profile", -1, 1 );
         $ret = join ("\n", @$retInfo);
         if ($::RUNCMD_RC){
+            web_restoreChange($request->{arg}->[6], $archFlag, $imagetype, $ostype, $installdir);
             $callback->({data=>$ret});
             return;
         }
@@ -1177,7 +1181,9 @@ sub web_createimage{
         
         for my $soft (@softArray){
             $soft = lc($soft);
-            system ("grep '^[^#]' /opt/xcat/share/xcat/IBMhpc/$soft/litefile.csv >> /tmp/litefile.csv");
+            if (-e /opt/xcat/share/xcat/IBMhpc/$soft/litefile.csv){
+                system ("grep '^[^#]' /opt/xcat/share/xcat/IBMhpc/$soft/litefile.csv >> /tmp/litefile.csv");
+            }
         }
         
         system("tabrestore /tmp/litefile.csv");
@@ -1186,47 +1192,121 @@ sub web_createimage{
         my $retInfo = xCAT::Utils->runcmd( "${cmdPath}/genimage -i $bootif -n $netdriver -o $ostype -p $profile", -1, 1 );
         $ret = join ("\n", @$retInfo);
         if ($::RUNCMD_RC){
+            web_restoreChange($request->{arg}->[6], $archFlag, $imagetype, $ostype, $installdir);
             $callback->({data=>$ret});
             return;
         }
         $ret .= "\n";
         my $retInfo = xCAT::Utils->runcmd( "liteimg -o $ostype -p $profile -a $osarch", -1, 1 );
         $ret .= join ("\n", @$retInfo);
-
-        #restore the litefile table
-        system("rm -r /tmp/litefile.csv ; mv /tmp/litefilearchive.csv /tmp/litefile.csv ; tabrestore /tmp/litefile.csv");
     }
 
-    #recover all file in the $installdir/custom/netboot/$ostype/
-    if ($request->{arg}->[6]){
-        system("rm -f $installdir/custom/netboot/$ostype/*.*");
-    }
-    
-    if ($archFlag){
-        system("mv /tmp/webImageArch/*.* $installdir/custom/netboot/$ostype/");
-    }
+    web_restoreChange($request->{arg}->[6], $archFlag, $imagetype, $ostype, $installdir);
     $callback->({data=>$ret});
     return;
 }
 
 sub web_gpfsConfigure{
-    my ($ostype, $profile, $installdir) = @_;
+    my ($ostype, $profile, $osarch, $installdir) = @_;
     my $CONFILE;
+    
+    #createrepo
+    system('createrepo $installdir/post/otherpkgs/$ostype/$osarch/gpfs');
+    
     #other pakgs
     open($CONFILE, ">>$installdir/custom/netboot/$ostype/$profile.otherpkgs.pkglist");
     print $CONFILE "#INCLUDE:/opt/xcat/share/xcat/IBMhpc/gpfs/gpfs.otherpkgs.pkglist#\n";
     close($CONFILE);
 
     #exlist
-    open ($CONFILE, ">>/install/custom/netboot/$ostype/$profile.exlist");
+    open ($CONFILE, ">>$installdir/custom/netboot/$ostype/$profile.exlist");
     print $CONFILE "#INCLUDE:/opt/xcat/share/xcat/IBMhpc/gpfs/gpfs.exlist#\n";
     close ($CONFILE);
 
     #postinstall
-    system ('cp /opt/xcat/share/xcat/IBMhpc/gpfs/gpfs_mmsdrfs /install/postscripts/gpfs_mmsdrfs');
+    system ('cp /opt/xcat/share/xcat/IBMhpc/gpfs/gpfs_mmsdrfs $installdir/postscripts/gpfs_mmsdrfs');
     open($CONFILE, ">>$installdir/custom/netboot/$ostype/$profile.postinstall");
-    print $CONFILE "NODESETSTATE=genimage installroot=\$1 /opt/xcat/share/xcat/IBMhpc/gpfs/gpfs_updates \n";
-    print $CONFILE "installroot=$1 /install/postscripts/gpfs_mmsdrfs\n";
+    print $CONFILE "NODESETSTATE=genimage installroot=\$1 /opt/xcat/share/xcat/IBMhpc/gpfs/gpfs_updates\n";
+    print $CONFILE "installroot=\$1 $installdir/postscripts/gpfs_mmsdrfs\n";
     close($CONFILE);
 }
+
+sub web_rsctConfigure{
+    my ($ostype, $profile, $osarch, $installdir) = @_;
+    my $CONFILE;
+
+    #createrepo
+    system('createrepo $installdir/post/otherpkgs/$ostype/$osarch/rsct');
+
+    #packagelist for sles11
+    if ($ostype =~ /sles/i){
+        open($CONFILE, ">>$installdir/custom/netboot/$ostype/$profile.pkglist");
+        print $CONFILE "#INCLUDE:/opt/xcat/share/xcat/IBMhpc/rsct/rsct.pkglist# \n";
+        close($CONFILE);
+    }
+
+    #exlist
+    open ($CONFILE, ">>$installdir/custom/netboot/$ostype/$profile.exlist");
+    print $CONFILE "#INCLUDE:/opt/xcat/share/xcat/IBMhpc/rsct/rsct.exlist#\n";
+    close ($CONFILE);
+
+    #postinstall
+    open($CONFILE, ">>$installdir/custom/netboot/$ostype/$profile.postinstall");
+    print $CONFILE "installroot=\$1 rsctdir=/install/post/otherpkgs/rhels6/ppc64/rsct NODESETSTATE=genimage   /opt/xcat/share/xcat/IBMhpc/rsct/rsct_install\n";
+    close ($CONFILE);
+}
+
+sub web_peConfigure{
+    my ($ostype, $profile, $osarch, $installdir) = @_;
+    my $CONFILE;
+
+    #createrepo
+    system('createrepo $installdir/post/otherpkgs/$ostype/$osarch/pe');
+    system('createrepo $installdir/post/otherpkgs/$ostype/$osarch/compilers');
+
+    #pkglist
+    open($CONFILE, ">>$installdir/custom/netboot/$ostype/$profile.pkglist");
+    if ($ostype =~ /rh/i){
+        print $CONFILE "#INCLUDE:/opt/xcat/share/xcat/IBMhpc/pe/pe.$ostype.pkglist#\n";
+    }
+    else{
+        print $CONFILE "#INCLUDE:/opt/xcat/share/xcat/IBMhpc/compilers/compilers.pkglist#\n";
+        print $CONFILE "#INCLUDE:/opt/xcat/share/xcat/IBMhpc/pe/pe.pkglist#\n";
+    }
+    close($CONFILE);
+
+    #otherpaglist
+    open($CONFILE, ">>$installdir/custom/netboot/$ostype/$profile.otherpkgs.pkglist");
+    print $CONFILE "#INCLUDE:/opt/xcat/share/xcat/IBMhpc/pe/pe.otherpkgs.pkglist#\n";
+    close($CONFILE);
+
+    #exlist
+    open ($CONFILE, ">>$installdir/custom/netboot/$ostype/$profile.exlist");
+    print $CONFILE "#INCLUDE:/opt/xcat/share/xcat/IBMhpc/compilers/compilers.exlist#\n";
+    print $CONFILE "#INCLUDE:/opt/xcat/share/xcat/IBMhpc/pe/pe.exlist#\n";
+    close ($CONFILE);
+
+    #postinstall
+    open($CONFILE, ">>$installdir/custom/netboot/$ostype/$profile.postinstall");
+    print $CONFILE "installroot=\$1 NODESETSTATE=genimage   /opt/xcat/share/xcat/IBMhpc/compilers/compilers_license";
+    print $CONFILE "installroot=\$1 pedir=/install/post/otherpkgs/rhels6/ppc64/pe NODESETSTATE=genimage   /opt/xcat/share/xcat/IBMhpc/pe/pe_install";
+    close ($CONFILE);
+}
+
+sub web_restoreChange{
+    my ($software, $archFlag, $imagetype, $ostype, $installdir) = @_;
+    #recover all file in the $installdir/custom/netboot/$ostype/
+    if ($software){
+        system("rm -f $installdir/custom/netboot/$ostype/*.*");
+    }
+
+    if ($archFlag){
+        system("mv /tmp/webImageArch/*.* $installdir/custom/netboot/$ostype/");
+    }
+
+    #recover the litefile table for statelite image
+    if ('statelite' == $imagetype){
+        system("rm -r /tmp/litefile.csv ; mv /tmp/litefilearchive.csv /tmp/litefile.csv ; tabrestore /tmp/litefile.csv");
+    }
+}
 1;
\ No newline at end of file