From: jsurfer <jsurfer>
Date: Thu, 23 Sep 2004 19:45:15 +0000 (+0000)
Subject: added first version of codetemplates (needs to fix some bugs)
X-Git-Url: http://git.phpeclipse.com

added first version of codetemplates (needs to fix some bugs)
---

diff --git a/net.sourceforge.phpeclipse/plugin.xml b/net.sourceforge.phpeclipse/plugin.xml
index a767b83..b82edda 100644
--- a/net.sourceforge.phpeclipse/plugin.xml
+++ b/net.sourceforge.phpeclipse/plugin.xml
@@ -1396,6 +1396,18 @@
             id="net.sourceforge.phpeclipse.preference.PHPEclipsePreferencePage">
       </page>
       <page
+            name="Code Templates"
+            category="net.sourceforge.phpeclipse.preference.PHPEclipsePreferencePage"
+            class="net.sourceforge.phpdt.internal.ui.preferences.CodeTemplatePreferencePage"
+            id="net.sourceforge.phpeclipse.preference.CodeTemplatePreferencePage">
+      </page>
+  <!--    <page
+            name="Members Sort Order"
+            category="net.sourceforge.phpeclipse.preference.PHPEclipsePreferencePage"
+            class="net.sourceforge.phpdt.internal.ui.preferences.MembersOrderPreferencePage"
+            id="net.sourceforge.phpeclipse.preference.MembersOrderPreferencePage">
+      </page> -->
+      <page
             name="PHP External Parser Command"
             category="net.sourceforge.phpeclipse.preference.PHPEclipsePreferencePage"
             class="net.sourceforge.phpeclipse.preferences.PHPEclipseParserPreferencePage"
@@ -1464,13 +1476,13 @@
             category="net.sourceforge.phpeclipse.preference.PHPEclipsePreferencePage"
             class="net.sourceforge.phpeclipse.PHPLanguagePreferencePage"
             id="net.sourceforge.phpeclipse.preference.PHPLanguagePreferencePage">
-      </page> 
+      </page> -->
       <page 
             name="%spellingPrefName"
             category= "net.sourceforge.phpeclipse.preference.PHPEclipsePreferencePage"
             class="net.sourceforge.phpdt.internal.ui.preferences.SpellingPreferencePage"
             id = "net.sourceforge.phpdt.internal.ui.preferences.SpellingPreferencePage">
-      </page>	-->
+      </page> 
    </extension>
    <extension
          point="org.eclipse.ui.editors.documentProviders">
@@ -1801,7 +1813,7 @@
 		</provider>
 	</extension>
 	
