diff --git a/org.eclipse.epf.web.search/.classpath b/org.eclipse.epf.web.search/.classpath
index 11c9c2b..e0ed5de 100644
--- a/org.eclipse.epf.web.search/.classpath
+++ b/org.eclipse.epf.web.search/.classpath
@@ -1,8 +1,8 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="lib" path="lib/icu4j_3_4.jar"/>
-	<classpathentry kind="lib" path="lib/lucene-core-1.9.1.jar"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="lib" path="lib/icu4j_3_4.jar"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
+	<classpathentry kind="lib" path="lib/lucene-core-2.9.1.jar"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.epf.web.search/lib/lucene-core-2.9.1.jar b/org.eclipse.epf.web.search/lib/lucene-core-2.9.1.jar
new file mode 100644
index 0000000..a5cfb35
--- /dev/null
+++ b/org.eclipse.epf.web.search/lib/lucene-core-2.9.1.jar
Binary files differ
diff --git a/org.eclipse.epf.web.search/src/org/eclipse/epf/web/search/IndexSearch.java b/org.eclipse.epf.web.search/src/org/eclipse/epf/web/search/IndexSearch.java
index d25f5c9..9182f81 100644
--- a/org.eclipse.epf.web.search/src/org/eclipse/epf/web/search/IndexSearch.java
+++ b/org.eclipse.epf.web.search/src/org/eclipse/epf/web/search/IndexSearch.java
@@ -1,16 +1,22 @@
 package org.eclipse.epf.web.search;
 
+import java.io.File;
+import java.util.Arrays;
+import java.util.List;
 import java.util.StringTokenizer;
 
 import org.apache.lucene.analysis.Analyzer;
+import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.queryParser.ParseException;
 import org.apache.lucene.queryParser.QueryParser;
-import org.apache.lucene.search.Hits;
 import org.apache.lucene.search.IndexSearcher;
 import org.apache.lucene.search.Query;
 import org.apache.lucene.search.Searcher;
 import org.apache.lucene.search.Sort;
-import org.apache.lucene.store.RAMDirectory;
+import org.apache.lucene.search.TopDocs;
+import org.apache.lucene.store.Directory;
+import org.apache.lucene.store.FSDirectory;
+import org.apache.lucene.util.Version;
 import org.eclipse.epf.web.search.analysis.CJKAnalyzer;
 import org.eclipse.epf.web.search.analysis.ChineseAnalyzer;
 import org.eclipse.epf.web.search.analysis.TextAnalyzer;