-	<!-- =========================================================================== -->
+<!-- =========================================================================== -->
 <!-- Templates                                                                   -->
 <!-- =========================================================================== -->
    <extension
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/builder/PHPBuilder.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/builder/PHPBuilder.java
index b345248..6cd1981 100644
--- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/builder/PHPBuilder.java
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/builder/PHPBuilder.java
@@ -45,11 +45,12 @@ import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.OperationCanceledException;
+
 public class PHPBuilder extends IncrementalProjectBuilder {
   IProject currentProject;
   JavaProject javaProject;
   IWorkspaceRoot workspaceRoot;
-  NameEnvironment nameEnvironment;
+  NameEnvironment nameEnvironment; 
   SimpleLookupTable binaryLocationsPerProject; // maps a project to its binary
   // resources (output folders,
   // class folders, zip/jar files)
@@ -688,10 +689,10 @@ public class PHPBuilder extends IncrementalProjectBuilder {
     JavaModelManager.getJavaModelManager().setLastBuiltState(currentProject,
         state);
   }
-  /**
-   * String representation for debugging purposes
-   */
-  public String toString() {
+  /** 
+   * String representation for debugging purposes 
+   */ 
+  public String toString() { 
     return currentProject == null ? "JavaBuilder for unknown project" //$NON-NLS-1$
         : "JavaBuilder for " + currentProject.getName(); //$NON-NLS-1$
   }
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/corext/codemanipulation/CodeGenerationSettings.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/corext/codemanipulation/CodeGenerationSettings.java
new file mode 100644
index 0000000..2e8bf98
--- /dev/null
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/corext/codemanipulation/CodeGenerationSettings.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials 
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package net.sourceforge.phpdt.internal.corext.codemanipulation;
+
+public class CodeGenerationSettings {
+	
+	/**
+	 * @deprecated
+	 */
+	public boolean createFileComments= true;
+
+	public boolean createComments= true;
+	
+	public boolean useKeywordThis= false;
+	
+	/**
+	 * @deprecated
+	 */
+	public boolean createNonJavadocComments= true;
+	
+	public String[] importOrder= new String[0];
+	public int importThreshold= 99;
+		
+	public int tabWidth;
+	
+	public void setSettings(CodeGenerationSettings settings) {
+		settings.createComments= createComments;
+		settings.useKeywordThis= useKeywordThis;
+		settings.importOrder= importOrder;
+		settings.importThreshold= importThreshold;
+		settings.tabWidth= tabWidth;
+	}
+	
+
+}
+
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/corext/codemanipulation/StubUtility.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/corext/codemanipulation/StubUtility.java
index ca646ed..8c4c7e0 100644
--- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/corext/codemanipulation/StubUtility.java
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/corext/codemanipulation/StubUtility.java
@@ -4,386 +4,882 @@
  */
 package net.sourceforge.phpdt.internal.corext.codemanipulation;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
+import java.util.StringTokenizer;
+import java.util.jar.Attributes.Name;
+
+import net.sourceforge.phpdt.core.Flags;
+import net.sourceforge.phpdt.core.IBuffer;
 import net.sourceforge.phpdt.core.ICodeFormatter;
+import net.sourceforge.phpdt.core.ICompilationUnit;
+import net.sourceforge.phpdt.core.IJavaElement;
 import net.sourceforge.phpdt.core.IJavaProject;
+import net.sourceforge.phpdt.core.IMethod;
+import net.sourceforge.phpdt.core.IPackageFragment;
+import net.sourceforge.phpdt.core.IType;
 import net.sourceforge.phpdt.core.JavaCore;
+import net.sourceforge.phpdt.core.JavaModelException;
+import net.sourceforge.phpdt.core.Signature;
 import net.sourceforge.phpdt.core.ToolFactory;
+import net.sourceforge.phpdt.internal.corext.template.php.CodeTemplateContext;
+import net.sourceforge.phpdt.internal.corext.template.php.CodeTemplateContextType;
+import net.sourceforge.phpdt.internal.corext.util.JavaModelUtil;
+import net.sourceforge.phpdt.internal.corext.util.Strings;
+import net.sourceforge.phpdt.internal.ui.PHPUIStatus;
+import net.sourceforge.phpeclipse.PHPeclipsePlugin;
 
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
 import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.Document;
 import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.templates.Template;
+import org.eclipse.jface.text.templates.TemplateBuffer;
+import org.eclipse.jface.text.templates.TemplateException;
+import org.eclipse.jface.text.templates.TemplateVariable;
+import org.eclipse.swt.SWT;
 
 public class StubUtility {
 	
 	
-//	public static class GenStubSettings extends CodeGenerationSettings {
-//	
-//		public boolean callSuper;
-//		public boolean methodOverwrites;
-//		public boolean noBody;
-//		
-//		public GenStubSettings(CodeGenerationSettings settings) {
-//			settings.setSettings(this);	
-//		}
-//		
-//		public GenStubSettings() {
-//		}
-//			
-//	}
-//	
-//
-//	/**
-//	 * Generates a stub. Given a template method, a stub with the same signature
-//	 * will be constructed so it can be added to a type.
-//	 * @param destTypeName The name of the type to which the method will be added to (Used for the constructor)
-//	 * @param method A method template (method belongs to different type than the parent)
-//	 * @param options Options as defined above (<code>GenStubSettings</code>)
-//	 * @param imports Imports required by the stub are added to the imports structure. If imports structure is <code>null</code>
-//	 * all type names are qualified.
-//	 * @throws JavaModelException
-//	 */
-//	public static String genStub(String destTypeName, IMethod method, GenStubSettings settings, IImportsStructure imports) throws JavaModelException {
-//		IType declaringtype= method.getDeclaringType();	
-//		StringBuffer buf= new StringBuffer();
-//		String methodName= method.getElementName();
-//		String[] paramTypes= method.getParameterTypes();
-//		String[] paramNames= method.getParameterNames();
-//		String[] excTypes= method.getExceptionTypes();
-//		String retTypeSig= method.getReturnType();
-//		int flags= method.getFlags();
-//		boolean isConstructor= method.isConstructor();
-//		
-//		int lastParam= paramTypes.length -1;		
-//		
-//		
-//		if (settings.createComments) {
-//			if (isConstructor) {
-//				String desc= "Constructor for " + destTypeName; //$NON-NLS-1$
-//				genJavaDocStub(desc, paramNames, Signature.SIG_VOID, excTypes, buf);
-//			} else {			
-//				// php doc
-//				if (settings.methodOverwrites) {
-//					boolean isDeprecated= Flags.isDeprecated(flags);
-//					genJavaDocSeeTag(declaringtype, methodName, paramTypes, settings.createNonJavadocComments, isDeprecated, buf);
-//				} else {
-//					// generate a default php doc comment
-//					String desc= "Method " + methodName; //$NON-NLS-1$
-//					genJavaDocStub(desc, paramNames, retTypeSig, excTypes, buf);
-//				}
+	public static class GenStubSettings extends CodeGenerationSettings {
+		
+			public boolean callSuper;
+			public boolean methodOverwrites;
+			public boolean noBody;
+			public int methodModifiers;
+			
+			public GenStubSettings(CodeGenerationSettings settings) {
+				settings.setSettings(this);
+				methodModifiers= -1;	
+			}
+			
+		}
+			
+		private static final String[] EMPTY= new String[0];
+		
+		/**
+		 * Generates a method stub including the method comment. Given a template
+		 * method, a stub with the same signature will be constructed so it can be
+		 * added to a type. The method body will be empty or contain a return or
+		 * super call.
+		 * @param destTypeName The name of the type to which the method will be
+		 * added to
+		 * @param method A method template (method belongs to different type than the parent)
+		 * @param definingType The type that defines the method.
+		 * @param settings Options as defined above (<code>GenStubSettings</code>)
+		 * @param imports Imports required by the stub are added to the imports structure. If imports structure is <code>null</code>
+		 * all type names are qualified.
+		 * @throws JavaModelException
+		 */
+		public static String genStub(ICompilationUnit cu, String destTypeName, IMethod method, IType definingType, GenStubSettings settings) throws CoreException { 
+		  //IImportsStructure imports) throws CoreException {
+			String methName= method.getElementName();
+			String[] paramNames= suggestArgumentNames(method.getJavaProject(), method.getParameterNames());
+			String returnType= method.isConstructor() ? null : method.getReturnType();
+			String lineDelimiter= String.valueOf('\n'); // reformatting required
+			
+			
+			StringBuffer buf= new StringBuffer();
+			// add method comment
+			if (settings.createComments && cu != null) {
+				IMethod overridden= null;
+				if (settings.methodOverwrites && returnType != null) {
+					overridden= JavaModelUtil.findMethod(methName, method.getParameterTypes(), false, definingType.getMethods());
+				}
+				String comment= getMethodComment(cu, destTypeName, methName, paramNames, method.getExceptionTypes(), returnType, overridden, lineDelimiter);
+				if (comment != null) {
+					buf.append(comment);
+				} else {
+					buf.append("/**").append(lineDelimiter); //$NON-NLS-1$
+					buf.append(" *").append(lineDelimiter); //$NON-NLS-1$
+					buf.append(" */").append(lineDelimiter); //$NON-NLS-1$							
+				}
+				buf.append(lineDelimiter);
+			}
+			// add method declaration
+			String bodyContent= null;
+			if (!settings.noBody) {
+				String bodyStatement= getDefaultMethodBodyStatement(methName, paramNames, returnType, settings.callSuper);
+				bodyContent= getMethodBodyContent(returnType == null, method.getJavaProject(), destTypeName, methName, bodyStatement, lineDelimiter);
+				if (bodyContent == null) {
+					bodyContent= ""; //$NON-NLS-1$
+				}
+			}
+			int flags= settings.methodModifiers;
+			if (flags == -1) {
+				flags= method.getFlags();
+			}
+			
+			genMethodDeclaration(destTypeName, method, flags, bodyContent, buf); // imports, buf);
+			return buf.toString();
+		}
+
+		/**
+		 * Generates a method stub not including the method comment. Given a
+		 * template method and the body content, a stub with the same signature will
+		 * be constructed so it can be added to a type.
+		 * @param destTypeName The name of the type to which the method will be
+		 * added to
+		 * @param method A method template (method belongs to different type than the parent)
+		 * @param bodyContent Content of the body
+		 * @param imports Imports required by the stub are added to the imports
+		 * structure. If imports structure is <code>null</code> all type names are
+		 * qualified.
+		 * @param buf The buffer to append the gerenated code.
+		 * @throws JavaModelException
+		 */
+		public static void genMethodDeclaration(String destTypeName, IMethod method, String bodyContent, StringBuffer buf) throws CoreException { // IImportsStructure imports, StringBuffer buf) throws CoreException {
+			genMethodDeclaration(destTypeName, method, method.getFlags(), bodyContent, buf);
+		}
+		
+		/**
+		 * Generates a method stub not including the method comment. Given a
+		 * template method and the body content, a stub with the same signature will
+		 * be constructed so it can be added to a type.
+		 * @param destTypeName The name of the type to which the method will be
+		 * added to
+		 * @param method A method template (method belongs to different type than the parent)
+		 * @param bodyContent Content of the body
+		 * @param imports Imports required by the stub are added to the imports
+		 * structure. If imports structure is <code>null</code> all type names are
+		 * qualified.
+		 * @param buf The buffer to append the gerenated code.
+		 * @throws JavaModelException
+		 */
+		public static void genMethodDeclaration(String destTypeName, IMethod method, int flags, String bodyContent, StringBuffer buf) throws CoreException {
+		  //IImportsStructure imports, StringBuffer buf) throws CoreException {
+			IType parentType= method.getDeclaringType();	
+			String methodName= method.getElementName();
+			String[] paramTypes= method.getParameterTypes();
+			String[] paramNames= suggestArgumentNames(parentType.getJavaProject(), method.getParameterNames());
+
+			String[] excTypes= method.getExceptionTypes();
+
+			boolean isConstructor= method.isConstructor();
+			String retTypeSig= isConstructor ? null : method.getReturnType();
+			
+			int lastParam= paramTypes.length -1;
+			
+			if (Flags.isPublic(flags) || (parentType.isInterface() && bodyContent != null)) {
+				buf.append("public "); //$NON-NLS-1$
+			} else if (Flags.isProtected(flags)) {
+				buf.append("protected "); //$NON-NLS-1$
+			} else if (Flags.isPrivate(flags)) {
+				buf.append("private "); //$NON-NLS-1$
+			}
+//			if (Flags.isSynchronized(flags)) {
+//				buf.append("synchronized "); //$NON-NLS-1$
+//			}		
+//			if (Flags.isVolatile(flags)) {
+//				buf.append("volatile "); //$NON-NLS-1$
 //			}
-//			buf.append('\n');
-//		}
-//		
-//		if (Flags.isPublic(flags) || isConstructor || (declaringtype.isInterface() && !settings.noBody)) {
-//			buf.append("public "); //$NON-NLS-1$
-//		} else if (Flags.isProtected(flags)) {
-//			buf.append("protected "); //$NON-NLS-1$
-//		} else if (Flags.isPrivate(flags)) {
-//			buf.append("private "); //$NON-NLS-1$
-//		}
-//		if (Flags.isSynchronized(flags)) {
-//			buf.append("synchronized "); //$NON-NLS-1$
-//		}		
-//		if (Flags.isVolatile(flags)) {
-//			buf.append("volatile "); //$NON-NLS-1$
-//		}
-//		if (Flags.isStrictfp(flags)) {
-//			buf.append("strictfp "); //$NON-NLS-1$
+//			if (Flags.isStrictfp(flags)) {
+//				buf.append("strictfp "); //$NON-NLS-1$
+//			}
+			if (Flags.isStatic(flags)) {
+				buf.append("static "); //$NON-NLS-1$
+			}		
+				
+			if (isConstructor) {
+				buf.append(destTypeName);
+			} else {
+				String retTypeFrm;
+				if (!isPrimitiveType(retTypeSig)) {
+					retTypeFrm= resolveAndAdd(retTypeSig, parentType);
+				} else {
+					retTypeFrm= Signature.toString(retTypeSig);
+				}
+				buf.append(retTypeFrm);
+				buf.append(' ');
+				buf.append(methodName);
+			}
+			buf.append('(');
+			for (int i= 0; i <= lastParam; i++) {
+				String paramTypeSig= paramTypes[i];
+				String paramTypeFrm;
+				
+				if (!isPrimitiveType(paramTypeSig)) {
+					paramTypeFrm= resolveAndAdd(paramTypeSig, parentType);
+				} else {
+					paramTypeFrm= Signature.toString(paramTypeSig);
+				}
+				buf.append(paramTypeFrm);
+				buf.append(' ');
+				buf.append(paramNames[i]);
+				if (i < lastParam) {
+					buf.append(", "); //$NON-NLS-1$
+				}
+			}
+			buf.append(')');
+			
+			int lastExc= excTypes.length - 1;
+			if (lastExc >= 0) {
+				buf.append(" throws "); //$NON-NLS-1$
+				for (int i= 0; i <= lastExc; i++) {
+					String excTypeSig= excTypes[i];
+					String excTypeFrm= resolveAndAdd(excTypeSig, parentType);
+					buf.append(excTypeFrm);
+					if (i < lastExc) {
+						buf.append(", "); //$NON-NLS-1$
+					}
+				}
+			}
+			if (bodyContent == null) {
+				buf.append(";\n\n"); //$NON-NLS-1$
+			} else {
+				buf.append(" {\n\t"); //$NON-NLS-1$
+				if ((bodyContent != null) && (bodyContent.length() > 0)) {
+					buf.append(bodyContent);
+					buf.append('\n');
+				}
+				buf.append("}\n");			 //$NON-NLS-1$
+			}
+		}
+		
+		public static String getDefaultMethodBodyStatement(String methodName, String[] paramNames, String retTypeSig, boolean callSuper) {
+			StringBuffer buf= new StringBuffer();
+			if (callSuper) {
+				if (retTypeSig != null) {
+					if (!Signature.SIG_VOID.equals(retTypeSig)) {
+						buf.append("return "); //$NON-NLS-1$
+					}
+					buf.append("super."); //$NON-NLS-1$
+					buf.append(methodName);
+				} else {
+					buf.append("super"); //$NON-NLS-1$
+				}
+				buf.append('(');			
+				for (int i= 0; i < paramNames.length; i++) {
+					if (i > 0) {
+						buf.append(", "); //$NON-NLS-1$
+					}
+					buf.append(paramNames[i]);
+				}
+				buf.append(");"); //$NON-NLS-1$
+			} else {
+				if (retTypeSig != null && !retTypeSig.equals(Signature.SIG_VOID)) {
+					if (!isPrimitiveType(retTypeSig) || Signature.getArrayCount(retTypeSig) > 0) {
+						buf.append("return null;"); //$NON-NLS-1$
+					} else if (retTypeSig.equals(Signature.SIG_BOOLEAN)) {
+						buf.append("return false;"); //$NON-NLS-1$
+					} else {
+						buf.append("return 0;"); //$NON-NLS-1$
+					}
+				}			
+			}
+			return buf.toString();
+		}	
+
+		public static String getMethodBodyContent(boolean isConstructor, IJavaProject project, String destTypeName, String methodName, String bodyStatement, String lineDelimiter) throws CoreException {
+			String templateName= isConstructor ? CodeTemplateContextType.CONSTRUCTORSTUB : CodeTemplateContextType.METHODSTUB;
+			Template template= PHPeclipsePlugin.getDefault().getCodeTemplateStore().findTemplate(templateName);
+			if (template == null) {
+				return bodyStatement;
+			}
+			CodeTemplateContext context= new CodeTemplateContext(template.getContextTypeId(), project, lineDelimiter);
+			context.setVariable(CodeTemplateContextType.ENCLOSING_METHOD, methodName);
+			context.setVariable(CodeTemplateContextType.ENCLOSING_TYPE, destTypeName);
+			context.setVariable(CodeTemplateContextType.BODY_STATEMENT, bodyStatement);
+			String str= evaluateTemplate(context, template);
+			if (str == null && !Strings.containsOnlyWhitespaces(bodyStatement)) {
+				return bodyStatement;
+			}
+			return str;
+		}
+		
+		public static String getGetterMethodBodyContent(IJavaProject project, String destTypeName, String methodName, String fieldName, String lineDelimiter) throws CoreException {
+			String templateName= CodeTemplateContextType.GETTERSTUB;
+			Template template= PHPeclipsePlugin.getDefault().getCodeTemplateStore().findTemplate(templateName);
+			if (template == null) {
+				return null;
+			}
+			CodeTemplateContext context= new CodeTemplateContext(template.getContextTypeId(), project, lineDelimiter);
+			context.setVariable(CodeTemplateContextType.ENCLOSING_METHOD, methodName);
+			context.setVariable(CodeTemplateContextType.ENCLOSING_TYPE, destTypeName);
+			context.setVariable(CodeTemplateContextType.FIELD, fieldName);
+			
+			return evaluateTemplate(context, template);
+		}
+		
+		public static String getSetterMethodBodyContent(IJavaProject project, String destTypeName, String methodName, String fieldName, String paramName, String lineDelimiter) throws CoreException {
+			String templateName= CodeTemplateContextType.SETTERSTUB;
+			Template template= PHPeclipsePlugin.getDefault().getCodeTemplateStore().findTemplate(templateName);
+			if (template == null) {
+				return null;
+			}
+			CodeTemplateContext context= new CodeTemplateContext(template.getContextTypeId(), project, lineDelimiter);
+			context.setVariable(CodeTemplateContextType.ENCLOSING_METHOD, methodName);
+			context.setVariable(CodeTemplateContextType.ENCLOSING_TYPE, destTypeName);
+			context.setVariable(CodeTemplateContextType.FIELD, fieldName);
+			context.setVariable(CodeTemplateContextType.FIELD_TYPE, fieldName);
+			context.setVariable(CodeTemplateContextType.PARAM, paramName);
+			
+			return evaluateTemplate(context, template);
+		}
+		
+		public static String getCatchBodyContent(ICompilationUnit cu, String exceptionType, String variableName, String lineDelimiter) throws CoreException {
+			Template template= PHPeclipsePlugin.getDefault().getCodeTemplateStore().findTemplate(CodeTemplateContextType.CATCHBLOCK);
+			if (template == null) {
+				return null;
+			}
+
+			CodeTemplateContext context= new CodeTemplateContext(template.getContextTypeId(), cu.getJavaProject(), lineDelimiter);
+			context.setVariable(CodeTemplateContextType.EXCEPTION_TYPE, exceptionType);
+			context.setVariable(CodeTemplateContextType.EXCEPTION_VAR, variableName); //$NON-NLS-1$
+			return evaluateTemplate(context, template);
+		}		
+		
+		/**
+		 * @see org.eclipse.jdt.ui.CodeGeneration#getTypeComment(ICompilationUnit, String, String)
+		 */	
+		public static String getCompilationUnitContent(ICompilationUnit cu, String typeComment, String typeContent, String lineDelimiter) throws CoreException {
+			IPackageFragment pack= (IPackageFragment) cu.getParent();
+			String packDecl= pack.isDefaultPackage() ? "" : "package " + pack.getElementName() + ';'; //$NON-NLS-1$ //$NON-NLS-2$
+
+			Template template= PHPeclipsePlugin.getDefault().getCodeTemplateStore().findTemplate(CodeTemplateContextType.NEWTYPE);
+			if (template == null) {
+				return null;
+			}
+			
+			IJavaProject project= cu.getJavaProject();
+			CodeTemplateContext context= new CodeTemplateContext(template.getContextTypeId(), project, lineDelimiter);
+			context.setCompilationUnitVariables(cu);
+			context.setVariable(CodeTemplateContextType.PACKAGE_DECLARATION, packDecl);
+			context.setVariable(CodeTemplateContextType.TYPE_COMMENT, typeComment != null ? typeComment : ""); //$NON-NLS-1$
+			context.setVariable(CodeTemplateContextType.TYPE_DECLARATION, typeContent);
+			context.setVariable(CodeTemplateContextType.TYPENAME, Signature.getQualifier(cu.getElementName()));
+			return evaluateTemplate(context, template);
+		}		
+
+		/*
+		 * @see org.eclipse.jdt.ui.CodeGeneration#getTypeComment(ICompilationUnit, String, String)
+		 */		
+		public static String getTypeComment(ICompilationUnit cu, String typeQualifiedName, String lineDelim) throws CoreException {
+			Template template= PHPeclipsePlugin.getDefault().getCodeTemplateStore().findTemplate(CodeTemplateContextType.TYPECOMMENT);
+			if (template == null) {
+				return null;
+			}
+			CodeTemplateContext context= new CodeTemplateContext(template.getContextTypeId(), cu.getJavaProject(), lineDelim);
+			context.setCompilationUnitVariables(cu);
+			context.setVariable(CodeTemplateContextType.ENCLOSING_TYPE, Signature.getQualifier(typeQualifiedName));
+			context.setVariable(CodeTemplateContextType.TYPENAME, Signature.getSimpleName(typeQualifiedName));
+			return evaluateTemplate(context, template);
+		}
+
+//		private static String[] getParameterTypesQualifiedNames(IMethodBinding binding) {
+//			ITypeBinding[] typeBindings= binding.getParameterTypes();
+//			String[] result= new String[typeBindings.length];
+//			for (int i= 0; i < result.length; i++) {
+//				result[i]= typeBindings[i].getQualifiedName();
+//			}
+//			return result;
 //		}
-//		if (Flags.isStatic(flags)) {
-//			buf.append("static "); //$NON-NLS-1$
-//		}		
-//			
-//		if (isConstructor) {
-//			buf.append(destTypeName);
-//		} else {
-//			String retTypeFrm;
-//			if (!isPrimitiveType(retTypeSig)) {
-//				retTypeFrm= resolveAndAdd(retTypeSig, declaringtype, imports);
+
+		private static String getSeeTag(String declaringClassQualifiedName, String methodName, String[] parameterTypesQualifiedNames) {
+			StringBuffer buf= new StringBuffer();
+			buf.append("@see "); //$NON-NLS-1$
+			buf.append(declaringClassQualifiedName);
+			buf.append('#'); 
+			buf.append(methodName);
+			buf.append('(');
+			for (int i= 0; i < parameterTypesQualifiedNames.length; i++) {
+				if (i > 0) {
+					buf.append(", "); //$NON-NLS-1$
+				}
+				buf.append(parameterTypesQualifiedNames[i]);
+			}
+			buf.append(')');
+			return buf.toString();
+		}
+		
+		private static String getSeeTag(IMethod overridden) throws JavaModelException {
+			IType declaringType= overridden.getDeclaringType();
+			StringBuffer buf= new StringBuffer();
+			buf.append("@see "); //$NON-NLS-1$
+			buf.append(declaringType.getFullyQualifiedName('.'));
+			buf.append('#'); 
+			buf.append(overridden.getElementName());
+			buf.append('(');
+			String[] paramTypes= overridden.getParameterTypes();
+			for (int i= 0; i < paramTypes.length; i++) {
+				if (i > 0) {
+					buf.append(", "); //$NON-NLS-1$
+				}
+				String curr= paramTypes[i];
+				buf.append(JavaModelUtil.getResolvedTypeName(curr, declaringType));
+				int arrayCount= Signature.getArrayCount(curr);
+				while (arrayCount > 0) {
+					buf.append("[]"); //$NON-NLS-1$
+					arrayCount--;
+				}
+			}
+			buf.append(')');
+			return buf.toString();
+		}
+		
+		/**
+		 * @see org.eclipse.jdt.ui.CodeGeneration#getMethodComment(IMethod,IMethod,String)
+		 */
+		public static String getMethodComment(IMethod method, IMethod overridden, String lineDelimiter) throws CoreException {
+			String retType= method.isConstructor() ? null : method.getReturnType();
+			String[] paramNames= method.getParameterNames();
+			
+			return getMethodComment(method.getCompilationUnit(), method.getDeclaringType().getElementName(),
+				method.getElementName(), paramNames, method.getExceptionTypes(), retType, overridden, lineDelimiter);
+		}
+
+		/**
+		 * @see org.eclipse.jdt.ui.CodeGeneration#getMethodComment(ICompilationUnit, String, String, String[], String[], String, IMethod, String)
+		 */
+		public static String getMethodComment(ICompilationUnit cu, String typeName, String methodName, String[] paramNames, String[] excTypeSig, String retTypeSig, IMethod overridden, String lineDelimiter) throws CoreException {
+			String templateName= CodeTemplateContextType.METHODCOMMENT;
+			if (retTypeSig == null) {
+				templateName= CodeTemplateContextType.CONSTRUCTORCOMMENT;
+			} else if (overridden != null) {
+				templateName= CodeTemplateContextType.OVERRIDECOMMENT;
+			}
+			Template template= PHPeclipsePlugin.getDefault().getCodeTemplateStore().findTemplate(templateName);
+			if (template == null) {
+				return null;
+			}		
+			CodeTemplateContext context= new CodeTemplateContext(template.getContextTypeId(), cu.getJavaProject(), lineDelimiter);
+			context.setCompilationUnitVariables(cu);
+			context.setVariable(CodeTemplateContextType.ENCLOSING_TYPE, typeName);
+			context.setVariable(CodeTemplateContextType.ENCLOSING_METHOD, methodName);
+					
+			if (retTypeSig != null) {
+				context.setVariable(CodeTemplateContextType.RETURN_TYPE, Signature.toString(retTypeSig));
+			}
+			if (overridden != null) {
+				context.setVariable(CodeTemplateContextType.SEE_TAG, getSeeTag(overridden));
+			}
+			TemplateBuffer buffer;
+			try {
+				buffer= context.evaluate(template);
+			} catch (BadLocationException e) {
+				throw new CoreException(Status.CANCEL_STATUS);
+			} catch (TemplateException e) {
+				throw new CoreException(Status.CANCEL_STATUS);
+			}
+			if (buffer == null) {
+				return null;
+			}
+			
+			String str= buffer.getString();
+			if (Strings.containsOnlyWhitespaces(str)) {
+				return null;
+			}
+			TemplateVariable position= findTagVariable(buffer); // look if Javadoc tags have to be added
+			if (position == null) {
+				return str;
+			}
+				
+			IDocument textBuffer= new Document(str);
+			String[] exceptionNames= new String[excTypeSig.length];
+			for (int i= 0; i < excTypeSig.length; i++) {
+				exceptionNames[i]= Signature.toString(excTypeSig[i]);
+			}
+			String returnType= retTypeSig != null ? Signature.toString(retTypeSig) : null;
+			int[] tagOffsets= position.getOffsets();
+			for (int i= tagOffsets.length - 1; i >= 0; i--) { // from last to first
+				try {
+					insertTag(textBuffer, tagOffsets[i], position.getLength(), paramNames, exceptionNames, returnType, false, lineDelimiter);
+				} catch (BadLocationException e) {
+					throw new CoreException(PHPUIStatus.createError(IStatus.ERROR, e));
+				}
+			}
+			return textBuffer.get();
+		}
+
+		public static String getFieldComment(ICompilationUnit cu, String typeName, String fieldName, String lineDelimiter) throws CoreException {
+			Template template= PHPeclipsePlugin.getDefault().getCodeTemplateStore().findTemplate(CodeTemplateContextType.FIELDCOMMENT);
+			if (template == null) {
+				return null;
+			}
+			CodeTemplateContext context= new CodeTemplateContext(template.getContextTypeId(), cu.getJavaProject(), lineDelimiter);
+			context.setCompilationUnitVariables(cu);
+			context.setVariable(CodeTemplateContextType.FIELD_TYPE, typeName);
+			context.setVariable(CodeTemplateContextType.FIELD, fieldName);
+			
+			return evaluateTemplate(context, template);
+		}	
+		
+		
+		/**
+		 * @see org.eclipse.jdt.ui.CodeGeneration#getSetterComment(ICompilationUnit, String, String, String, String, String, String, String)
+		 */
+		public static String getSetterComment(ICompilationUnit cu, String typeName, String methodName, String fieldName, String fieldType, String paramName, String bareFieldName, String lineDelimiter) throws CoreException {
+			String templateName= CodeTemplateContextType.SETTERCOMMENT;
+			Template template= PHPeclipsePlugin.getDefault().getCodeTemplateStore().findTemplate(templateName);
+			if (template == null) {
+				return null;
+			}
+			
+			CodeTemplateContext context= new CodeTemplateContext(template.getContextTypeId(), cu.getJavaProject(), lineDelimiter);
+			context.setCompilationUnitVariables(cu);
+			context.setVariable(CodeTemplateContextType.ENCLOSING_TYPE, typeName);
+			context.setVariable(CodeTemplateContextType.ENCLOSING_METHOD, methodName);
+			context.setVariable(CodeTemplateContextType.FIELD, fieldName);
+			context.setVariable(CodeTemplateContextType.FIELD_TYPE, fieldType);
+			context.setVariable(CodeTemplateContextType.BARE_FIELD_NAME, bareFieldName);
+			context.setVariable(CodeTemplateContextType.PARAM, paramName);
+
+			return evaluateTemplate(context, template);
+		}	
+		
+		/**
+		 * @see org.eclipse.jdt.ui.CodeGeneration#getGetterComment(ICompilationUnit, String, String, String, String, String, String)
+		 */
+		public static String getGetterComment(ICompilationUnit cu, String typeName, String methodName, String fieldName, String fieldType, String bareFieldName, String lineDelimiter) throws CoreException {
+			String templateName= CodeTemplateContextType.GETTERCOMMENT;
+			Template template= PHPeclipsePlugin.getDefault().getCodeTemplateStore().findTemplate(templateName);
+			if (template == null) {
+				return null;
+			}		
+			CodeTemplateContext context= new CodeTemplateContext(template.getContextTypeId(), cu.getJavaProject(), lineDelimiter);
+			context.setCompilationUnitVariables(cu);
+			context.setVariable(CodeTemplateContextType.ENCLOSING_TYPE, typeName);
+			context.setVariable(CodeTemplateContextType.ENCLOSING_METHOD, methodName);
+			context.setVariable(CodeTemplateContextType.FIELD, fieldName);
+			context.setVariable(CodeTemplateContextType.FIELD_TYPE, fieldType);
+			context.setVariable(CodeTemplateContextType.BARE_FIELD_NAME, bareFieldName);
+
+			return evaluateTemplate(context, template);
+		}
+		
+		public static String evaluateTemplate(CodeTemplateContext context, Template template) throws CoreException {
+			TemplateBuffer buffer;
+			try {
+				buffer= context.evaluate(template);
+			} catch (BadLocationException e) {
+				throw new CoreException(Status.CANCEL_STATUS);
+			} catch (TemplateException e) {
+				throw new CoreException(Status.CANCEL_STATUS);
+			}
+			if (buffer == null)
+				return null;
+			String str= buffer.getString();
+			if (Strings.containsOnlyWhitespaces(str)) {
+				return null;
+			}
+			return str;
+		}
+
+		/**
+		 * @see org.eclipse.jdt.ui.CodeGeneration#getMethodComment(ICompilationUnit, String, MethodDeclaration, IMethodBinding, String)
+		 */
+//		public static String getMethodComment(ICompilationUnit cu, String typeName, IMethodBinding overridden, String lineDelimiter) throws CoreException {
+//			if (overridden != null) {
+//				String declaringClassQualifiedName= overridden.getDeclaringClass().getQualifiedName();
+//				String[] parameterTypesQualifiedNames= getParameterTypesQualifiedNames(overridden);			
+//				return getMethodComment(cu, typeName, decl, true, overridden.isDeprecated(), declaringClassQualifiedName, parameterTypesQualifiedNames, lineDelimiter);
 //			} else {
-//				retTypeFrm= Signature.toString(retTypeSig);
+//				return getMethodComment(cu, typeName, decl, false, false, null, null, lineDelimiter);
 //			}
-//			buf.append(retTypeFrm);
-//			buf.append(' ');
-//			buf.append(methodName);
 //		}
-//		buf.append('(');
-//		for (int i= 0; i <= lastParam; i++) {
-//			String paramTypeSig= paramTypes[i];
-//			String paramTypeFrm;
+		
+		/**
+		 * Returns the comment for a method using the comment code templates.
+		 * <code>null</code> is returned if the template is empty.
+		 * @param cu The compilation unit to which the method belongs
+		 * @param typeName Name of the type to which the method belongs.
+		 * @param decl The AST MethodDeclaration node that will be added as new
+		 * method.
+		 * @param isOverridden <code>true</code> iff decl overrides another method
+		 * @param isDeprecated <code>true</code> iff the method that decl overrides is deprecated.
+		 * Note: it must not be <code>true</code> if isOverridden is <code>false</code>.
+		 * @param declaringClassQualifiedName Fully qualified name of the type in which the overriddden 
+		 * method (if any exists) in declared. If isOverridden is <code>false</code>, this is ignored.
+		 * @param parameterTypesQualifiedNames Fully qualified names of parameter types of the type in which the overriddden 
+		 * method (if any exists) in declared. If isOverridden is <code>false</code>, this is ignored.
+		 * @return String Returns the method comment or <code>null</code> if the
+		 * configured template is empty. 
+		 * (formatting required)
+		 * @throws CoreException
+		 */
+//		public static String getMethodComment(ICompilationUnit cu, String typeName, MethodDeclaration decl, boolean isOverridden, boolean isDeprecated, String declaringClassQualifiedName, String[] parameterTypesQualifiedNames, String lineDelimiter) throws CoreException {
+//			String templateName= CodeTemplateContextType.METHODCOMMENT;
+//			if (decl.isConstructor()) {
+//				templateName= CodeTemplateContextType.CONSTRUCTORCOMMENT;
+//			} else if (isOverridden) {
+//				templateName= CodeTemplateContextType.OVERRIDECOMMENT;
+//			}
+//			Template template= PHPeclipsePlugin.getDefault().getCodeTemplateStore().findTemplate(templateName);
+//			if (template == null) {
+//				return null;
+//			}		
+//			CodeTemplateContext context= new CodeTemplateContext(template.getContextTypeId(), cu.getJavaProject(), lineDelimiter);
+//			context.setCompilationUnitVariables(cu);
+//			context.setVariable(CodeTemplateContextType.ENCLOSING_TYPE, typeName);
+//			context.setVariable(CodeTemplateContextType.ENCLOSING_METHOD, decl.getName().getIdentifier());
+//			if (!decl.isConstructor()) {
+//				context.setVariable(CodeTemplateContextType.RETURN_TYPE, ASTNodes.asString(decl.getReturnType()));
+//			}
+//			if (isOverridden) {
+//				String methodName= decl.getName().getIdentifier();
+//				context.setVariable(CodeTemplateContextType.SEE_TAG, getSeeTag(declaringClassQualifiedName, methodName, parameterTypesQualifiedNames));
+//			}
 //			
-//			if (!isPrimitiveType(paramTypeSig)) {
-//				paramTypeFrm= resolveAndAdd(paramTypeSig, declaringtype, imports);
-//			} else {
-//				paramTypeFrm= Signature.toString(paramTypeSig);
+//			TemplateBuffer buffer;
+//			try {
+//				buffer= context.evaluate(template);
+//			} catch (BadLocationException e) {
+//				throw new CoreException(Status.CANCEL_STATUS);
+//			} catch (TemplateException e) {
+//				throw new CoreException(Status.CANCEL_STATUS);
 //			}
-//			buf.append(paramTypeFrm);
-//			buf.append(' ');
-//			buf.append(paramNames[i]);
-//			if (i < lastParam) {
-//				buf.append(", "); //$NON-NLS-1$
+//			if (buffer == null)
+//				return null;
+//			String str= buffer.getString();
+//			if (Strings.containsOnlyWhitespaces(str)) {
+//				return null;
 //			}
-//		}
-//		buf.append(')');
-//		
-//		int lastExc= excTypes.length - 1;
-//		if (lastExc >= 0) {
-//			buf.append(" throws "); //$NON-NLS-1$
-//			for (int i= 0; i <= lastExc; i++) {
-//				String excTypeSig= excTypes[i];
-//				String excTypeFrm= resolveAndAdd(excTypeSig, declaringtype, imports);
-//				buf.append(excTypeFrm);
-//				if (i < lastExc) {
-//					buf.append(", "); //$NON-NLS-1$
+//			TemplateVariable position= findTagVariable(buffer);  // look if Javadoc tags have to be added
+//			if (position == null) {
+//				return str;
+//			}
+//				
+//			IDocument textBuffer= new Document(str);
+//			List params= decl.parameters();
+//			String[] paramNames= new String[params.size()];
+//			for (int i= 0; i < params.size(); i++) {
+//				SingleVariableDeclaration elem= (SingleVariableDeclaration) params.get(i);
+//				paramNames[i]= elem.getName().getIdentifier();
+//			}
+//			List exceptions= decl.thrownExceptions();
+//			String[] exceptionNames= new String[exceptions.size()];
+//			for (int i= 0; i < exceptions.size(); i++) {
+//				exceptionNames[i]= ASTNodes.getSimpleNameIdentifier((Name) exceptions.get(i));
+//			}
+//			String returnType= !decl.isConstructor() ? ASTNodes.asString(decl.getReturnType()) : null;
+//			int[] tagOffsets= position.getOffsets();
+//			for (int i= tagOffsets.length - 1; i >= 0; i--) { // from last to first
+//				try {
+//					insertTag(textBuffer, tagOffsets[i], position.getLength(), paramNames, exceptionNames, returnType, isDeprecated, lineDelimiter);
+//				} catch (BadLocationException e) {
+//					throw new CoreException(PHPUIStatus.createError(IStatus.ERROR, e));
 //				}
 //			}
+//			return textBuffer.get();
 //		}
-//		if (settings.noBody) {
-//			buf.append(";\n\n"); //$NON-NLS-1$
-//		} else {
-//			buf.append(" {\n\t"); //$NON-NLS-1$
-//			if (!settings.callSuper) {
-//				if (retTypeSig != null && !retTypeSig.equals(Signature.SIG_VOID)) {
-//					buf.append('\t');
-//					if (!isPrimitiveType(retTypeSig) || Signature.getArrayCount(retTypeSig) > 0) {
-//						buf.append("return null;\n\t"); //$NON-NLS-1$
-//					} else if (retTypeSig.equals(Signature.SIG_BOOLEAN)) {
-//						buf.append("return false;\n\t"); //$NON-NLS-1$
-//					} else {
-//						buf.append("return 0;\n\t"); //$NON-NLS-1$
-//					}
-//				}
-//			} else {
-//				buf.append('\t');
-//				if (!isConstructor) {
-//					if (!Signature.SIG_VOID.equals(retTypeSig)) {
-//						buf.append("return "); //$NON-NLS-1$
-//					}
-//					buf.append("super."); //$NON-NLS-1$
-//					buf.append(methodName);
+		
+		private static TemplateVariable findTagVariable(TemplateBuffer buffer) {
+			TemplateVariable[] positions= buffer.getVariables();
+			for (int i= 0; i < positions.length; i++) {
+				TemplateVariable curr= positions[i];
+				if (CodeTemplateContextType.TAGS.equals(curr.getType())) {
+					return curr;
+				}
+			}
+			return null;		
+		}	
+		
+		private static void insertTag(IDocument textBuffer, int offset, int length, String[] paramNames, String[] exceptionNames, String returnType, boolean isDeprecated, String lineDelimiter) throws BadLocationException {
+			IRegion region= textBuffer.getLineInformationOfOffset(offset);
+			if (region == null) {
+				return;
+			}
+			String lineStart= textBuffer.get(region.getOffset(), offset - region.getOffset());
+			
+			StringBuffer buf= new StringBuffer();
+			for (int i= 0; i < paramNames.length; i++) {
+				if (buf.length() > 0) {
+					buf.append(lineDelimiter); buf.append(lineStart);
+				}
+				buf.append("@param "); buf.append(paramNames[i]); //$NON-NLS-1$
+			}
+			if (returnType != null && !returnType.equals("void")) { //$NON-NLS-1$
+				if (buf.length() > 0) {
+					buf.append(lineDelimiter); buf.append(lineStart);
+				}			
+				buf.append("@return"); //$NON-NLS-1$
+			}
+			if (exceptionNames != null) {
+				for (int i= 0; i < exceptionNames.length; i++) {
+					if (buf.length() > 0) {
+						buf.append(lineDelimiter); buf.append(lineStart);
+					}
+					buf.append("@throws "); buf.append(exceptionNames[i]); //$NON-NLS-1$
+				}
+			}		
+			if (isDeprecated) {
+				if (buf.length() > 0) {
+					buf.append(lineDelimiter); buf.append(lineStart);
+				}
+				buf.append("@deprecated"); //$NON-NLS-1$
+			}
+			textBuffer.replace(offset, length, buf.toString());
+		}
+		
+		private static boolean isPrimitiveType(String typeName) {
+			char first= Signature.getElementType(typeName).charAt(0);
+			return (first != Signature.C_RESOLVED && first != Signature.C_UNRESOLVED);
+		}
+
+		private static String resolveAndAdd(String refTypeSig, IType declaringType) throws JavaModelException {//, IImportsStructure imports) throws JavaModelException {
+			String resolvedTypeName= JavaModelUtil.getResolvedTypeName(refTypeSig, declaringType);
+			if (resolvedTypeName != null) {
+				StringBuffer buf= new StringBuffer();
+//				if (imports != null) {
+//					buf.append(imports.addImport(resolvedTypeName));
 //				} else {
-//					buf.append("super"); //$NON-NLS-1$
+					buf.append(resolvedTypeName);
 //				}
-//				buf.append('(');			
-//				for (int i= 0; i <= lastParam; i++) {
-//					buf.append(paramNames[i]);
-//					if (i < lastParam) {
-//						buf.append(", "); //$NON-NLS-1$
+				int arrayCount= Signature.getArrayCount(refTypeSig);
+				for (int i= 0; i < arrayCount; i++) {
+					buf.append("[]"); //$NON-NLS-1$
+				}
+				return buf.toString();
+			}
+			return Signature.toString(refTypeSig);
+		}
+			
+		/**
+		 * Finds a method in a list of methods.
+		 * @return The found method or null, if nothing found
+		 */
+		private static IMethod findMethod(IMethod method, List allMethods) throws JavaModelException {
+			String name= method.getElementName();
+			String[] paramTypes= method.getParameterTypes();
+			boolean isConstructor= method.isConstructor();
+
+			for (int i= allMethods.size() - 1; i >= 0; i--) {
+				IMethod curr= (IMethod) allMethods.get(i);
+				if (JavaModelUtil.isSameMethodSignature(name, paramTypes, isConstructor, curr)) {
+					return curr;
+				}			
+			}
+			return null;
+		}
+
+		/**
+		 * Creates needed constructors for a type.
+		 * @param type The type to create constructors for
+		 * @param supertype The type's super type
+		 * @param settings Options for comment generation
+		 * @param imports Required imports are added to the import structure. Structure can be <code>null</code>, types are qualified then.
+		 * @return Returns the generated stubs or <code>null</code> if the creation has been canceled
+		 */
+//		public static String[] evalConstructors(IType type, IType supertype, IImportsStructure imports) throws CoreException {
+//			IMethod[] superMethods= supertype.getMethods();
+//			String typeName= type.getElementName();
+//			ICompilationUnit cu= type.getCompilationUnit();
+//			IMethod[] methods= type.getMethods();
+//			GenStubSettings genStubSettings= new GenStubSettings(settings);
+//			genStubSettings.callSuper= true;
+//			
+//			ArrayList newMethods= new ArrayList(superMethods.length);
+//			for (int i= 0; i < superMethods.length; i++) {
+//				IMethod curr= superMethods[i];
+//				if (curr.isConstructor() && (JavaModelUtil.isVisibleInHierarchy(curr, type.getPackageFragment()))) {
+//					if (JavaModelUtil.findMethod(typeName, curr.getParameterTypes(), true, methods) == null) {
+//						genStubSettings.methodModifiers= Flags.AccPublic | JdtFlags.clearAccessModifiers(curr.getFlags());
+//						String newStub= genStub(cu, typeName, curr, curr.getDeclaringType(), genStubSettings, imports);
+//						newMethods.add(newStub);
 //					}
 //				}
-//				buf.append(");\n\t"); //$NON-NLS-1$
 //			}
-//			buf.append("}\n");			 //$NON-NLS-1$
+//			return (String[]) newMethods.toArray(new String[newMethods.size()]);
 //		}
-//		return buf.toString();
-//	}
-//	
-//	private static boolean isSet(int options, int flag) {
-//		return (options & flag) != 0;
-//	}	
-//
-//	private static boolean isPrimitiveType(String typeName) {
-//		char first= Signature.getElementType(typeName).charAt(0);
-//		return (first != Signature.C_RESOLVED && first != Signature.C_UNRESOLVED);
-//	}
+		
+		/**
+		 * Returns all unimplemented constructors of a type including root type default 
+		 * constructors if there are no other superclass constructors unimplemented. 
+		 * @param type The type to create constructors for
+		 * @return Returns the generated stubs or <code>null</code> if the creation has been canceled
+		 */
+//		public static IMethod[] getOverridableConstructors(IType type) throws CoreException {
+//			List constructorMethods= new ArrayList();
+//			ITypeHierarchy hierarchy= type.newSupertypeHierarchy(null);				
+//			IType supertype= hierarchy.getSuperclass(type);
+//			if (supertype == null)
+//				return (new IMethod[0]);
 //
-//	private static String resolveAndAdd(String refTypeSig, IType declaringType, IImportsStructure imports) throws JavaModelException {
-//		String resolvedTypeName= JavaModelUtil.getResolvedTypeName(refTypeSig, declaringType);
-//		if (resolvedTypeName != null) {
-//			StringBuffer buf= new StringBuffer();
-//			if (imports != null) {
-//				buf.append(imports.addImport(resolvedTypeName));
-//			} else {
-//				buf.append(resolvedTypeName);
-//			}
-//			int arrayCount= Signature.getArrayCount(refTypeSig);
-//			for (int i= 0; i < arrayCount; i++) {
-//				buf.append("[]"); //$NON-NLS-1$
-//			}
-//			return buf.toString();
-//		}
-//		return Signature.toString(refTypeSig);
-//	}
-//	
-//	/**
-//	 * Generates a default JavaDoc comment stub for a method.
-//	 */
-//	public static void genJavaDocStub(String descr, String[] paramNames, String retTypeSig, String[] excTypeSigs, StringBuffer buf) {
-//		buf.append("/**\n"); //$NON-NLS-1$
-//		buf.append(" * "); buf.append(descr); buf.append(".\n"); //$NON-NLS-2$ //$NON-NLS-1$
-//		for (int i= 0; i < paramNames.length; i++) {
-//			buf.append(" * @param "); buf.append(paramNames[i]); buf.append('\n'); //$NON-NLS-1$
-//		}
-//		if (retTypeSig != null && !retTypeSig.equals(Signature.SIG_VOID)) {
-//			String simpleName= Signature.getSimpleName(Signature.toString(retTypeSig));
-//			buf.append(" * @return "); buf.append(simpleName); buf.append('\n'); //$NON-NLS-1$
-//		}
-//		if (excTypeSigs != null) {
-//			for (int i= 0; i < excTypeSigs.length; i++) {
-//				String simpleName= Signature.getSimpleName(Signature.toString(excTypeSigs[i]));
-//				buf.append(" * @throws "); buf.append(simpleName); buf.append('\n'); //$NON-NLS-1$
-//			}
-//		}
-//		buf.append(" */"); //$NON-NLS-1$
-//	}
-//	
-//	/**
-//	 * Generates a '@see' tag to the defined method.
-//	 */
-//	public static void genJavaDocSeeTag(IType declaringType, String methodName, String[] paramTypes, boolean nonJavaDocComment, boolean isDeprecated, StringBuffer buf) throws JavaModelException {
-//		String[] fullParamNames= new String[paramTypes.length];
-//		for (int i= 0; i < paramTypes.length; i++) {
-//			fullParamNames[i]= JavaModelUtil.getResolvedTypeName(paramTypes[i], declaringType);
-//		}
-//		String fullTypeName= JavaModelUtil.getFullyQualifiedName(declaringType);
-//		
-//		genJavaDocSeeTag(fullTypeName, methodName, fullParamNames, nonJavaDocComment, isDeprecated, buf);
-//	}
-//	
-//	/**
-//	 * Generates a '@see' tag to the defined method.
-//	 */
-//	public static void genJavaDocSeeTag(String fullyQualifiedTypeName, String methodName, String[] fullParamTypeNames, boolean nonJavaDocComment, boolean isDeprecated, StringBuffer buf) throws JavaModelException {
-//		// create a @see link
-//		buf.append("/*"); //$NON-NLS-1$
-//		if (!nonJavaDocComment) {
-//			buf.append('*');
-//		} else {
-//			buf.append(" (non-Javadoc)"); //$NON-NLS-1$
-//		}
-//		buf.append("\n * @see "); //$NON-NLS-1$
-//		buf.append(fullyQualifiedTypeName);
-//		buf.append('#'); 
-//		buf.append(methodName);
-//		buf.append('(');
-//		for (int i= 0; i < fullParamTypeNames.length; i++) {
-//			if (i > 0) {
-//				buf.append(", "); //$NON-NLS-1$
+//			IMethod[] superMethods= supertype.getMethods();
+//			boolean constuctorFound= false;
+//			String typeName= type.getElementName();
+//			IMethod[] methods= type.getMethods();
+//			for (int i= 0; i < superMethods.length; i++) {
+//					IMethod curr= superMethods[i];
+//					if (curr.isConstructor())  {
+//						constuctorFound= true;
+//						if (JavaModelUtil.isVisibleInHierarchy(curr, type.getPackageFragment()))
+//							if (JavaModelUtil.findMethod(typeName, curr.getParameterTypes(), true, methods) == null)
+//								constructorMethods.add(curr);
+//			
+//					}
 //			}
-//			buf.append(fullParamTypeNames[i]);
-//		}
-//		buf.append(")\n"); //$NON-NLS-1$
-//		if (isDeprecated) {
-//			buf.append(" * @deprecated\n"); //$NON-NLS-1$
-//		}
-//		buf.append(" */"); //$NON-NLS-1$
-//	}	
-//	
-//	
-//
-//	/**
-//	 * Finds a method in a list of methods.
-//	 * @return The found method or null, if nothing found
-//	 */
-//	private static IMethod findMethod(IMethod method, List allMethods) throws JavaModelException {
-//		String name= method.getElementName();
-//		String[] paramTypes= method.getParameterTypes();
-//		boolean isConstructor= method.isConstructor();
-//
-//		for (int i= allMethods.size() - 1; i >= 0; i--) {
-//			IMethod curr= (IMethod) allMethods.get(i);
-//			if (JavaModelUtil.isSameMethodSignature(name, paramTypes, isConstructor, curr)) {
-//				return curr;
-//			}			
-//		}
-//		return null;
-//	}
-
-
-	/**
-	 * Creates needed constructors for a type.
-	 * @param type The type to create constructors for
-	 * @param supertype The type's super type
-	 * @param settings Options for comment generation
-	 * @param imports Required imports are added to the import structure. Structure can be <code>null</code>, types are qualified then.
-	 * @return Returns the generated stubs or <code>null</code> if the creation has been canceled
-	 */
-//	public static String[] evalConstructors(IType type, IType supertype, CodeGenerationSettings settings, IImportsStructure imports) throws JavaModelException {
-//		IMethod[] superMethods= supertype.getMethods();
-//		String typeName= type.getElementName();
-//		IMethod[] methods= type.getMethods();
-//		GenStubSettings genStubSettings= new GenStubSettings(settings);
-//		genStubSettings.callSuper= true;
-//		ArrayList newMethods= new ArrayList(superMethods.length);
-//		for (int i= 0; i < superMethods.length; i++) {
-//			IMethod curr= superMethods[i];
-//			if (curr.isConstructor() && (JavaModelUtil.isVisible(curr, type.getPackageFragment()) || Flags.isProtected(curr.getFlags()))) {
+//			
+//			// http://bugs.eclipse.org/bugs/show_bug.cgi?id=38487
+//			if (!constuctorFound)  {
+//				IType objectType= type.getJavaProject().findType("java.lang.Object"); //$NON-NLS-1$
+//				IMethod curr= objectType.getMethod("Object", EMPTY);  //$NON-NLS-1$
 //				if (JavaModelUtil.findMethod(typeName, curr.getParameterTypes(), true, methods) == null) {
-//					String newStub= genStub(typeName, superMethods[i], genStubSettings, imports);
-//					newMethods.add(newStub);
+//					constructorMethods.add(curr);
 //				}
 //			}
+//			return (IMethod[]) constructorMethods.toArray(new IMethod[constructorMethods.size()]);
 //		}
-//		return (String[]) newMethods.toArray(new String[newMethods.size()]);
-//	}
-//
-//	/**
-//	 * Searches for unimplemented methods of a type.
-//	 * @param isSubType If set, the evaluation is for a subtype of the given type. If not set, the
-//	 * evaluation is for the type itself.
-//	 * @param settings Options for comment generation
-//	 * @param selectionQuery If not null will select the methods to implement.
-//	 * @param imports Required imports are added to the import structure. Structure can be <code>null</code>, types are qualified then.
-//	 * @return Returns the generated stubs or <code>null</code> if the creation has been canceled
-//	 */
-//	public static String[] evalUnimplementedMethods(IType type, ITypeHierarchy hierarchy, boolean isSubType, CodeGenerationSettings settings, 
-//				IOverrideMethodQuery selectionQuery, IImportsStructure imports) throws JavaModelException {
-//		List allMethods= new ArrayList();
-//		List toImplement= new ArrayList();
+
+		/**
+		 * Returns all overridable methods of a type
+		 * @param type The type to search the overridable methods for 
+		 * @param hierarchy The type hierarchy of the type
+	 	 * @param isSubType If set, the result can include methods of the passed type, if not only methods from super
+		 * types are considered
+		 * @return Returns the all methods that can be overridden
+		 */
+//		public static IMethod[] getOverridableMethods(IType type, ITypeHierarchy hierarchy, boolean isSubType) throws JavaModelException {
+//			List allMethods= new ArrayList();
 //
-//		IMethod[] typeMethods= type.getMethods();
-//		for (int i= 0; i < typeMethods.length; i++) {
-//			IMethod curr= typeMethods[i];
-//			if (!curr.isConstructor() && !Flags.isStatic(curr.getFlags()) && !Flags.isPrivate(curr.getFlags())) {
-//				allMethods.add(curr);
+//			IMethod[] typeMethods= type.getMethods();
+//			for (int i= 0; i < typeMethods.length; i++) {
+//				IMethod curr= typeMethods[i];
+//				if (!curr.isConstructor() && !Flags.isStatic(curr.getFlags()) && !Flags.isPrivate(curr.getFlags())) {
+//					allMethods.add(curr);
+//				}
 //			}
-//		}
 //
-//		IType[] superTypes= hierarchy.getAllSuperclasses(type);
-//		for (int i= 0; i < superTypes.length; i++) {
-//			IMethod[] methods= superTypes[i].getMethods();
-//			for (int k= 0; k < methods.length; k++) {
-//				IMethod curr= methods[k];
-//				if (!curr.isConstructor() && !Flags.isStatic(curr.getFlags()) && !Flags.isPrivate(curr.getFlags())) {
-//					if (findMethod(curr, allMethods) == null) {
-//						allMethods.add(curr);
+//			IType[] superTypes= hierarchy.getAllSuperclasses(type);
+//			for (int i= 0; i < superTypes.length; i++) {
+//				IMethod[] methods= superTypes[i].getMethods();
+//				for (int k= 0; k < methods.length; k++) {
+//					IMethod curr= methods[k];
+//					if (!curr.isConstructor() && !Flags.isStatic(curr.getFlags()) && !Flags.isPrivate(curr.getFlags())) {
+//						if (findMethod(curr, allMethods) == null) {
+//							allMethods.add(curr);
+//						}
 //					}
 //				}
 //			}
-//		}
 //
-//		// do not call super
-//		for (int i= 0; i < allMethods.size(); i++) {
-//			IMethod curr= (IMethod) allMethods.get(i);
-//			if ((Flags.isAbstract(curr.getFlags()) || curr.getDeclaringType().isInterface()) && (isSubType || !type.equals(curr.getDeclaringType()))) {
-//				// implement all abstract methods
-//				toImplement.add(curr);
-//			}
-//		}
+//			IType[] superInterfaces= hierarchy.getAllSuperInterfaces(type);
+//			for (int i= 0; i < superInterfaces.length; i++) {
+//				IMethod[] methods= superInterfaces[i].getMethods();
+//				for (int k= 0; k < methods.length; k++) {
+//					IMethod curr= methods[k];
 //
-//		IType[] superInterfaces= hierarchy.getAllSuperInterfaces(type);
-//		for (int i= 0; i < superInterfaces.length; i++) {
-//			IMethod[] methods= superInterfaces[i].getMethods();
-//			for (int k= 0; k < methods.length; k++) {
-//				IMethod curr= methods[k];
-//
-//				// binary interfaces can contain static initializers (variable intializations)
-//				// 1G4CKUS
-//				if (!Flags.isStatic(curr.getFlags())) {
-//					IMethod impl= findMethod(curr, allMethods);
-//					if (impl == null || ((curr.getExceptionTypes().length < impl.getExceptionTypes().length) && !Flags.isFinal(impl.getFlags()))) {
-//						if (impl != null) {
-//							allMethods.remove(impl);
+//					// binary interfaces can contain static initializers (variable intializations)
+//					// 1G4CKUS
+//					if (!Flags.isStatic(curr.getFlags())) {
+//						IMethod impl= findMethod(curr, allMethods);
+//						if (impl == null || !JavaModelUtil.isVisibleInHierarchy(impl, type.getPackageFragment()) || prefereInterfaceMethod(hierarchy, curr, impl)) {
+//							if (impl != null) {
+//								allMethods.remove(impl);
+//							}
+//							// implement an interface method when it does not exist in the hierarchy
+//							// or when it throws less exceptions that the implemented
+//							allMethods.add(curr);
 //						}
-//						// implement an interface method when it does not exist in the hierarchy
-//						// or when it throws less exceptions that the implemented
-//						toImplement.add(curr);
-//						allMethods.add(curr);
 //					}
 //				}
 //			}
-//		}
-//		IMethod[] toImplementArray= (IMethod[]) toImplement.toArray(new IMethod[toImplement.size()]);
-//		if (selectionQuery != null) {
 //			if (!isSubType) {
 //				allMethods.removeAll(Arrays.asList(typeMethods));
 //			}
@@ -394,54 +890,102 @@ public class StubUtility {
 //					allMethods.remove(i);
 //				}
 //			}
-//			IMethod[] choice= (IMethod[]) allMethods.toArray(new IMethod[allMethods.size()]);
-//			toImplementArray= selectionQuery.select(choice, toImplementArray, hierarchy);
-//			if (toImplementArray == null) {
-//				//cancel pressed
-//				return null;
+//			return (IMethod[]) allMethods.toArray(new IMethod[allMethods.size()]);
+//		}
+		
+//		private static boolean prefereInterfaceMethod(ITypeHierarchy hierarchy, IMethod interfaceMethod, IMethod curr) throws JavaModelException {
+//			if (Flags.isFinal(curr.getFlags())) {
+//				return false;
+//			}
+//			IType interfaceType= interfaceMethod.getDeclaringType();
+//			IType[] interfaces= hierarchy.getAllSuperInterfaces(curr.getDeclaringType());
+//			for (int i= 0; i < interfaces.length; i++) {
+//				if (interfaces[i] == interfaceType) {
+//					return false;
+//				}
 //			}
+//			return curr.getExceptionTypes().length > interfaceMethod.getExceptionTypes().length;
 //		}
-//		GenStubSettings genStubSettings= new GenStubSettings(settings);
-//		genStubSettings.methodOverwrites= true;
-//		String[] result= new String[toImplementArray.length];
-//		for (int i= 0; i < toImplementArray.length; i++) {
-//			IMethod curr= toImplementArray[i];
-//			IMethod overrides= JavaModelUtil.findMethodImplementationInHierarchy(hierarchy, type, curr.getElementName(), curr.getParameterTypes(), curr.isConstructor());
-//			genStubSettings.callSuper= (overrides != null);
-//						
-//			IMethod desc= JavaModelUtil.findMethodDeclarationInHierarchy(hierarchy, type, curr.getElementName(), curr.getParameterTypes(), curr.isConstructor());
-//			if (desc != null) {
-//				curr= desc;
+		
+		/**
+		 * Generate method stubs for methods to overrride
+		 * @param type The type to search the overridable methods for 
+		 * @param hierarchy The type hierarchy of the type
+		 * @param methodsToImplement Methods to override or implement
+		 * @param settings Options for comment generation
+		 * @param imports Required imports are added to the import structure. Structure can be <code>null</code>, types are qualified then.
+		 * @return Returns the generated stubs
+		 */
+//		public static String[] genOverrideStubs(IMethod[] methodsToImplement, IType type, ITypeHierarchy hierarchy, CodeGenerationSettings settings, IImportsStructure imports) throws CoreException {
+//			GenStubSettings genStubSettings= new GenStubSettings(settings);
+//			genStubSettings.methodOverwrites= true;
+//			ICompilationUnit cu= type.getCompilationUnit();
+//			String[] result= new String[methodsToImplement.length];
+//			for (int i= 0; i < methodsToImplement.length; i++) {
+//				IMethod curr= methodsToImplement[i];
+//				IMethod overrides= JavaModelUtil.findMethodImplementationInHierarchy(hierarchy, type, curr.getElementName(), curr.getParameterTypes(), curr.isConstructor());
+//				if (overrides != null) {
+//					genStubSettings.callSuper= true;
+//					curr= overrides;
+//				}
+//				genStubSettings.methodModifiers= curr.getFlags();
+//				IMethod desc= JavaModelUtil.findMethodDeclarationInHierarchy(hierarchy, type, curr.getElementName(), curr.getParameterTypes(), curr.isConstructor());
+//				if (desc == null) {
+//					desc= curr;
+//				}
+//				result[i]= genStub(cu, type.getElementName(), curr, desc.getDeclaringType(), genStubSettings, imports);
 //			}
-//			result[i]= genStub(type.getElementName(), curr, genStubSettings, imports);
+//			return result;
 //		}
-//		return result;
-//	}
-
-	/**
-	 * Examines a string and returns the first line delimiter found.
-	 */
-//	public static String getLineDelimiterUsed(IJavaElement elem) throws JavaModelException {
-//		ICompilationUnit cu= (ICompilationUnit) elem.getAncestor(IJavaElement.COMPILATION_UNIT);
-//		if (cu != null && cu.exists()) {
-//			IBuffer buf= cu.getBuffer();
-//			int length= buf.getLength();
-//			for (int i= 0; i < length; i++) {
-//				char ch= buf.getChar(i);
-//				if (ch == SWT.CR) {
-//					if (i + 1 < length) {
-//						if (buf.getChar(i + 1) == SWT.LF) {
-//							return "\r\n"; //$NON-NLS-1$
-//						}
-//					}
-//					return "\r"; //$NON-NLS-1$
-//				} else if (ch == SWT.LF) {
-//					return "\n"; //$NON-NLS-1$
+		/**
+		 * Searches for unimplemented methods of a type.
+		 * @param isSubType If set, the evaluation is for a subtype of the given type. If not set, the
+		 * evaluation is for the type itself.
+		 * @param settings Options for comment generation
+		 * @param imports Required imports are added to the import structure. Structure can be <code>null</code>, types are qualified then.
+		 * @return Returns the generated stubs or <code>null</code> if the creation has been canceled
+		 */
+//		public static String[] evalUnimplementedMethods(IType type, ITypeHierarchy hierarchy, boolean isSubType, CodeGenerationSettings settings, 
+//				IImportsStructure imports) throws CoreException {
+//						
+//			IMethod[] inheritedMethods= getOverridableMethods(type, hierarchy, isSubType);
+//			
+//			List toImplement= new ArrayList();
+//			for (int i= 0; i < inheritedMethods.length; i++) {
+//				IMethod curr= inheritedMethods[i];
+//				if (JdtFlags.isAbstract(curr)) {
+//					toImplement.add(curr);
 //				}
 //			}
+//			IMethod[] toImplementArray= (IMethod[]) toImplement.toArray(new IMethod[toImplement.size()]);		
+//			return genOverrideStubs(toImplementArray, type, hierarchy, settings, imports);
 //		}
-//		return System.getProperty("line.separator", "\n"); //$NON-NLS-1$ //$NON-NLS-2$
-//	}
+
+		/**
+		 * Examines a string and returns the first line delimiter found.
+		 */
+		public static String getLineDelimiterUsed(IJavaElement elem) throws JavaModelException {
+			ICompilationUnit cu= (ICompilationUnit) elem.getAncestor(IJavaElement.COMPILATION_UNIT);
+			if (cu != null && cu.exists()) {
+				IBuffer buf= cu.getBuffer();
+				int length= buf.getLength();
+				for (int i= 0; i < length; i++) {
+					char ch= buf.getChar(i);
+					if (ch == SWT.CR) {
+						if (i + 1 < length) {
+							if (buf.getChar(i + 1) == SWT.LF) {
+								return "\r\n"; //$NON-NLS-1$
+							}
+						}
+						return "\r"; //$NON-NLS-1$
+					} else if (ch == SWT.LF) {
+						return "\n"; //$NON-NLS-1$
+					}
+				}
+			}
+			return System.getProperty("line.separator", "\n"); //$NON-NLS-1$ //$NON-NLS-2$
+		}
+
 
 	/**
 	 * Embodies the policy which line delimiter to use when inserting into
@@ -530,5 +1074,119 @@ public class StubUtility {
 		}
 		return null;
 	}
+	/*
+	 * Workarounds for bug 38111
+	 */
+//	public static String[] getArgumentNameSuggestions(IJavaProject project, String baseName, int dimensions, String[] excluded) {
+//		String name= workaround38111(baseName);
+//		String[] res= NamingConventions.suggestArgumentNames(project, "", name, dimensions, excluded); //$NON-NLS-1$
+//		return sortByLength(res); // longest first
+//	}
+//		 
+//	public static String[] getFieldNameSuggestions(IJavaProject project, String baseName, int dimensions, int modifiers, String[] excluded) {
+//		String name= workaround38111(baseName);
+//		String[] res= NamingConventions.suggestFieldNames(project, "", name, dimensions, modifiers, excluded); //$NON-NLS-1$
+//		return sortByLength(res); // longest first
+//	}
+//	
+//	public static String[] getLocalNameSuggestions(IJavaProject project, String baseName, int dimensions, String[] excluded) {
+//		String name= workaround38111(baseName);
+//		String[] res= NamingConventions.suggestLocalVariableNames(project, "", name, dimensions, excluded); //$NON-NLS-1$
+//		return sortByLength(res); // longest first
+//	}
+	
+	private static String[] sortByLength(String[] proposals) {
+		Arrays.sort(proposals, new Comparator() {
+			public int compare(Object o1, Object o2) {
+				return ((String) o2).length() - ((String) o1).length();
+			}
+		});
+		return proposals;
+	}
+	
+	private static String workaround38111(String baseName) {
+		if (BASE_TYPES.contains(baseName))
+			return baseName;
+		return Character.toUpperCase(baseName.charAt(0)) + baseName.substring(1);
+	}
+	
+	private static final List BASE_TYPES= Arrays.asList(
+			new String[] {"boolean", "byte", "char", "double", "float", "int", "long", "short"});  //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
+
+	public static String suggestArgumentName(IJavaProject project, String baseName, String[] excluded) {
+//		String[] argnames= getArgumentNameSuggestions(project, baseName, 0, excluded);
+//		if (argnames.length > 0) {
+//			return argnames[0];
+//		}
+		return baseName;
+	}
+	
+	public static String[] suggestArgumentNames(IJavaProject project, String[] paramNames) {
+		String prefixes= project.getOption(JavaCore.CODEASSIST_ARGUMENT_PREFIXES, true);
+		String suffixes= project.getOption(JavaCore.CODEASSIST_ARGUMENT_SUFFIXES, true);
+		if (prefixes.length() + suffixes.length() == 0) {
+			return paramNames;
+		}
+		
+		String[] newNames= new String[paramNames.length];
+		// Ensure that the codegeneration preferences are respected
+		for (int i= 0; i < paramNames.length; i++) {
+			String curr= paramNames[i];
+			if (!hasPrefixOrSuffix(prefixes, suffixes, curr)) {
+				newNames[i]= suggestArgumentName(project, paramNames[i], null);
+			} else {
+				newNames[i]= curr;
+			}
+		}
+		return newNames;
+	}
+	
+	public static boolean hasFieldName(IJavaProject project, String name) {
+		String prefixes= project.getOption(JavaCore.CODEASSIST_FIELD_PREFIXES, true);
+		String suffixes= project.getOption(JavaCore.CODEASSIST_FIELD_SUFFIXES, true);
+		String staticPrefixes= project.getOption(JavaCore.CODEASSIST_STATIC_FIELD_PREFIXES, true);
+		String staticSuffixes= project.getOption(JavaCore.CODEASSIST_STATIC_FIELD_SUFFIXES, true);
+		
+		
+		return hasPrefixOrSuffix(prefixes, suffixes, name) 
+			|| hasPrefixOrSuffix(staticPrefixes, staticSuffixes, name);
+	}
+	
+	public static boolean hasParameterName(IJavaProject project, String name) {
+		String prefixes= project.getOption(JavaCore.CODEASSIST_ARGUMENT_PREFIXES, true);
+		String suffixes= project.getOption(JavaCore.CODEASSIST_ARGUMENT_SUFFIXES, true);
+		return hasPrefixOrSuffix(prefixes, suffixes, name);
+	}
+	
+	public static boolean hasLocalVariableName(IJavaProject project, String name) {
+		String prefixes= project.getOption(JavaCore.CODEASSIST_LOCAL_PREFIXES, true);
+		String suffixes= project.getOption(JavaCore.CODEASSIST_LOCAL_SUFFIXES, true);
+		return hasPrefixOrSuffix(prefixes, suffixes, name);
+	}
+	
+	public static boolean hasConstantName(String name) {
+		return Character.isUpperCase(name.charAt(0));
+	}
+	
+	
+	private static boolean hasPrefixOrSuffix(String prefixes, String suffixes, String name) {
+		final String listSeparartor= ","; //$NON-NLS-1$
+
+		StringTokenizer tok= new StringTokenizer(prefixes, listSeparartor);
+		while (tok.hasMoreTokens()) {
+			String curr= tok.nextToken();
+			if (name.startsWith(curr)) {
+				return true;
+			}
+		}
 
+		tok= new StringTokenizer(suffixes, listSeparartor);
+		while (tok.hasMoreTokens()) {
+			String curr= tok.nextToken();
+			if (name.endsWith(curr)) {
+				return true;
+			}
+		}
+		return false;
+	}
 }
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/corext/template/php/CodeTemplateContext.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/corext/template/php/CodeTemplateContext.java
index 9aef349..01908fe 100644
--- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/corext/template/php/CodeTemplateContext.java
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/corext/template/php/CodeTemplateContext.java
@@ -52,7 +52,7 @@ public class CodeTemplateContext extends TemplateContext {
 		while (iterator.hasNext()) {
 			TemplateVariableResolver var= (TemplateVariableResolver) iterator.next();
 			if (var instanceof CodeTemplateContextType.CodeTemplateVariableResolver) {
-				Assert.isNotNull(getVariable(var.getType()), "Variable " + var.getType() + "not defined"); //$NON-NLS-1$ //$NON-NLS-2$
+			//	Assert.isNotNull(getVariable(var.getType()), "Variable " + var.getType() + "not defined"); //$NON-NLS-1$ //$NON-NLS-2$
 			}
 		}
 
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/PHPUIMessages.properties b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/PHPUIMessages.properties
index fb30956..b5a8f8f 100644
--- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/PHPUIMessages.properties
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/PHPUIMessages.properties
@@ -540,6 +540,20 @@ ResourceTransferDragAdapter.moving_resource=Moving Resources via DND
 ResourceTransferDragAdapter.cannot_delete_files=Cannot delete the following file(s)
 
 #########
+# Spelling
+#########
+
+Spelling.dictionary.file.extension=dictionary
+Spelling.error.label=The word ''{0}'' is not correctly spelled
+Spelling.correct.label=Change to ''{0}''
+Spelling.add.info=Adds the word ''{0}'' to the dictionary
+Spelling.add.label=Add ''{0}'' to dictionary
+Spelling.ignore.info=Always ignores ''{0}'' during the current session
+Spelling.ignore.label=Always ignore ''{0}''
+Spelling.case.label=Change to upper case
+Spelling.error.case.label= The word ''{0}'' should have an initial upper case letter
+
+#########
 # misc
 #########
 
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/PHPUIStatus.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/PHPUIStatus.java
index 91e1537..4fcf12a 100644
--- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/PHPUIStatus.java
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/PHPUIStatus.java
@@ -29,7 +29,15 @@ public class PHPUIStatus extends Status {
   public PHPUIStatus(int code, String message, Throwable throwable) {
     super(IStatus.ERROR, PHPeclipsePlugin.getPluginId(), code, message, throwable);
   }
-
+  
+  public static IStatus createError(int code, Throwable throwable) {
+	String message= throwable.getMessage();
+	if (message == null) {
+		message= throwable.getClass().getName();
+	}
+	return new PHPUIStatus(IStatus.ERROR, code, message, throwable);
+  }
+  
   public static IStatus createError(int code, String message, Throwable throwable) {
     return new PHPUIStatus(IStatus.ERROR, code, message, throwable);
   }
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/preferences/CodeTemplateBlock.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/preferences/CodeTemplateBlock.java
new file mode 100644
index 0000000..a1e4f67
--- /dev/null
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/preferences/CodeTemplateBlock.java
@@ -0,0 +1,514 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials 
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package net.sourceforge.phpdt.internal.ui.preferences;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import net.sourceforge.phpdt.internal.corext.template.php.CodeTemplateContextType;
+import net.sourceforge.phpdt.internal.ui.text.IPHPPartitions;
+import net.sourceforge.phpdt.internal.ui.text.template.preferences.TemplateVariableProcessor;
+import net.sourceforge.phpdt.internal.ui.util.PixelConverter;
+import net.sourceforge.phpdt.internal.ui.wizards.dialogfields.DialogField;
+import net.sourceforge.phpdt.internal.ui.wizards.dialogfields.IDialogFieldListener;
+import net.sourceforge.phpdt.internal.ui.wizards.dialogfields.ITreeListAdapter;
+import net.sourceforge.phpdt.internal.ui.wizards.dialogfields.LayoutUtil;
+import net.sourceforge.phpdt.internal.ui.wizards.dialogfields.SelectionButtonDialogField;
+import net.sourceforge.phpdt.internal.ui.wizards.dialogfields.TreeListDialogField;
+import net.sourceforge.phpdt.ui.PreferenceConstants;
+import net.sourceforge.phpdt.ui.text.JavaTextTools;
+import net.sourceforge.phpeclipse.PHPeclipsePlugin;
+import net.sourceforge.phpeclipse.phpeditor.JavaSourceViewer;
+
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.text.Document;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.source.SourceViewer;
+import org.eclipse.jface.text.templates.Template;
+import org.eclipse.jface.text.templates.TemplateContextType;
+import org.eclipse.jface.text.templates.persistence.TemplatePersistenceData;
+import org.eclipse.jface.text.templates.persistence.TemplateReaderWriter;
+import org.eclipse.jface.text.templates.persistence.TemplateStore;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ */
+public class CodeTemplateBlock {
+
+  private class CodeTemplateAdapter implements ITreeListAdapter, IDialogFieldListener {
+
+    private final Object[] NO_CHILDREN = new Object[0];
+
+    public void customButtonPressed(TreeListDialogField field, int index) {
+      doButtonPressed(index, field.getSelectedElements());
+    }
+
+    public void selectionChanged(TreeListDialogField field) {
+      List selected = field.getSelectedElements();
+      field.enableButton(IDX_EDIT, canEdit(selected));
+      field.enableButton(IDX_EXPORT, !selected.isEmpty());
+
+      updateSourceViewerInput(selected);
+    }
+
+    public void doubleClicked(TreeListDialogField field) {
+      List selected = field.getSelectedElements();
+      if (canEdit(selected)) {
+        doButtonPressed(IDX_EDIT, selected);
+      }
+    }
+
+    public Object[] getChildren(TreeListDialogField field, Object element) {
+      if (element == COMMENT_NODE || element == CODE_NODE) {
+        return getTemplateOfCategory(element == COMMENT_NODE);
+      }
+      return NO_CHILDREN;
+    }
+
+    public Object getParent(TreeListDialogField field, Object element) {
+      if (element instanceof TemplatePersistenceData) {
+        TemplatePersistenceData data = (TemplatePersistenceData) element;
+        if (data.getTemplate().getName().endsWith(CodeTemplateContextType.COMMENT_SUFFIX)) {
+          return COMMENT_NODE;
+        }
+        return CODE_NODE;
+      }
+      return null;
+    }
+
+    public boolean hasChildren(TreeListDialogField field, Object element) {
+      return (element == COMMENT_NODE || element == CODE_NODE);
+    }
+
+    public void dialogFieldChanged(DialogField field) {
+    }
+
+    public void keyPressed(TreeListDialogField field, KeyEvent event) {
+    }
+
+  }
+
+  private static class CodeTemplateLabelProvider extends LabelProvider {
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
+     */
+    public Image getImage(Object element) {
+      return null;
+
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
+     */
+    public String getText(Object element) {
+      if (element == COMMENT_NODE || element == CODE_NODE) {
+        return (String) element;
+      }
+      TemplatePersistenceData data = (TemplatePersistenceData) element;
+      Template template = data.getTemplate();
+      String name = template.getName();
+      if (CodeTemplateContextType.CATCHBLOCK.equals(name)) {
+        return PreferencesMessages.getString("CodeTemplateBlock.catchblock.label"); //$NON-NLS-1$
+      } else if (CodeTemplateContextType.METHODSTUB.equals(name)) {
+        return PreferencesMessages.getString("CodeTemplateBlock.methodstub.label"); //$NON-NLS-1$
+      } else if (CodeTemplateContextType.CONSTRUCTORSTUB.equals(name)) {
+        return PreferencesMessages.getString("CodeTemplateBlock.constructorstub.label"); //$NON-NLS-1$
+      } else if (CodeTemplateContextType.GETTERSTUB.equals(name)) {
+        return PreferencesMessages.getString("CodeTemplateBlock.getterstub.label"); //$NON-NLS-1$
+      } else if (CodeTemplateContextType.SETTERSTUB.equals(name)) {
+        return PreferencesMessages.getString("CodeTemplateBlock.setterstub.label"); //$NON-NLS-1$
+      } else if (CodeTemplateContextType.NEWTYPE.equals(name)) {
+        return PreferencesMessages.getString("CodeTemplateBlock.newtype.label"); //$NON-NLS-1$
+      } else if (CodeTemplateContextType.TYPECOMMENT.equals(name)) {
+        return PreferencesMessages.getString("CodeTemplateBlock.typecomment.label"); //$NON-NLS-1$
+      } else if (CodeTemplateContextType.FIELDCOMMENT.equals(name)) {
+        return PreferencesMessages.getString("CodeTemplateBlock.fieldcomment.label"); //$NON-NLS-1$
+      } else if (CodeTemplateContextType.METHODCOMMENT.equals(name)) {
+        return PreferencesMessages.getString("CodeTemplateBlock.methodcomment.label"); //$NON-NLS-1$
+      } else if (CodeTemplateContextType.OVERRIDECOMMENT.equals(name)) {
+        return PreferencesMessages.getString("CodeTemplateBlock.overridecomment.label"); //$NON-NLS-1$
+      } else if (CodeTemplateContextType.CONSTRUCTORCOMMENT.equals(name)) {
+        return PreferencesMessages.getString("CodeTemplateBlock.constructorcomment.label"); //$NON-NLS-1$
+      } else if (CodeTemplateContextType.GETTERCOMMENT.equals(name)) {
+        return PreferencesMessages.getString("CodeTemplateBlock.gettercomment.label"); //$NON-NLS-1$
+      } else if (CodeTemplateContextType.SETTERCOMMENT.equals(name)) {
+        return PreferencesMessages.getString("CodeTemplateBlock.settercomment.label"); //$NON-NLS-1$
+      }
+      return template.getDescription();
+    }
+
+  }
+
+  private final static int IDX_EDIT = 0;
+
+  private final static int IDX_IMPORT = 2;
+
+  private final static int IDX_EXPORT = 3;
+
+  private final static int IDX_EXPORTALL = 4;
+
+  protected final static Object COMMENT_NODE = PreferencesMessages.getString("CodeTemplateBlock.templates.comment.node"); //$NON-NLS-1$
+
+  protected final static Object CODE_NODE = PreferencesMessages.getString("CodeTemplateBlock.templates.code.node"); //$NON-NLS-1$
+
+  private static final String PREF_JAVADOC_STUBS = PreferenceConstants.CODEGEN_ADD_COMMENTS;
+
+  private TreeListDialogField fCodeTemplateTree;
+
+  private SelectionButtonDialogField fCreateJavaDocComments;
+
+  protected TemplateStore fTemplates;
+
+  private PixelConverter fPixelConverter;
+
+  private SourceViewer fPatternViewer;
+
+  private Control fSWTWidget;
+
+  private TemplateVariableProcessor fTemplateProcessor;
+
+  public CodeTemplateBlock() {
+
+    fTemplates = PHPeclipsePlugin.getDefault().getCodeTemplateStore();
+    fTemplateProcessor = new TemplateVariableProcessor();
+
+    CodeTemplateAdapter adapter = new CodeTemplateAdapter();
+
+    String[] buttonLabels = new String[] {
+    /* IDX_EDIT */PreferencesMessages.getString("CodeTemplateBlock.templates.edit.button"), //$NON-NLS-1$
+        /* */null,
+        /* IDX_IMPORT */PreferencesMessages.getString("CodeTemplateBlock.templates.import.button"), //$NON-NLS-1$
+        /* IDX_EXPORT */PreferencesMessages.getString("CodeTemplateBlock.templates.export.button"), //$NON-NLS-1$
+        /* IDX_EXPORTALL */PreferencesMessages.getString("CodeTemplateBlock.templates.exportall.button") //$NON-NLS-1$
+
+    };
+    fCodeTemplateTree = new TreeListDialogField(adapter, buttonLabels, new CodeTemplateLabelProvider());
+    fCodeTemplateTree.setDialogFieldListener(adapter);
+    fCodeTemplateTree.setLabelText(PreferencesMessages.getString("CodeTemplateBlock.templates.label")); //$NON-NLS-1$
+
+    fCodeTemplateTree.enableButton(IDX_EXPORT, false);
+    fCodeTemplateTree.enableButton(IDX_EDIT, false);
+
+    fCodeTemplateTree.addElement(COMMENT_NODE);
+    fCodeTemplateTree.addElement(CODE_NODE);
+
+    fCreateJavaDocComments = new SelectionButtonDialogField(SWT.CHECK | SWT.WRAP);
+    fCreateJavaDocComments.setLabelText(PreferencesMessages.getString("CodeTemplateBlock.createcomment.label")); //$NON-NLS-1$
+    fCreateJavaDocComments.setSelection(PreferenceConstants.getPreferenceStore().getBoolean(PREF_JAVADOC_STUBS));
+
+    fCodeTemplateTree.selectFirstElement();
+  }
+
+  protected Control createContents(Composite parent) {
+    fPixelConverter = new PixelConverter(parent);
+    fSWTWidget = parent;
+
+    Composite composite = new Composite(parent, SWT.NONE);
+    GridLayout layout = new GridLayout();
+    layout.marginHeight = 0;
+    layout.marginWidth = 0;
+    layout.numColumns = 2;
+    composite.setLayout(layout);
+
+    fCodeTemplateTree.doFillIntoGrid(composite, 3);
+    LayoutUtil.setHorizontalSpan(fCodeTemplateTree.getLabelControl(null), 2);
+    LayoutUtil.setHorizontalGrabbing(fCodeTemplateTree.getTreeControl(null));
+
+    fPatternViewer = createViewer(composite, 2);
+
+    fCreateJavaDocComments.doFillIntoGrid(composite, 2);
+
+    DialogField label = new DialogField();
+    label.setLabelText(PreferencesMessages.getString("CodeTemplateBlock.createcomment.description")); //$NON-NLS-1$
+    label.doFillIntoGrid(composite, 2);
+
+    return composite;
+
+  }
+
+  private Shell getShell() {
+    if (fSWTWidget != null) {
+      return fSWTWidget.getShell();
+    }
+    return PHPeclipsePlugin.getActiveWorkbenchShell();
+  }
+
+  private SourceViewer createViewer(Composite parent, int nColumns) {
+    Label label = new Label(parent, SWT.NONE);
+    label.setText(PreferencesMessages.getString("CodeTemplateBlock.preview")); //$NON-NLS-1$
+    GridData data = new GridData();
+    data.horizontalSpan = nColumns;
+    label.setLayoutData(data);
+
+    IDocument document = new Document();
+    JavaTextTools tools = PHPeclipsePlugin.getDefault().getJavaTextTools();
+    tools.setupJavaDocumentPartitioner(document, IPHPPartitions.PHP_PARTITIONING);
+    IPreferenceStore store = PHPeclipsePlugin.getDefault().getCombinedPreferenceStore();
+    SourceViewer viewer = new JavaSourceViewer(parent, null, null, false, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL, store);
+    TemplateEditorSourceViewerConfiguration configuration = new TemplateEditorSourceViewerConfiguration(tools.getColorManager(),
+        store, null, fTemplateProcessor);
+    viewer.configure(configuration);
+    viewer.setEditable(false);
+    viewer.setDocument(document);
+
+    Font font = JFaceResources.getFont(PreferenceConstants.EDITOR_TEXT_FONT);
+    viewer.getTextWidget().setFont(font);
+    new JavaSourcePreviewerUpdater(viewer, configuration, store);
+
+    Control control = viewer.getControl();
+    data = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.FILL_VERTICAL);
+    data.horizontalSpan = nColumns;
+    data.heightHint = fPixelConverter.convertHeightInCharsToPixels(5);
+    control.setLayoutData(data);
+
+    return viewer;
+  }
+
+  protected TemplatePersistenceData[] getTemplateOfCategory(boolean isComment) {
+    ArrayList res = new ArrayList();
+    TemplatePersistenceData[] templates = fTemplates.getTemplateData(false);
+    for (int i = 0; i < templates.length; i++) {
+      TemplatePersistenceData curr = templates[i];
+      if (isComment == curr.getTemplate().getName().endsWith(CodeTemplateContextType.COMMENT_SUFFIX)) {
+        res.add(curr);
+      }
+    }
+    return (TemplatePersistenceData[]) res.toArray(new TemplatePersistenceData[res.size()]);
+  }
+
+  protected static boolean canEdit(List selected) {
+    return selected.size() == 1 && (selected.get(0) instanceof TemplatePersistenceData);
+  }
+
+  protected void updateSourceViewerInput(List selection) {
+    if (fPatternViewer == null || fPatternViewer.getTextWidget().isDisposed()) {
+      return;
+    }
+    if (selection.size() == 1 && selection.get(0) instanceof TemplatePersistenceData) {
+      TemplatePersistenceData data = (TemplatePersistenceData) selection.get(0);
+      Template template = data.getTemplate();
+      TemplateContextType type = PHPeclipsePlugin.getDefault().getCodeTemplateContextRegistry().getContextType(
+          template.getContextTypeId());
+      fTemplateProcessor.setContextType(type);
+      fPatternViewer.getDocument().set(template.getPattern());
+    } else {
+      fPatternViewer.getDocument().set(""); //$NON-NLS-1$
+    }
+  }
+
+  protected void doButtonPressed(int buttonIndex, List selected) {
+    if (buttonIndex == IDX_EDIT) {
+      edit((TemplatePersistenceData) selected.get(0));
+    } else if (buttonIndex == IDX_EXPORT) {
+      export(selected);
+    } else if (buttonIndex == IDX_EXPORTALL) {
+      exportAll();
+    } else if (buttonIndex == IDX_IMPORT) {
+      import_();
+    }
+  }
+
+  private void edit(TemplatePersistenceData data) {
+    Template newTemplate = new Template(data.getTemplate());
+    EditTemplateDialog dialog = new EditTemplateDialog(getShell(), newTemplate, true, false, PHPeclipsePlugin.getDefault()
+        .getCodeTemplateContextRegistry());
+    if (dialog.open() == Window.OK) {
+      // changed
+      data.setTemplate(newTemplate);
+      fCodeTemplateTree.refresh(data);
+      fCodeTemplateTree.selectElements(new StructuredSelection(data));
+    }
+  }
+
+  private void import_() {
+    FileDialog dialog = new FileDialog(getShell());
+    dialog.setText(PreferencesMessages.getString("CodeTemplateBlock.import.title")); //$NON-NLS-1$
+    dialog.setFilterExtensions(new String[] { PreferencesMessages.getString("CodeTemplateBlock.import.extension") }); //$NON-NLS-1$
+    String path = dialog.open();
+
+    if (path == null)
+      return;
+
+    try {
+      TemplateReaderWriter reader = new TemplateReaderWriter();
+      File file = new File(path);
+      if (file.exists()) {
+        InputStream input = new BufferedInputStream(new FileInputStream(file));
+        TemplatePersistenceData[] datas = reader.read(input, null);
+        for (int i = 0; i < datas.length; i++) {
+          updateTemplate(datas[i]);
+        }
+      }
+
+      fCodeTemplateTree.refresh();
+      updateSourceViewerInput(fCodeTemplateTree.getSelectedElements());
+
+    } catch (FileNotFoundException e) {
+      openReadErrorDialog(e);
+    } catch (IOException e) {
+      openReadErrorDialog(e);
+    }
+
+  }
+
+  private void updateTemplate(TemplatePersistenceData data) {
+    TemplatePersistenceData[] datas = fTemplates.getTemplateData(true);
+    for (int i = 0; i < datas.length; i++) {
+      String id = datas[i].getId();
+      if (id != null && id.equals(data.getId())) {
+        datas[i].setTemplate(data.getTemplate());
+        break;
+      }
+    }
+  }
+
+  private void exportAll() {
+    export(fTemplates.getTemplateData(false));
+  }
+
+  private void export(List selected) {
+    List datas = new ArrayList();
+    for (int i = 0; i < selected.size(); i++) {
+      Object curr = selected.get(i);
+      if (curr instanceof TemplatePersistenceData) {
+        datas.add(curr);
+      } else {
+        TemplatePersistenceData[] cat = getTemplateOfCategory(curr == COMMENT_NODE);
+        datas.addAll(Arrays.asList(cat));
+      }
+    }
+    export((TemplatePersistenceData[]) datas.toArray(new TemplatePersistenceData[datas.size()]));
+  }
+
+  private void export(TemplatePersistenceData[] templates) {
+    FileDialog dialog = new FileDialog(getShell(), SWT.SAVE);
+    dialog.setText(PreferencesMessages.getFormattedString("CodeTemplateBlock.export.title", String.valueOf(templates.length))); //$NON-NLS-1$
+    dialog.setFilterExtensions(new String[] { PreferencesMessages.getString("CodeTemplateBlock.export.extension") }); //$NON-NLS-1$
+    dialog.setFileName(PreferencesMessages.getString("CodeTemplateBlock.export.filename")); //$NON-NLS-1$
+    String path = dialog.open();
+
+    if (path == null)
+      return;
+
+    File file = new File(path);
+
+    if (file.isHidden()) {
+      String title = PreferencesMessages.getString("CodeTemplateBlock.export.error.title"); //$NON-NLS-1$ 
+      String message = PreferencesMessages.getFormattedString("CodeTemplateBlock.export.error.hidden", file.getAbsolutePath()); //$NON-NLS-1$
+      MessageDialog.openError(getShell(), title, message);
+      return;
+    }
+
+    if (file.exists() && !file.canWrite()) {
+      String title = PreferencesMessages.getString("CodeTemplateBlock.export.error.title"); //$NON-NLS-1$
+      String message = PreferencesMessages.getFormattedString("CodeTemplateBlock.export.error.canNotWrite", file.getAbsolutePath()); //$NON-NLS-1$
+      MessageDialog.openError(getShell(), title, message);
+      return;
+    }
+
+    if (!file.exists() || confirmOverwrite(file)) {
+      try {
+        OutputStream output = new BufferedOutputStream(new FileOutputStream(file));
+        TemplateReaderWriter writer = new TemplateReaderWriter();
+        writer.save(templates, output);
+      } catch (IOException e) {
+        openWriteErrorDialog(e);
+      }
+    }
+
+  }
+
+  private boolean confirmOverwrite(File file) {
+    return MessageDialog.openQuestion(getShell(), PreferencesMessages.getString("CodeTemplateBlock.export.exists.title"), //$NON-NLS-1$
+        PreferencesMessages.getFormattedString("CodeTemplateBlock.export.exists.message", file.getAbsolutePath())); //$NON-NLS-1$
+  }
+
+  public void performDefaults() {
+    IPreferenceStore prefs = PHPeclipsePlugin.getDefault().getPreferenceStore();
+    fCreateJavaDocComments.setSelection(prefs.getDefaultBoolean(PREF_JAVADOC_STUBS));
+
+    fTemplates.restoreDefaults();
+
+    // refresh
+    fCodeTemplateTree.refresh();
+    updateSourceViewerInput(fCodeTemplateTree.getSelectedElements());
+  }
+
+  public boolean performOk(boolean enabled) {
+    IPreferenceStore prefs = PreferenceConstants.getPreferenceStore();
+    prefs.setValue(PREF_JAVADOC_STUBS, fCreateJavaDocComments.isSelected());
+    PHPeclipsePlugin.getDefault().savePluginPreferences();
+
+    try {
+      fTemplates.save();
+    } catch (IOException e) {
+      PHPeclipsePlugin.log(e);
+      openWriteErrorDialog(e);
+    }
+    return true;
+  }
+
+  public void performCancel() {
+    try {
+      fTemplates.load();
+    } catch (IOException e) {
+      openReadErrorDialog(e);
+    }
+  }
+
+  private void openReadErrorDialog(Exception e) {
+    String title = PreferencesMessages.getString("CodeTemplateBlock.error.read.title"); //$NON-NLS-1$
+
+    String message = e.getLocalizedMessage();
+    if (message != null)
+      message = PreferencesMessages.getFormattedString("CodeTemplateBlock.error.parse.message", message); //$NON-NLS-1$
+    else
+      message = PreferencesMessages.getString("CodeTemplateBlock.error.read.message"); //$NON-NLS-1$
+    MessageDialog.openError(getShell(), title, message);
+  }
+
+  private void openWriteErrorDialog(Exception e) {
+    String title = PreferencesMessages.getString("CodeTemplateBlock.error.write.title"); //$NON-NLS-1$
+    String message = PreferencesMessages.getString("CodeTemplateBlock.error.write.message"); //$NON-NLS-1$
+    MessageDialog.openError(getShell(), title, message);
+  }
+
+}
\ No newline at end of file
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/preferences/CodeTemplatePreferencePage.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/preferences/CodeTemplatePreferencePage.java
new file mode 100644
index 0000000..292083a
--- /dev/null
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/preferences/CodeTemplatePreferencePage.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials 
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package net.sourceforge.phpdt.internal.ui.preferences;
+
+import net.sourceforge.phpdt.internal.ui.IJavaHelpContextIds;
+import net.sourceforge.phpdt.internal.ui.dialogs.StatusUtil;
+import net.sourceforge.phpdt.internal.ui.wizards.IStatusChangeListener;
+import net.sourceforge.phpeclipse.PHPeclipsePlugin;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.eclipse.ui.help.WorkbenchHelp;
+
+/*
+ * The page to configure the code formatter options.
+ */
+public class CodeTemplatePreferencePage extends PreferencePage implements IWorkbenchPreferencePage, IStatusChangeListener {
+
+	private CodeTemplateBlock fCodeTemplateConfigurationBlock;
+
+	public CodeTemplatePreferencePage() {
+		setPreferenceStore(PHPeclipsePlugin.getDefault().getPreferenceStore());
+		//setDescription(PreferencesMessages.getString("CodeTemplatesPreferencePage.description")); //$NON-NLS-1$
+		
+		// only used when page is shown programatically
+		setTitle(PreferencesMessages.getString("CodeTemplatesPreferencePage.title"));		 //$NON-NLS-1$
+		
+		fCodeTemplateConfigurationBlock= new CodeTemplateBlock();
+	}
+
+	/*
+	 * @see IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
+	 */	
+	public void init(IWorkbench workbench) {
+	}
+
+	/*
+	 * @see PreferencePage#createControl(Composite)
+	 */
+	public void createControl(Composite parent) {
+		super.createControl(parent);
+		WorkbenchHelp.setHelp(getControl(), IJavaHelpContextIds.CODE_MANIPULATION_PREFERENCE_PAGE);
+	}	
+
+	/*
+	 * @see PreferencePage#createContents(Composite)
+	 */
+	protected Control createContents(Composite parent) {
+		Control composite= fCodeTemplateConfigurationBlock.createContents(parent);
+		Dialog.applyDialogFont(composite);
+		return composite;
+	}
+
+	/*
+	 * @see IPreferencePage#performOk()
+	 */
+	public boolean performOk() {
+		if (!fCodeTemplateConfigurationBlock.performOk(true)) {
+			return false;
+		}			
+		return super.performOk();
+	}
+	
+	/*
+	 * @see PreferencePage#performDefaults()
+	 */
+	protected void performDefaults() {
+		fCodeTemplateConfigurationBlock.performDefaults();
+		super.performDefaults();
+	}
+	
+	/* (non-Javadoc)
+	 * @see net.sourceforge.phpdt.internal.ui.wizards.IStatusChangeListener#statusChanged(org.eclipse.core.runtime.IStatus)
+	 */
+	public void statusChanged(IStatus status) {
+		setValid(!status.matches(IStatus.ERROR));
+		StatusUtil.applyToStatusLine(this, status);		
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.preference.IPreferencePage#performCancel()
+	 */
+	public boolean performCancel() {
+		fCodeTemplateConfigurationBlock.performCancel();
+		
+		return super.performCancel();
+	}
+
+}
+
+
+
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/spelling/SpellReconcileStrategy.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/spelling/SpellReconcileStrategy.java
index a977166..84d5f35 100644
--- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/spelling/SpellReconcileStrategy.java
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/spelling/SpellReconcileStrategy.java
@@ -226,7 +226,7 @@ public class SpellReconcileStrategy implements IReconcilingStrategy, IReconcilin
 		}
 	}
 
-	/** The document to operate on */
+	/** The document to operate on */ 
 	private IDocument fDocument= null;
 
 	/** The text editor to operate on */
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/CodeGeneration.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/CodeGeneration.java
new file mode 100644
index 0000000..a6d10fc
--- /dev/null
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/CodeGeneration.java
@@ -0,0 +1,241 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials 
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package net.sourceforge.phpdt.ui;
+
+import org.eclipse.core.runtime.CoreException;
+
+import net.sourceforge.phpdt.core.ICompilationUnit;
+import net.sourceforge.phpdt.core.IMethod;
+//import net.sourceforge.phpdt.core.dom.IMethodBinding;
+//import net.sourceforge.phpdt.core.dom.MethodDeclaration;
+
+import net.sourceforge.phpdt.internal.corext.codemanipulation.StubUtility;
+
+/**
+ * Class that offers access to the templates contained in the 'code templates' preference page.
+ * 
+ * @since 2.1
+ */
+public class CodeGeneration {
+	
+	private CodeGeneration() {
+	}
+	
+	/**
+	 * Returns the content for a new compilation unit using the 'new Java file' code template.
+	 * @param cu The compilation to create the source for. The compilation unit does not need to exist.
+	 * @param typeComment The comment for the type to be created. Used when the code template contains a <i>${typecomment}</i> variable. Can be <code>null</code> if
+	 * no comment should be added.
+	 * @param typeContent The code of the type, including type declaration and body.
+	 * @param lineDelimiter The line delimiter to be used.
+	 * @return Returns the new content or <code>null</code> if the template is undefined or empty.
+	 * @throws CoreException Thrown when the evaluation of the code template fails.
+	 */
+	public static String getCompilationUnitContent(ICompilationUnit cu, String typeComment, String typeContent, String lineDelimiter) throws CoreException {	
+		return StubUtility.getCompilationUnitContent(cu, typeComment, typeContent, lineDelimiter);
+	}
+	
+	/**
+	 * Returns the content for a new type comment using the 'type comment' code template. The returned content is unformatted and is not indented.
+	 * @param cu The compilation where the type is contained. The compilation unit does not need to exist.
+	 * @param typeQualifiedName The name of the type to which the comment is added. For inner types the name must be qualified and include the outer
+	 * types names (dot separated). See {@link net.sourceforge.phpdt.core.IType#getTypeQualifiedName(char)}.
+	 * @param lineDelimiter The line delimiter to be used.
+	 * @return Returns the new content or <code>null</code> if the code template is undefined or empty. The returned content is unformatted and is not indented.
+	 * @throws CoreException Thrown when the evaluation of the code template fails.
+	 */	
+	public static String getTypeComment(ICompilationUnit cu, String typeQualifiedName, String lineDelimiter) throws CoreException {
+		return StubUtility.getTypeComment(cu, typeQualifiedName, lineDelimiter);
+	}
+
+	/**
+	 * Returns the content for a new field comment using the 'field comment' code template. The returned content is unformatted and is not indented.
+	 * @param cu The compilation where the field is contained. The compilation unit does not need to exist.
+	 * @param typeName The name of the field declared type.
+	 * @param fieldName The name of the field to which the comment is added.
+	 * @param lineDelimiter The line delimiter to be used.
+	 * @return Returns the new content or <code>null</code> if the code template is undefined or empty. The returned content is unformatted and is not indented.
+	 * @throws CoreException Thrown when the evaluation of the code template fails.
+	 * @since 3.0
+	 */	
+	public static String getFieldComment(ICompilationUnit cu, String typeName, String fieldName, String lineDelimiter) throws CoreException {
+		return StubUtility.getFieldComment(cu, typeName, fieldName, lineDelimiter);
+	}	
+	
+	/**
+	 * Returns the comment for a method or constructor using the comment code templates (constructor / method / overriding method).
+	 * <code>null</code> is returned if the template is empty.
+	 * @param cu The compilation unit to which the method belongs. The compilation unit does not need to exist.
+	 * @param declaringTypeName Name of the type to which the method belongs. For inner types the name must be qualified and include the outer
+	 * types names (dot separated). See {@link net.sourceforge.phpdt.core.IType#getTypeQualifiedName(char)}.
+	 * @param decl The MethodDeclaration AST node that will be added as new
+	 * method. The node does not need to exist in an AST (no parent needed) and does not need to resolve.
+	 * See {@link net.sourceforge.phpdt.core.dom.AST#newMethodDeclaration()} for how to create such a node.
+	 * @param overridden The binding of the method that will be overridden by the created
+	 * method or <code>null</code> if no method is overridden.
+	 * @param lineDelimiter The line delimiter to be used.
+	 * @return Returns the generated method comment or <code>null</code> if the
+	 * code template is empty. The returned content is unformatted and not indented (formatting required).
+	 * @throws CoreException Thrown when the evaluation of the code template fails.
+	 */
+//	public static String getMethodComment(ICompilationUnit cu, String declaringTypeName, MethodDeclaration decl, IMethodBinding overridden, String lineDelimiter) throws CoreException {
+//		return StubUtility.getMethodComment(cu, declaringTypeName, decl, overridden, lineDelimiter);
+//	}
+
+	/**
+	 * Returns the comment for a method or constructor using the comment code templates (constructor / method / overriding method).
+	 * <code>null</code> is returned if the template is empty.
+	 * <p>The returned string is unformatted and not indented.
+	 * <p>Exception types and return type are in signature notation. e.g. a source method declared as <code>public void foo(String text, int length)</code>
+	 * would return the array <code>{"QString;","I"}</code> as parameter types. See {@link net.sourceforge.phpdt.core.Signature}.
+	 * 
+	 * @param cu The compilation unit to which the method belongs. The compilation unit does not need to exist.
+	 * @param declaringTypeName Name of the type to which the method belongs. For inner types the name must be qualified and include the outer
+	 * types names (dot separated). See {@link net.sourceforge.phpdt.core.IType#getTypeQualifiedName(char)}.
+	 * @param methodName Name of the method.
+	 * @param paramNames Names of the parameters for the method.
+	 * @param excTypeSig Thrown exceptions (Signature notation).
+	 * @param retTypeSig Return type (Signature notation) or <code>null</code>
+	 * for constructors.
+	 * @param overridden The method that will be overridden by the created method or
+	 * <code>null</code> for non-overriding methods. If not <code>null</code>, the method must exist.
+	 * @param lineDelimiter The line delimiter to be used.
+	 * @return Returns the constructed comment or <code>null</code> if
+	 * the comment code template is empty. The returned content is unformatted and not indented (formatting required).
+	 * @throws CoreException Thrown when the evaluation of the code template fails.
+	 */
+	public static String getMethodComment(ICompilationUnit cu, String declaringTypeName, String methodName, String[] paramNames, String[] excTypeSig, String retTypeSig, IMethod overridden, String lineDelimiter) throws CoreException {
+		return StubUtility.getMethodComment(cu, declaringTypeName, methodName, paramNames, excTypeSig, retTypeSig, overridden, lineDelimiter);
+	}
+		
+	/**
+	 * Returns the comment for a method or constructor using the comment code templates (constructor / method / overriding method).
+	 * <code>null</code> is returned if the template is empty.
+	 * <p>The returned string is unformatted and not indented.
+	 * 
+	 * @param method The method to be documented. The method must exist.
+	 * @param overridden The method that will be overridden by the created method or
+	 * <code>null</code> for non-overriding methods. If not <code>null</code>, the method must exist.
+	 * @param lineDelimiter The line delimiter to be used.
+	 * @return Returns the constructed comment or <code>null</code> if
+	 * the comment code template is empty. The returned string is unformatted and and has no indent (formatting required).
+	 * @throws CoreException Thrown when the evaluation of the code template fails.
+	 */
+	public static String getMethodComment(IMethod method, IMethod overridden, String lineDelimiter) throws CoreException {
+		return StubUtility.getMethodComment(method, overridden, lineDelimiter);
+	}	
+
+	/**
+	 * Returns the content of the body for a method or constructor using the method body templates.
+	 * <code>null</code> is returned if the template is empty.
+	 * <p>The returned string is unformatted and not indented.
+	 * 
+	 * @param cu The compilation unit to which the method belongs. The compilation unit does not need to exist.
+	 * @param declaringTypeName Name of the type to which the method belongs. For inner types the name must be qualified and include the outer
+	 * types names (dot separated). See {@link net.sourceforge.phpdt.core.IType#getTypeQualifiedName(char)}.
+	 * @param methodName Name of the method.
+	 * @param isConstructor Defines if the created body is for a constructor.
+	 * @param bodyStatement The code to be entered at the place of the variable ${body_statement}. 
+	 * @param lineDelimiter The line delimiter to be used.
+	 * @return Returns the constructed body content or <code>null</code> if
+	 * the comment code template is empty. The returned string is unformatted and and has no indent (formatting required).
+	 * @throws CoreException Thrown when the evaluation of the code template fails.
+	 */	
+	public static String getMethodBodyContent(ICompilationUnit cu, String declaringTypeName, String methodName, boolean isConstructor, String bodyStatement, String lineDelimiter) throws CoreException {
+		return StubUtility.getMethodBodyContent(isConstructor, cu.getJavaProject(), declaringTypeName, methodName, bodyStatement, lineDelimiter);
+	}
+	
+	/**
+	 * Returns the content of body for a getter method using the getter method body template.
+	 * <code>null</code> is returned if the template is empty.
+	 * <p>The returned string is unformatted and not indented.
+	 * 
+	 * @param cu The compilation unit to which the method belongs. The compilation unit does not need to exist.
+	 * @param declaringTypeName Name of the type to which the method belongs. For inner types the name must be qualified and include the outer
+	 * types names (dot separated). See {@link net.sourceforge.phpdt.core.IType#getTypeQualifiedName(char)}.
+	 * @param methodName The name of the getter method.
+	 * @param fieldName The name of the field to get in the getter method, corresponding to the template variable for ${field}. 
+	 * @param lineDelimiter The line delimiter to be used.
+	 * @return Returns the constructed body content or <code>null</code> if
+	 * the comment code template is empty. The returned string is unformatted and and has no indent (formatting required).
+	 * @throws CoreException Thrown when the evaluation of the code template fails.
+	 * @since 3.0
+	 */	
+	public static String getGetterMethodBodyContent(ICompilationUnit cu, String declaringTypeName, String methodName, String fieldName, String lineDelimiter) throws CoreException {
+		return StubUtility.getGetterMethodBodyContent(cu.getJavaProject(), declaringTypeName, methodName, fieldName, lineDelimiter);
+	}
+	
+	/**
+	 * Returns the content of body for a setter method using the setter method body template.
+	 * <code>null</code> is returned if the template is empty.
+	 * <p>The returned string is unformatted and not indented.
+	 * 
+	 * @param cu The compilation unit to which the method belongs. The compilation unit does not need to exist.
+	 * @param declaringTypeName Name of the type to which the method belongs. For inner types the name must be qualified and include the outer
+	 * types names (dot separated). See {@link net.sourceforge.phpdt.core.IType#getTypeQualifiedName(char)}.
+	 * @param methodName The name of the setter method.
+	 * @param fieldName The name of the field to be set in the setter method, corresponding to the template variable for ${field}.
+	 * @param paramName The name of the parameter passed to the setter method, corresponding to the template variable for $(param).
+	 * @param lineDelimiter The line delimiter to be used.
+	 * @return Returns the constructed body content or <code>null</code> if
+	 * the comment code template is empty. The returned string is unformatted and and has no indent (formatting required).
+	 * @throws CoreException Thrown when the evaluation of the code template fails.
+	 * @since 3.0
+	 */	
+	public static String getSetterMethodBodyContent(ICompilationUnit cu, String declaringTypeName, String methodName, String fieldName, String paramName, String lineDelimiter) throws CoreException {
+		return StubUtility.getSetterMethodBodyContent(cu.getJavaProject(), declaringTypeName, methodName, fieldName, paramName, lineDelimiter);
+	}
+	
+	/**
+	 * Returns the comment for a getter method using the getter comment template.
+	 * <code>null</code> is returned if the template is empty.
+	 * <p>The returned string is unformatted and not indented.
+	 * 
+	 * @param cu The compilation unit to which the method belongs. The compilation unit does not need to exist.
+	 * @param declaringTypeName Name of the type to which the method belongs. For inner types the name must be qualified and include the outer
+	 * types names (dot separated). See {@link net.sourceforge.phpdt.core.IType#getTypeQualifiedName(char)}.
+	 * @param methodName Name of the method.
+	 * @param fieldName Name of the field to get.
+	 * @param fieldType The type of the field to get.
+	 * @param bareFieldName The field name without prefix or suffix.
+	 * @param lineDelimiter The line delimiter to be used.
+	 * @return Returns the generated getter comment or <code>null</code> if the
+	 * code template is empty. The returned content is not indented.
+	 * @throws CoreException Thrown when the evaluation of the code template fails.
+	 * @since 3.0
+	 */
+	public static String getGetterComment(ICompilationUnit cu, String declaringTypeName, String methodName, String fieldName, String fieldType, String bareFieldName, String lineDelimiter) throws CoreException {
+		return StubUtility.getGetterComment(cu, declaringTypeName, methodName, fieldName, fieldType, bareFieldName, lineDelimiter);
+	}
+	
+	/**
+	 * Returns the comment for a setter method using the setter method body template.
+	 * <code>null</code> is returned if the template is empty.
+	 * <p>The returned string is unformatted and not indented.
+	 * 
+	 * @param cu The compilation unit to which the method belongs. The compilation unit does not need to exist.
+	 * @param declaringTypeName Name of the type to which the method belongs. For inner types the name must be qualified and include the outer
+	 * types names (dot separated). See {@link net.sourceforge.phpdt.core.IType#getTypeQualifiedName(char)}.
+	 * @param methodName Name of the method.
+	 * @param fieldName Name of the field that is set.
+	 * @param fieldType The type of the field that is to set.
+	 * @param paramName The name of the parameter that used to set.
+	 * @param bareFieldName The field name without prefix or suffix.
+	 * @param lineDelimiter The line delimiter to be used.
+	 * @return Returns the generated setter comment or <code>null</code> if the
+	 * code template is empty. The returned comment is not indented.
+	 * @throws CoreException Thrown when the evaluation of the code template fails.
+	 * @since 3.0
+	 */
+	public static String getSetterComment(ICompilationUnit cu, String declaringTypeName, String methodName, String fieldName, String fieldType, String paramName, String bareFieldName, String lineDelimiter) throws CoreException {
+		return StubUtility.getSetterComment(cu, declaringTypeName, methodName, fieldName, fieldType, paramName, bareFieldName, lineDelimiter);
+	}		
+}
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/PreferenceConstants.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/PreferenceConstants.java
index 52017fc..f751f9f 100644
--- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/PreferenceConstants.java
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/PreferenceConstants.java
@@ -147,14 +147,24 @@ public class PreferenceConstants {
    * @see #CODEGEN_USE_GETTERSETTER_SUFFIX
    */
   public static final String CODEGEN_GETTERSETTER_SUFFIX = "net.sourceforge.phpdt.ui.gettersetter.suffix.list"; //$NON-NLS-1$
+  /**
+	 * A named preference that controls if comment stubs will be added
+	 * automatically to newly created types and methods.
+	 * <p>
+	 * Value is of type <code>Boolean</code>.
+	 * </p>
+	 * @since 2.1
+	 */
+	public static final String CODEGEN_ADD_COMMENTS= "net.sourceforge.phpdt.ui.phpdoc"; //$NON-NLS-1$
 
   /**
    * A name preference that controls if a JavaDoc stub gets added to newly created types and methods.
    * <p>
    * Value is of type <code>Boolean</code>.
    * </p>
+   * @deprecated Use CODEGEN_ADD_COMMENTS instead (Name is more precise).
    */
-  public static final String CODEGEN__JAVADOC_STUBS = "net.sourceforge.phpdt.ui.phpdoc"; //$NON-NLS-1$
+//  public static final String CODEGEN__JAVADOC_STUBS = CODEGEN_ADD_COMMENTS; //$NON-NLS-1$
 
   /**
    * A named preference that controls if a non-phpdoc comment gets added to methods generated via the 
@@ -2256,14 +2266,14 @@ public final static String EDITOR_TEXT_FONT= "net.sourceforge.phpdt.ui.editors.t
     store.setDefault(PreferenceConstants.CODEGEN_USE_GETTERSETTER_SUFFIX, false);
     store.setDefault(PreferenceConstants.CODEGEN_GETTERSETTER_PREFIX, "fg, f, _$, _, m_"); //$NON-NLS-1$
     store.setDefault(PreferenceConstants.CODEGEN_GETTERSETTER_SUFFIX, "_"); //$NON-NLS-1$
-    store.setDefault(PreferenceConstants.CODEGEN__JAVADOC_STUBS, true);
+    store.setDefault(PreferenceConstants.CODEGEN_ADD_COMMENTS, true);
     store.setDefault(PreferenceConstants.CODEGEN__NON_JAVADOC_COMMENTS, false);
     store.setDefault(PreferenceConstants.CODEGEN__FILE_COMMENTS, false);
 
     // MembersOrderPreferencePage
     store.setDefault(PreferenceConstants.APPEARANCE_MEMBER_SORT_ORDER, "T,SI,SF,SM,I,F,C,M"); //$NON-NLS-1$
     // must add here to guarantee that it is the first in the listener list
-    //	store.addPropertyChangeListener(PHPeclipsePlugin.getDefault().getMemberOrderPreferenceCache());
+    store.addPropertyChangeListener(PHPeclipsePlugin.getDefault().getMemberOrderPreferenceCache());
 
     // PHPEditorPreferencePage
     /*
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/wizards/NewTypeWizardPage.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/wizards/NewTypeWizardPage.java
index 582eda6..0d8a251 100644
--- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/wizards/NewTypeWizardPage.java
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/wizards/NewTypeWizardPage.java
@@ -18,6 +18,7 @@ import net.sourceforge.phpdt.core.IBuffer;
 import net.sourceforge.phpdt.core.ICompilationUnit;
 import net.sourceforge.phpdt.core.IJavaElement;
 import net.sourceforge.phpdt.core.IPackageFragment;
+import net.sourceforge.phpdt.core.IPackageFragmentRoot;
 import net.sourceforge.phpdt.core.ISourceRange;
 import net.sourceforge.phpdt.core.IType;
 import net.sourceforge.phpdt.core.ToolFactory;
@@ -28,6 +29,7 @@ import net.sourceforge.phpdt.externaltools.internal.ui.StatusInfo;
 import net.sourceforge.phpdt.internal.corext.codemanipulation.StubUtility;
 import net.sourceforge.phpdt.internal.corext.template.php.JavaContext;
 import net.sourceforge.phpdt.internal.corext.template.php.Templates;
+import net.sourceforge.phpdt.internal.corext.util.JavaModelUtil;
 import net.sourceforge.phpdt.internal.ui.PHPUiImages;
 import net.sourceforge.phpdt.internal.ui.util.SWTUtil;
 import net.sourceforge.phpdt.internal.ui.wizards.NewWizardMessages;
@@ -43,6 +45,7 @@ import net.sourceforge.phpdt.internal.ui.wizards.dialogfields.Separator;
 import net.sourceforge.phpdt.internal.ui.wizards.dialogfields.StringButtonDialogField;
 import net.sourceforge.phpdt.internal.ui.wizards.dialogfields.StringButtonStatusDialogField;
 import net.sourceforge.phpdt.internal.ui.wizards.dialogfields.StringDialogField;
+import net.sourceforge.phpdt.ui.CodeGeneration;
 import net.sourceforge.phpdt.ui.PreferenceConstants;
 import net.sourceforge.phpeclipse.PHPeclipsePlugin;
 
@@ -1321,17 +1324,17 @@ public abstract class NewTypeWizardPage extends NewContainerWizardPage {
 //      if (!isInnerClass) {
         lineDelimiter = System.getProperty("line.separator", "\n"); //$NON-NLS-1$ //$NON-NLS-2$
 //
-//        ICompilationUnit parentCU = pack.createCompilationUnit(clName + ".php", "", false, new SubProgressMonitor(monitor, 2)); //$NON-NLS-1$ //$NON-NLS-2$
+//         ICompilationUnit parentCU = pack.createCompilationUnit(clName + ".php", "", false, new SubProgressMonitor(monitor, 2)); //$NON-NLS-1$ //$NON-NLS-2$
 //        createdWorkingCopy = (ICompilationUnit) parentCU.getSharedWorkingCopy(null, JavaUI.getBufferFactory(), null);
 //
 //        imports = new ImportsStructure(createdWorkingCopy, prefOrder, threshold, false);
 //        // add an import that will be removed again. Having this import solves 14661
 //        imports.addImport(pack.getElementName(), getTypeName());
 //
-//        String typeContent = constructTypeStub(new ImportsManager(imports), lineDelimiter);
-//
+          String typeContent = constructTypeStub(lineDelimiter);//new ImportsManager(imports), lineDelimiter);
+
 //        String cuContent = constructCUContent(parentCU, typeContent, lineDelimiter);
-//
+
 //        createdWorkingCopy.getBuffer().setContents(cuContent);
 //
         createdType = createdWorkingCopy.getType(clName);
@@ -1493,25 +1496,25 @@ public abstract class NewTypeWizardPage extends NewContainerWizardPage {
   /*
    * Called from createType to construct the source for this type
    */
-  //	private String constructTypeStub(ImportsManager imports, String lineDelimiter) {	
-  //		StringBuffer buf= new StringBuffer();
-  //			
-  //		int modifiers= getModifiers();
-  //		buf.append(Flags.toString(modifiers));
-  //		if (modifiers != 0) {
-  //			buf.append(' ');
-  //		}
-  //		buf.append(fIsClass ? "class " : "interface "); //$NON-NLS-2$ //$NON-NLS-1$
-  //		buf.append(getTypeName());
-  //		writeSuperClass(buf, imports);
-  //		writeSuperInterfaces(buf, imports);	
-  //		buf.append('{');
-  //		buf.append(lineDelimiter);
-  //		buf.append(lineDelimiter);
-  //		buf.append('}');
-  //		buf.append(lineDelimiter);
-  //		return buf.toString();
-  //	}
+  	private String constructTypeStub(String lineDelimiter) { // ImportsManager imports, String lineDelimiter) {	
+  		StringBuffer buf= new StringBuffer();
+  			
+  		int modifiers= getModifiers();
+  		buf.append(Flags.toString(modifiers));
+  		if (modifiers != 0) {
+  			buf.append(' ');
+  		}
+  		buf.append(fIsClass ? "class " : "interface "); //$NON-NLS-2$ //$NON-NLS-1$
+  		buf.append(getTypeName());
+//  		writeSuperClass(buf, imports);
+//  		writeSuperInterfaces(buf, imports);	
+  		buf.append('{');
+  		buf.append(lineDelimiter);
+  		buf.append(lineDelimiter);
+  		buf.append('}');
+  		buf.append(lineDelimiter);
+  		return buf.toString();
+  	}
 
   /**
    * @deprecated Overwrite createTypeMembers(IType, IImportsManager, IProgressMonitor) instead
@@ -1582,24 +1585,24 @@ public abstract class NewTypeWizardPage extends NewContainerWizardPage {
    * @return the type comment or <code>null</code> if a type comment 
    * is not desired
    */
-  //	protected String getTypeComment(ICompilationUnit parentCU) {
-  //		if (PreferenceConstants.getPreferenceStore().getBoolean(PreferenceConstants.CODEGEN_ADD_COMMENTS)) {
-  //			try {
-  //				StringBuffer typeName= new StringBuffer();
-  //				if (isEnclosingTypeSelected()) {
-  //					typeName.append(JavaModelUtil.getTypeQualifiedName(getEnclosingType())).append('.');
-  //				}
-  //				typeName.append(getTypeName());
-  //				String comment= CodeGeneration.getTypeComment(parentCU, typeName.toString(), String.valueOf('\n'));
-  //				if (comment != null && isValidComment(comment)) {
-  //					return comment;
-  //				}
-  //			} catch (CoreException e) {
-  //				PHPeclipsePlugin.log(e);
-  //			}
-  //		}
-  //		return null;
-  //	}
+  	protected String getTypeComment(ICompilationUnit parentCU) {
+  		if (PreferenceConstants.getPreferenceStore().getBoolean(PreferenceConstants.CODEGEN_ADD_COMMENTS)) {
+  			try {
+  				StringBuffer typeName= new StringBuffer();
+  				if (isEnclosingTypeSelected()) {
+  					typeName.append(JavaModelUtil.getTypeQualifiedName(getEnclosingType())).append('.');
+  				}
+  				typeName.append(getTypeName());
+  				String comment= CodeGeneration.getTypeComment(parentCU, typeName.toString(), String.valueOf('\n'));
+  				if (comment != null && isValidComment(comment)) {
+  					return comment;
+  				}
+  			} catch (CoreException e) {
+  				PHPeclipsePlugin.log(e);
+  			}
+  		}
+  		return null;
+  	}
 
   /**
    * @deprecated Use getTemplate(String,ICompilationUnit,int)
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/PHPeclipsePlugin.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/PHPeclipsePlugin.java
index 341a36a..b0b2811 100644
--- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/PHPeclipsePlugin.java
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/PHPeclipsePlugin.java
@@ -31,6 +31,7 @@ import net.sourceforge.phpdt.externaltools.internal.model.ColorManager;
 import net.sourceforge.phpdt.externaltools.internal.model.ExternalToolsPlugin;
 import net.sourceforge.phpdt.internal.core.BatchOperation;
 import net.sourceforge.phpdt.internal.core.JavaModelManager;
+import net.sourceforge.phpdt.internal.corext.template.php.CodeTemplateContextType;
 import net.sourceforge.phpdt.internal.corext.template.php.HTMLContextType;
 import net.sourceforge.phpdt.internal.corext.template.php.JavaContextType;
 import net.sourceforge.phpdt.internal.corext.template.php.JavaDocContextType;
@@ -1530,7 +1531,7 @@ public class PHPeclipsePlugin extends AbstractUIPlugin implements
 		if (fCodeTemplateContextTypeRegistry == null) {
 			fCodeTemplateContextTypeRegistry= new ContributionContextTypeRegistry();
 			
-//			CodeTemplateContextType.registerContextTypes(fCodeTemplateContextTypeRegistry);
+			CodeTemplateContextType.registerContextTypes(fCodeTemplateContextTypeRegistry);
 		}
 
 		return fCodeTemplateContextTypeRegistry;
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/wizards/PHPFileWizard.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/wizards/PHPFileWizard.java
index d172145..ea1a3fb 100644
--- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/wizards/PHPFileWizard.java
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/wizards/PHPFileWizard.java
@@ -17,6 +17,11 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.lang.reflect.InvocationTargetException;
 
+import net.sourceforge.phpdt.internal.corext.codemanipulation.StubUtility;
+import net.sourceforge.phpdt.internal.corext.template.php.CodeTemplateContext;
+import net.sourceforge.phpdt.internal.corext.template.php.CodeTemplateContextType;
+import net.sourceforge.phpeclipse.PHPeclipsePlugin;
+
 import org.eclipse.core.resources.IContainer;
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IResource;
@@ -29,12 +34,14 @@ import org.eclipse.core.runtime.Path;
 import org.eclipse.core.runtime.Status;
 import org.eclipse.jface.dialogs.MessageDialog;
 import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.text.templates.Template;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.wizard.Wizard;
 import org.eclipse.ui.INewWizard;
 import org.eclipse.ui.IWorkbench;
 import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWizard;
 import org.eclipse.ui.PartInitException;
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.ide.IDE;
@@ -177,20 +184,36 @@ public class PHPFileWizard extends Wizard implements INewWizard {
    * We will initialize file contents with a sample text.
    */
   private InputStream openContentStream() {
-    StringBuffer contents = new StringBuffer("<?php\n\n");
-    contents.append("function f0() {\n\n");
-    contents.append("}\n\n");
-    contents.append("function f1() {\n\n");
-    contents.append("}\n\n");
-    contents.append("switch($func) {\n");
-    contents.append("    case \"f1\":\n");
-    contents.append("    f1();\n");
-    contents.append("    break;\n\n");
-    contents.append("    default:\n");
-    contents.append("    f0();\n");
-    contents.append("    break;\n\n");
-    contents.append("}\n\n?>");
-    return new ByteArrayInputStream(contents.toString().getBytes());
+	try {
+    Template template= PHPeclipsePlugin.getDefault().getCodeTemplateStore().findTemplate(CodeTemplateContextType.NEWTYPE);
+	if (template == null) {
+		return null;
+	}
+	String lineDelimiter = System.getProperty("line.separator", "\n"); //$NON-NLS-1$ //$NON-NLS-2$
+	CodeTemplateContext context= new CodeTemplateContext(template.getContextTypeId(), null, lineDelimiter);
+//	context.setCompilationUnitVariables(cu);
+
+
+    return new ByteArrayInputStream(StubUtility.evaluateTemplate(context, template).getBytes());
+  } catch (CoreException e) {
+    e.printStackTrace();
+    return null;
+  }
+    
+//    StringBuffer contents = new StringBuffer("<?php\n\n");
+//    contents.append("function f0() {\n\n");
+//    contents.append("}\n\n");
+//    contents.append("function f1() {\n\n");
+//    contents.append("}\n\n");
+//    contents.append("switch($func) {\n");
+//    contents.append("    case \"f1\":\n");
+//    contents.append("    f1();\n");
+//    contents.append("    break;\n\n");
+//    contents.append("    default:\n");
+//    contents.append("    f0();\n");
+//    contents.append("    break;\n\n");
+//    contents.append("}\n\n?>");
+//    return new ByteArrayInputStream(contents.toString().getBytes());
   }
 
   private void throwCoreException(String message) throws CoreException {
diff --git a/net.sourceforge.phpeclipse/templates/default-codetemplates.xml b/net.sourceforge.phpeclipse/templates/default-codetemplates.xml
index 645b950..45d2b09 100644
--- a/net.sourceforge.phpeclipse/templates/default-codetemplates.xml
+++ b/net.sourceforge.phpeclipse/templates/default-codetemplates.xml
@@ -45,16 +45,15 @@
  * ${see_to_overridden}
  */</template>
 
-<template name="newtype" id="net.sourceforge.phpdt.ui.text.codetemplates.newtype" description="%CodeTemplates.newfile" context="newtype_context" enabled="true">/*
+<template name="newtype" id="net.sourceforge.phpdt.ui.text.codetemplates.newtype" description="%CodeTemplates.newfile" context="newtype_context" enabled="true">&lt;?php
+/*
  * %CodeTemplates.newfile.content1
  *
- * ${todo} %CodeTemplates.newfile.content2
+ * %CodeTemplates.newfile.content2
  * %CodeTemplates.newfile.content3
  */
-${package_declaration}
-
-${typecomment}
-${type_declaration}</template>
+?&gt;
+</template>
 
 <template name="catchblock" id="net.sourceforge.phpdt.ui.text.codetemplates.catchblock" description="%CodeTemplates.catchblock" context="catchblock_context" enabled="true">// ${todo} %CodeTemplates.catchblock.tododesc
 ${exception_var}.printStackTrace();</template>
@@ -64,7 +63,7 @@ ${body_statement}</template>
 
 <template name="constructorbody" id="net.sourceforge.phpdt.ui.text.codetemplates.constructorbody" description="%CodeTemplates.constructorstub" context="constructorbody_context" enabled="true">${body_statement}
 // ${todo} %CodeTemplates.constructorstub.tododesc</template>
-
+ 
 <template name="getterbody" id="net.sourceforge.phpdt.ui.text.codetemplates.getterbody" description="%CodeTemplates.getterstub" context="getterbody_context" enabled="true">return ${field};</template>
 
 <template name="setterbody" id="net.sourceforge.phpdt.ui.text.codetemplates.setterbody" description="%CodeTemplates.setterstub" context="setterbody_context" enabled="true">${field} = ${param};</template>
diff --git a/net.sourceforge.phpeclipse/templates/default-templates.properties b/net.sourceforge.phpeclipse/templates/default-templates.properties
index ca68397..a0c3f56 100644
--- a/net.sourceforge.phpeclipse/templates/default-templates.properties
+++ b/net.sourceforge.phpeclipse/templates/default-templates.properties
@@ -134,7 +134,7 @@ CodeTemplates.overridecomment.nonjd=(non-Javadoc)
 # ! Do not translate ${date} !
 CodeTemplates.newfile.content1=Created on ${date}
 CodeTemplates.newfile.content2=To change the template for this generated file go to
-CodeTemplates.newfile.content3=Window - Preferences - Java - Code Style - Code Templates
+CodeTemplates.newfile.content3=Window - Preferences - PHPeclipse - PHP - Code Templates
 
 CodeTemplates.catchblock.tododesc=Auto-generated catch block
 CodeTemplates.methodstub.tododesc=Auto-generated method stub