@@ -21,24 +27,25 @@
 public class IndexSearch {
 
 	private static Searcher searcher;
-	
+
 	/**
 	 * @param indexLocation
 	 * @param inputQuery
 	 * @param searchField
-	 * @param analyzerName: name of analyzer class
+	 * @param analyzerName
+	 *            : name of analyzer class
 	 * @return
 	 */
-	public static Hits search(String indexLocation, String inputQuery,
-		String searchField, String analyzerName) {
+	public static TopDocs search(String indexLocation, String inputQuery,
+			String searchField, String analyzerName) {
 		
-		Hits hits = null;
+		TopDocs hits = null;
 		Query q = null;
 		String queryString = null;
 		DecimalFormat scoreFormatter = new DecimalFormat("0.######");
 
 		if (indexLocation == null || inputQuery == null || searchField == null
-			|| searchField.length() == 0 || inputQuery.length() == 0)
+				|| searchField.length() == 0 || inputQuery.length() == 0)
 			return null;
 
 		try {
@@ -48,58 +55,60 @@
 				return null;
 
 			if (searcher == null) {
-				searcher = new IndexSearcher(new RAMDirectory(indexLocation));
-//				searcher = new IndexSearcher(FSDirectory.getDirectory(indexLocation,
-//					false));
-			}		
-						
-			if ( searcher == null ) {
+				//searcher = new IndexSearcher(new RAMDirectory(indexLocation));
+				// searcher = new
+				//searcher= new IndexSearcher(FSDirectory.getDirectory(indexLocation, false));
+				Directory dir = FSDirectory.open(new File(indexLocation));
+				searcher = new IndexSearcher(IndexReader.open(dir));
+			}
+
+			if (searcher == null) {
 				return hits;
 			}
-			
-//			Sort sort = new Sort(new SortField[]{					
-//					new SortField("title"),
-//					new SortField("summary")
-//					});
-			
-			// per user's request, the sorting should be based on the hit rate, 
+
+			// Sort sort = new Sort(new SortField[]{
+			// new SortField("title"),
+			// new SortField("summary")
+			// });
+
+			// per user's request, the sorting should be based on the hit rate,
 			// so don't pass in any sorting criteria
 			Sort sort = null;
-			
-			try {				
+			try {
 				Analyzer analyzer = null;
 				if (analyzerName != null) {
 					if (analyzerName.equals("CJKAnalyzer")) {//$NON-NLS-1$)
 						analyzer = new CJKAnalyzer();
 					}
 				}
-				if (analyzer == null) { 	
-					analyzer = new TextAnalyzer();				
-				}				
+				if (analyzer == null) {
+					analyzer = new TextAnalyzer();
+				}
 				if (DebugUtil.DEBUG) {
 					System.out.println("LD> analyzer: " + analyzer);
 				}
-				q = QueryParser.parse(queryString, searchField,
-						analyzer);
-				if ( q != null ) {
-					hits = searcher.search(q, (Sort)sort);
+				//q = QueryParser.parse(queryString, searchField, analyzer);
+				QueryParser parser = new QueryParser(Version.LUCENE_29, searchField, analyzer);
+				q =  parser.parse(queryString);
+				if (q != null) {
+					hits = searcher.search(q, 1000);
 				}
-			} catch (Throwable th ) {
+			} catch (Throwable th) {
 				hits = null;
 			}
-			
-			if ( hits == null ) {
+
+			if (hits == null) {
 				// note: icu4j failed with jre 1.5 in server mode.
 				// in such a case, try the old one
-				q = QueryParser.parse(queryString, searchField,
-						new ChineseAnalyzer());
-				if ( q != null ) {
-					hits = searcher.search(q, (Sort)sort);
+				//q = QueryParser.parse(queryString, searchField, new ChineseAnalyzer());
+				QueryParser parser = new QueryParser(Version.LUCENE_29, searchField, new ChineseAnalyzer());
+				q =  parser.parse(queryString);
+				if (q != null) {
+					hits = searcher.search(q, 1000);
 				}
 			}
-			
+
 			return hits;
-			
 
 		} catch (ParseException pe) {
 			pe.printStackTrace();
@@ -112,55 +121,244 @@
 		return hits;
 	}
 
-	/*
-	 * detect hyphenated words and if hyphenate, put quotes around so that they are
-	 * considered one word for example,"use-case" as opposed to use-case, which Lucene
-	 * interprets as "use" NOT "case" which is not what we want. algorithm: first tokenize
-	 * by space to isolate words next, if words have hyphens, put quotes at the beginning
-	 * and end append to buffer
+	/**
+	 * This method enhances search functionality so that search now works with
+	 * type, title and tag.
+	 * 
+	 * @param indexLocation
+	 * @param inputQuery
+	 * @param searchField
+	 * @param searchType
+	 * @param cbValue
+	 *            : boolean value of searchTitleOnly checkbox
+	 * @param txtTags
+	 * @param analyzerName
+	 *            : name of analyzer class
+	 * @return
 	 */
-	public static String detectHyphenated(String queryString) {		
+	public static TopDocs searchNew(String indexLocation, String inputQuery,
+			String searchField, String searchType, boolean cbValue,
+			String txtTags, String analyzerName) {
+		
+		TopDocs hits = null;
+		Query q = null;
+		String queryString = null;
+		DecimalFormat scoreFormatter = new DecimalFormat("0.######");
+
+		if (indexLocation == null || inputQuery == null || searchField == null
+				|| searchField.length() == 0 || searchType == null
+				|| searchType.length() == 0 || inputQuery.length() == 0)
+			return null;
+
+		try {
+			queryString = detectHyphenated(inputQuery);
+			
+			if (queryString == null || queryString.length() == 0)
+				return null;
+
+			if (searcher == null) {
+				Directory dir = FSDirectory.open(new File(indexLocation));
+				searcher = new IndexSearcher(IndexReader.open(dir));
+			}
+
+			if (searcher == null) {
+				return hits;
+			}
+
+			// Sort sort = new Sort(new SortField[]{
+			// new SortField("title"),
+			// new SortField("summary")
+			// });
+
+			// per user's request, the sorting should be based on the hit rate,
+			// so don't pass in any sorting criteria
+			Sort sort = null;
+
+			try {
+				Analyzer analyzer = null;
+				if (analyzerName != null) {
+					if (analyzerName.equals("CJKAnalyzer")) {//$NON-NLS-1$)
+						analyzer = new CJKAnalyzer();
+					}
+				}
+				if (analyzer == null) {
+					analyzer = new TextAnalyzer();
+				}
+				if (DebugUtil.DEBUG) {
+					System.out.println("LD> analyzer: " + analyzer);
+				}
+				String str = txtTags;
+				String queryForList = "";
+				String temp = "";
+
+				List<String> process = Arrays.asList("Activity",
+						"CapabilityPattern", "DeliveryProcess", "Iteration",
+						"Milestone", "Phase", "RoleDescriptor",
+						"TaskDescriptor", "WorkProductDescriptor");
+				List<String> guidance = Arrays.asList("Checklist", "Concept",
+						"Example", "Guideline", "EstimationConsideration",
+						"Practice", "Report", "ReusableAsset", "RoadMap",
+						"SupportingMaterial", "TermDefinition", "Template",
+						"ToolMentor", "Whitepaper");
+				List<String> category = Arrays.asList("CustomCategory",
+						"Domain", "Discipline", "RoleSet", "RoleSetGrouping",
+						"Tool");
+				List<String> workProductType = Arrays.asList("Artifact",
+						"Deliverable", "Outcome");
+
+				if ((!"<All>".equals(searchType))) {
+					// check for (lists->Process,guidance,category,work_product)
+					switch (searchType.replaceAll(" ", "").toLowerCase()) {
+					case "category":
+						queryForList = createQueryForList(category, inputQuery);
+						break;
+					case "guidance":
+						queryForList = createQueryForList(guidance, inputQuery);
+						break;
+					case "process":
+						queryForList = createQueryForList(process, inputQuery);
+						break;
+					case "workproducttype":
+						queryForList = createQueryForList(workProductType,
+								inputQuery);
+						break;
+					default: // applicable for all cases except list and <All>
+						searchType = searchType.replaceAll("[-]", "");
+						inputQuery = "uma.type:" + searchType + " AND "
+								+ "contents:" + inputQuery;
+						break;
+					}
+					if (!queryForList.isEmpty()) {
+						inputQuery = queryForList;
+					}
+				} else { // if <All>
+					inputQuery = "contents:" + inputQuery;
+				}
+				// check for title-only values
+				if (cbValue) {
+					inputQuery = inputQuery + " AND " + "title:" + queryString;
+				}
+				// check for tags
+				if (str != null && !str.isEmpty()) {
+					List<String> tagList = Arrays.asList(str.split(",[ ]*"));
+					for (String tag : tagList) {
+						tag = detectHyphenated(tag);
+						inputQuery = inputQuery + " AND " + "tags:" + tag;
+					}
+				}
+				/*QueryParser parser = new QueryParser(searchField, analyzer);
+				q = parser.parse(inputQuery);*/
+				QueryParser parser = new QueryParser(Version.LUCENE_29, searchField, analyzer);
+				q =  parser.parse(inputQuery);
+				if (q != null) {
+					hits = searcher.search(q, 1000);
+				}
+
+			} catch (Throwable th) {
+				hits = null;
+			}
+
+			if (hits == null) {
+				// note: icu4j failed with jre 1.5 in server mode.
+				// in such a case, try the old one
+				//q = QueryParser.parse(queryString, searchField, new ChineseAnalyzer());
+				QueryParser parser = new QueryParser(Version.LUCENE_29, searchField, new ChineseAnalyzer());
+				q =  parser.parse(inputQuery);
+				if (q != null) {
+					hits = searcher.search(q, 1000);
+				}
+			}
+			return hits;
+
+		} catch (ParseException pe) {
+			pe.printStackTrace();
+		} catch (java.io.IOException io) {
+			io.printStackTrace();
+		} catch (Throwable p1) {
+			p1.printStackTrace();
+		}
+
+		return hits;
+	}
+
+	/**
+	 * This method is used to iterate through and create query for the 4 lists -
+	 * Process, Guidance, Category, Work Product Type.
+	 * 
+	 * @param List
+	 *            list - based on user input passed as type field. String
+	 *            inputQuery - String text to be searched through the list.
+	 * 
+	 * @return String This returns the query to be parsed through the
+	 *         queryparser.
+	 */
+	private static String createQueryForList(List<String> list,
+			String inputQuery) {
+		// TODO Auto-generated method stub
+		String queryForList = "";
+		String temp = "";
+		for (String values : list) {
+			temp = "(uma.type:" + values + " AND " + "contents:" + inputQuery
+					+ ")";
+			if (queryForList.isEmpty()) {
+				queryForList = temp;
+			} else {
+				queryForList = queryForList + " OR " + temp;
+			}
+		}
+		return queryForList;
+	}
+
+	/*
+	 * detect hyphenated words and if hyphenate, put quotes around so that they
+	 * are considered one word for example,"use-case" as opposed to use-case,
+	 * which Lucene interprets as "use" NOT "case" which is not what we want.
+	 * algorithm: first tokenize by space to isolate words next, if words have
+	 * hyphens, put quotes at the beginning and end append to buffer
+	 */
+	public static String detectHyphenated(String queryString) {
 		StringTokenizer spaceTokenizer = new StringTokenizer(queryString);
 		StringBuffer wordBuffer = new StringBuffer();
-				
+
 		while (spaceTokenizer.hasMoreTokens()) {
 			// isolate into words
 			String word = spaceTokenizer.nextToken();
-			if ((word.indexOf('-') != -1 ) && !word.startsWith("\"")) //$NON-NLS-1$
+			if ((word.indexOf('-') != -1) && !word.startsWith("\"")) //$NON-NLS-1$
 			{
 				// hyphen found, and word is not already an exact phrase,
 				// so add quotes to beginning and end of word
 				wordBuffer.append("\""); //$NON-NLS-1$
 				wordBuffer.append(word);
 				wordBuffer.append("\""); //$NON-NLS-1$
-				//System.out.println("if: " + wordBuffer.toString());
+				// System.out.println("if: " + wordBuffer.toString());
 			} else {
-				//System.out.println("else: " + queryString);
-				return queryString;  //RATLC00251031
-				//wordBuffer.append(word);				
+				// System.out.println("else: " + queryString);
+				return queryString; // RATLC00251031
+				// wordBuffer.append(word);
 			}
 			if (spaceTokenizer.hasMoreTokens()) {
 				wordBuffer.append(" "); //$NON-NLS-1$
 			}
 		}
-		
-		
+
 		return wordBuffer.toString();
 	}
 
 	/**
 	 * @param args
 	 */
-//	public static void main(String[] args) {
-//		if (args.length > 0) {
-//			// String rupPath = System.getProperty( "user.home" ) + java.io.File.separator
-//			// + "rup";
-//			String rupPath = args[0];
-//			SortedHits sortedHits = IndexSearch.search(rupPath + "\\index", "Analyst",
-//				"contents");
-//			System.out
-//				.println("There are " + sortedHits.length() + " hits for 'analyst'");
-//		}
-//
-//	}
+	// public static void main(String[] args) {
+	// if (args.length > 0) {
+	// // String rupPath = System.getProperty( "user.home" ) +
+	// java.io.File.separator
+	// // + "rup";
+	// String rupPath = args[0];
+	// SortedHits sortedHits = IndexSearch.search(rupPath + "\\index",
+	// "Analyst",
+	// "contents");
+	// System.out
+	// .println("There are " + sortedHits.length() + " hits for 'analyst'");
+	// }
+	//
+	// }
 }
\ No newline at end of file
diff --git a/org.eclipse.epf.web.search/src/org/eclipse/epf/web/search/analysis/ChineseFilter.java b/org.eclipse.epf.web.search/src/org/eclipse/epf/web/search/analysis/ChineseFilter.java
index 3cf281f..696d295 100644
--- a/org.eclipse.epf.web.search/src/org/eclipse/epf/web/search/analysis/ChineseFilter.java
+++ b/org.eclipse.epf.web.search/src/org/eclipse/epf/web/search/analysis/ChineseFilter.java
@@ -5,6 +5,7 @@
 
 import java.util.Hashtable;
 import java.util.ResourceBundle;
+import java.util.Set;
 import java.util.StringTokenizer;
 
 import org.apache.lucene.analysis.StopAnalyzer;
@@ -22,7 +23,7 @@
     {
     	super(in);
     	
-        input = in;
+       // input = in;
 
         if (_stopTable == null) {
 			loadStopWords();
@@ -74,9 +75,13 @@
 			String property = bundle.getString("Search.stopWords"); //$NON-NLS-1$
 			words = split(property, " ,", -1); //$NON-NLS-1$		
 		} catch (Exception e) {
-			words = StopAnalyzer.ENGLISH_STOP_WORDS;
+			//words = StopAnalyzer.ENGLISH_STOP_WORDS;
+			Set<?> stopWords = StopAnalyzer.ENGLISH_STOP_WORDS_SET;
+			words = stopWords.toArray(new String[stopWords.size()]);
 		}
-		_stopTable = StopFilter.makeStopTable(words);
+	
+		
+		_stopTable = (Hashtable) StopFilter.makeStopSet(words);
 	}
 	
 	/**
diff --git a/org.eclipse.epf.web/.classpath b/org.eclipse.epf.web/.classpath
index 3bde06c..f9ddb93 100644
--- a/org.eclipse.epf.web/.classpath
+++ b/org.eclipse.epf.web/.classpath
@@ -1,10 +1,10 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="lib" path="lib/servlet.jar"/>
-	<classpathentry kind="lib" path="/org.eclipse.epf.web.search/lib/icu4j_3_4.jar"/>
-	<classpathentry kind="lib" path="/org.eclipse.epf.web.search/lib/lucene-core-1.9.1.jar"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/org.eclipse.epf.web.search"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="lib" path="lib/servlet.jar"/>
+	<classpathentry kind="lib" path="/org.eclipse.epf.web.search/lib/icu4j_3_4.jar"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/org.eclipse.epf.web.search"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="lib" path="/org.eclipse.epf.web.search/lib/lucene-core-2.9.1.jar"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.epf.web/src/org/eclipse/epf/web/servlet/SearchServlet.java b/org.eclipse.epf.web/src/org/eclipse/epf/web/servlet/SearchServlet.java
index 1e27c74..fe6fab0 100644
--- a/org.eclipse.epf.web/src/org/eclipse/epf/web/servlet/SearchServlet.java
+++ b/org.eclipse.epf.web/src/org/eclipse/epf/web/servlet/SearchServlet.java
@@ -3,6 +3,7 @@
 //------------------------------------------------------------------------------
 package org.eclipse.epf.web.servlet;
 
+import java.io.File;
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.io.StringWriter;
@@ -19,7 +20,13 @@
 
 import org.apache.lucene.document.Document;
 import org.apache.lucene.document.Field;
+import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.search.Hits;
+import org.apache.lucene.search.IndexSearcher;
+import org.apache.lucene.search.Searcher;
+import org.apache.lucene.search.TopDocs;
+import org.apache.lucene.store.Directory;
+import org.apache.lucene.store.FSDirectory;
 import org.eclipse.epf.web.search.IndexLoader;
 import org.eclipse.epf.web.search.IndexSearch;
 import org.eclipse.epf.web.search.SearchResources;
@@ -43,10 +50,11 @@
 	private String _currentSearchString;
 	private String _queryString;
 	private String _webAppName;
-	private Hits _hits;
+	private TopDocs _hits;
 	private int _numHits;
 	private int _currentPage;
 	private String analyzerName;
+	private static Searcher searcher;
 
 	private HttpServletResponse _response;
 
@@ -63,6 +71,11 @@
 					config.getInitParameter("searchIndex"));
 			_xslURL = config.getServletContext().getRealPath(
 					config.getInitParameter("xslFile"));
+			 if (searcher == null) {
+			        Directory dir = FSDirectory.open(new File(_indexPath));
+			        searcher = new IndexSearcher(IndexReader.open(dir));
+			    
+			 }
 		} catch (Exception e) {
 			e.printStackTrace();
 		}
@@ -87,12 +100,13 @@
 			
 			synchronized(session) {
 				String results;
+				String newResults;
 				String action = request.getParameter("action");
 				_webAppName = request.getContextPath();
 
 				if (action != null && action.length() > 0) {
 					
-					_hits = (Hits) session.getAttribute("hits");					
+					_hits = (TopDocs) session.getAttribute("hits");					
 					_queryString = (String) session.getAttribute("queryString");
 					_numHits = ((Integer) session.getAttribute("numHits")).intValue();
 					_currentPage = ((Integer) session.getAttribute("currentPage")).intValue();
@@ -111,6 +125,11 @@
 				} else {
 					
 					String searchString = request.getParameter("searchString");
+			        String searchType = request.getParameter("searchType");
+			        boolean cbValue = Boolean.parseBoolean(request.getParameter("cbValue"));
+			        String txtTags = request.getParameter("txtTags");
+			        int hitsPerPage = Integer.parseInt(request.getParameter("hitsPerPage"));
+			        
 					if (DebugUtil.DEBUG) {
 						System.out.println("LD> searchString: " + searchString);
 						System.out.println("LD> documentBasePath: " + _pathDocumentBase);
@@ -130,12 +149,14 @@
 					if (resultsPerPage != null && resultsPerPage.length() > 0) {
 						_hitsPerPage = Integer.parseInt(resultsPerPage);
 					}
+					
 					results = runSearch(searchString);
+					newResults = runSearchNew(searchString, searchType, cbValue, txtTags, hitsPerPage);
 					session.setAttribute("hits", _hits);
 					session.setAttribute("queryString", _queryString);
 					session.setAttribute("numHits", new Integer(_numHits));
 					session.setAttribute("currentPage", new Integer(_currentPage));
-					out.println(results);					
+					out.println(newResults);					
 				}
 			}
 
@@ -210,12 +231,12 @@
 			_hits = IndexSearch.search(_indexPath, _currentSearchString, searchField, analyzerName);// new
 			if (DebugUtil.DEBUG) {
 				System.out.println("LD> _hits: " + 
-						(_hits == null ? "null" : Integer.toString(_hits.length())));//$NON-NLS-1$ //$NON-NLS-2$
+						(_hits == null ? "null" : Integer.toString(_hits.totalHits)));//$NON-NLS-1$ //$NON-NLS-2$
 			}
 			
 			// SortedHits(hits);
 
-			_numHits = _hits.length();
+			_numHits = _hits.totalHits;
 
 			result = true;
 		} catch (Exception e1) {
@@ -229,6 +250,77 @@
 	}
 
 	/**
+	 * Performs the advanced search with new search dialog.
+	 */
+	private String runSearchNew(String searchString, String searchType, boolean cbValue, String txtTags, int _hitsPerPage2)
+	  {
+
+		try {
+
+			_queryString = searchString;//.replace(':', ' '); // RATLC00251228  enable to use tag to filte search results
+
+			_currentSearchString = IndexSearch.detectHyphenated(_queryString); // wordBuffer.toString();
+
+			if (_currentSearchString.length() == 0) {
+				return EMPTY_HTML;
+			}
+
+			boolean safe = runQueryNew("contents", searchType, cbValue, txtTags);
+
+			String result = updateOutput(safe);
+
+			return (result == null) ? EMPTY_HTML : result;
+
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		return EMPTY_HTML;
+	}
+	
+	private boolean runQueryNew(String searchField, String searchType, boolean cbValue, String txtTags)
+	  {
+		boolean result = false;
+		//_currentSearchString = "\u57FA\u672C\u539F\u5247";
+		try {
+			if (DebugUtil.DEBUG) {
+				System.out.println("LD> _indexPath: " + _indexPath);//$NON-NLS-1$
+				System.out.println("LD> _currentSearchString: " + _currentSearchString);//$NON-NLS-1$
+			}
+			if (_currentSearchString != null) {
+				if (DebugUtil.DEBUG) {
+					System.out.println("LD> unicodes: " + 
+						escapeUnicodeString(_currentSearchString, false));//$NON-NLS-1$
+				}
+			}
+			
+			if (DebugUtil.DEBUG) {
+				System.out.println("LD> analyzerName: " + analyzerName);//$NON-NLS-1$
+			}
+			
+			_hits = IndexSearch.searchNew(_indexPath, this._currentSearchString, 
+			        searchField, searchType, cbValue, txtTags, this.analyzerName);// new
+			if (DebugUtil.DEBUG) {
+				System.out.println("LD> _hits: " + 
+						(_hits == null ? "null" : Integer.toString(_hits.totalHits)));//$NON-NLS-1$ //$NON-NLS-2$
+			}
+			
+			// SortedHits(hits);
+
+			_numHits = _hits.totalHits;
+
+			result = true;
+		} catch (Exception e1) {
+			e1.printStackTrace();
+			_numHits = 0;
+			_hits = null;
+		}
+		_currentPage = 0;
+
+		return result;
+	}
+	
+	/**
 	 * Updates the results panel with the search output.
 	 */
 	private String updateOutput(boolean safe) {
@@ -281,7 +373,9 @@
 					.append("\">"); //$NON-NLS-1$
 
 			for (int i = init; i < max; i++) {
-				Document doc = _hits.doc(i);
+				
+				//Document doc = _hits.doc(i);
+				Document doc = searcher.doc(_hits.scoreDocs[i].doc);
 				Field url = doc.getField("url"); //$NON-NLS-1$
 				Field title = doc.getField("title"); //$NON-NLS-1$
 				Field summary = doc.getField("summary"); //$NON-NLS-1$
