diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/src/org/eclipse/jst/j2ee/ejb/annotations/internal/classgen/EjbBuilder.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/src/org/eclipse/jst/j2ee/ejb/annotations/internal/classgen/EjbBuilder.java
index a150694..1e8adef 100644
--- a/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/src/org/eclipse/jst/j2ee/ejb/annotations/internal/classgen/EjbBuilder.java
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/src/org/eclipse/jst/j2ee/ejb/annotations/internal/classgen/EjbBuilder.java
@@ -10,17 +10,12 @@
 package org.eclipse.jst.j2ee.ejb.annotations.internal.classgen;
 
 import java.util.HashSet;
-import java.util.Iterator;
 
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IConfigurationElement;
 import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.InvalidRegistryObjectException;
 import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Platform;
 import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.emf.codegen.jmerge.JControlModel;
-import org.eclipse.emf.codegen.jmerge.JMerger;
 import org.eclipse.jdt.core.IBuffer;
 import org.eclipse.jdt.core.ICompilationUnit;
 import org.eclipse.jdt.core.IPackageFragment;
@@ -29,348 +24,131 @@
 import org.eclipse.jdt.core.IType;
 import org.eclipse.jdt.core.JavaCore;
 import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.core.ToolFactory;
 import org.eclipse.jdt.core.compiler.IProblem;
 import org.eclipse.jdt.core.dom.AST;
-import org.eclipse.jdt.core.dom.ASTNode;
 import org.eclipse.jdt.core.dom.ASTParser;
-import org.eclipse.jdt.core.dom.ASTVisitor;
 import org.eclipse.jdt.core.dom.CompilationUnit;
-import org.eclipse.jdt.core.dom.Javadoc;
-import org.eclipse.jdt.core.dom.MethodDeclaration;
-import org.eclipse.jdt.core.dom.SingleVariableDeclaration;
-import org.eclipse.jdt.core.dom.TagElement;
-import org.eclipse.jdt.core.dom.TypeDeclaration;
 import org.eclipse.jdt.core.dom.rewrite.ImportRewrite;
 import org.eclipse.jdt.core.formatter.CodeFormatter;
-import org.eclipse.jdt.internal.corext.codemanipulation.StubUtility;
-import org.eclipse.jdt.internal.corext.util.CodeFormatterUtil;
-import org.eclipse.jdt.internal.corext.util.JavaModelUtil;
-import org.eclipse.jdt.internal.ui.preferences.JavaPreferencesSettings;
 import org.eclipse.jdt.ui.CodeGeneration;
-import org.eclipse.jdt.ui.PreferenceConstants;
-import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jdt.ui.CodeStyleConfiguration;
 import org.eclipse.jface.text.Document;
 import org.eclipse.jface.text.IDocument;
-import org.eclipse.jst.j2ee.ejb.annotation.internal.model.IEnterpriseBean;
 import org.eclipse.text.edits.TextEdit;
 
-
-
-
 public class EjbBuilder {
 
 	protected IProgressMonitor monitor;
+
 	protected IPackageFragmentRoot packageFragmentRoot;
+
 	protected String packageName = "";
+
 	protected String typeName = "";
+
 	protected String typeStub;
+
 	protected String typeComment;
+
 	protected String methodStub;
+
 	protected String fields;
+
 	protected IConfigurationElement configurationElement;
-	protected JControlModel mergeOptions;
 
-	protected IEnterpriseBean enterpriseBeanDelegate; 
-	
-	/**
-	 * @return Returns the mergeOptions.
-	 * @throws CoreException 
-	 * @throws InvalidRegistryObjectException 
-	 */
-	public JControlModel getMergeOptions() throws InvalidRegistryObjectException, CoreException {
-		if (mergeOptions == null) {
-			if(getConfigurationElement() != null){
-				String declaringPlugin = getConfigurationElement().getDeclaringExtension().getNamespace();
-				String uri = Platform.getBundle(declaringPlugin).getEntry("/ejb-merge.xml").toString();
-				mergeOptions = new JControlModel(uri);
-				
-			}else{
-				mergeOptions = new JControlModel("");
-			}
-		}
+	IType fCreatedType;
 
-		return mergeOptions;
-	}
-	/**
-	 * @param mergeOptions The mergeOptions to set.
-	 */
-	public void setMergeOptions(JControlModel mergeOptions) {
-		this.mergeOptions = mergeOptions;
-	}
-	IType fCreatedType ;
-	
 	public EjbBuilder() {
 		super();
 	}
-	
-	public String merge(String sourceSrc, String targetSrc) throws InvalidRegistryObjectException, CoreException 
-	{
 
-		if(targetSrc == null || targetSrc.length() == 0)
-			return sourceSrc;
-		
-		String modifiedTargetSrc = insertMissingComments(sourceSrc, targetSrc);
-	
-			
-        JMerger jMerger = new JMerger();
-        jMerger.setControlModel(getMergeOptions());
-        jMerger.setSourceCompilationUnit(jMerger.createCompilationUnitForContents(sourceSrc));
-        jMerger.setTargetCompilationUnit(jMerger.createCompilationUnitForContents(modifiedTargetSrc));
-        jMerger.merge();
-        
-        return jMerger.getTargetCompilationUnitContents();
-
-	}
-	
-	/**
-	 * @param sourceSrc
-	 * @param targetSrc
-	 */
-	private String insertMissingComments(String sourceSrc, String targetSrc) {
-		// EMF JMerge does not transfer non-existent member comments
-		// without e-completely overwriting the memeber.  This phase 
-		// makes sure that if the target member has no comment, source
-		// comment is inserted before the merge
-		IDocument document = new Document(targetSrc);
-		ASTParser sourceParser = ASTParser.newParser(AST.JLS3);
-		sourceParser.setSource(sourceSrc.toCharArray());
-		final CompilationUnit sourceAst = (CompilationUnit) sourceParser.createAST(null);
-		ASTParser targetParser = ASTParser.newParser(AST.JLS3);
-		targetParser.setSource(targetSrc.toCharArray());
-		final CompilationUnit targetAst = (CompilationUnit) targetParser.createAST(null);
-		targetAst.recordModifications();
-		
-		class InsertComments extends ASTVisitor {
-			public InsertComments() {
-				super(true);
-			}
-	
-			public boolean visit(TypeDeclaration type) {
-				Javadoc javadoc = type.getJavadoc();
-				if( !isGenerated(javadoc)){
-					Javadoc srcJavaDoc = getTypeJavaDoc(sourceAst,type);
-					Javadoc newJavadoc = (Javadoc) ASTNode.copySubtree(targetAst.getAST(), srcJavaDoc);
-					type.setJavadoc(newJavadoc);
-				}
-				return true;
-			}
-	
-
-			public boolean visit(MethodDeclaration node) {
-				Javadoc javadoc = node.getJavadoc();
-				if( !isGenerated(javadoc) ){
-					Javadoc srcJavaDoc = getMethodJavaDoc(sourceAst,node);
-					Javadoc newJavadoc = (Javadoc) ASTNode.copySubtree(targetAst.getAST(), srcJavaDoc);
-					node.setJavadoc(newJavadoc);
-				}				
-				return true;
-			}
-
-
-		}
-	
-		targetAst.accept(new InsertComments());
-		
-//		ASTRewrite rewriter = ASTRewrite.create(targetAst.getAST());
-//		rewriter.
-		TextEdit edit = targetAst.rewrite(document, JavaCore.getOptions());
-		try {
-			edit.apply(document);
-		} catch (Exception e) {
-				e.printStackTrace();
-		}
-		return document.get();
-
-	}
-	
-    /**
-     * @param javadoc
-     * @return
-     */
-    private boolean isGenerated(Javadoc javadoc) {
-        if( javadoc == null)
-            return false;
-        Iterator tags = javadoc.tags().iterator();
-        while (tags.hasNext()) {
-            TagElement	tag = (TagElement) tags.next();
-            if( tag.getTagName() != null && tag.getTagName().equals("@generated") )
-                return true;
-        }
-        return false;
-    }	
-	private Javadoc getTypeJavaDoc(CompilationUnit cu, TypeDeclaration decl) {
-		
-		class TypeFinder extends ASTVisitor {
-			String name;
-			TypeDeclaration found = null;
-			
-			TypeFinder(String searchName,boolean visitDocTags)
-			{
-				super(visitDocTags);
-				name = searchName;
-			}
-			
-			public TypeDeclaration getType()
-			{
-				return found;
-			}
-
-			public boolean visit(TypeDeclaration type) {
-				if(found == null)
-				{
-					if( name.equals( type.getName().getFullyQualifiedName() )){
-						found = type;
-					}
-				}
-				return true;
-			}
-
-			public boolean visit(MethodDeclaration node) {
-				return true;
-			}
-		}
-		
-		TypeFinder finder = new TypeFinder(decl.getName().getFullyQualifiedName(),true);
-		cu.accept(finder);
-		TypeDeclaration declaration = finder.getType();
-		return (declaration == null ? null : declaration.getJavadoc());
-	}
-	private Javadoc getMethodJavaDoc(CompilationUnit cu, MethodDeclaration decl) {
-		
-		String srcFakeSignature = this.makeSignature(decl);
-		class MethodFinder extends ASTVisitor {
-			String name;
-			MethodDeclaration found = null;
-			
-			MethodFinder(String searchName,boolean visitDocTags)
-			{
-				super(visitDocTags);
-				name = searchName;
-			}
-			
-			public MethodDeclaration getMethod()
-			{
-				return found;
-			}
-
-			public boolean visit(TypeDeclaration type) {
-				
-				return true;
-			}
-
-			public boolean visit(MethodDeclaration node) {
-				if(found == null)
-				{
-					String signature = makeSignature(node);
-					if( name.equals(signature)){
-						found = node;
-					}
-				}				
-				return true;
-			}
-		}
-		
-		MethodFinder finder = new MethodFinder(srcFakeSignature,true);
-		cu.accept(finder);
-		MethodDeclaration declaration = finder.getMethod();
-		return (declaration == null ? null : declaration.getJavadoc());
-	}
-	
-	/**
-	 * @param decl
-	 * @return
-	 */
-	private String makeSignature(MethodDeclaration decl) {
-		
-		String signature = ""+decl.getReturnType2();
-		signature += decl.getName().getFullyQualifiedName();
-		Iterator params = decl.parameters().iterator();
-		while (params.hasNext()) {
-			SingleVariableDeclaration var = (SingleVariableDeclaration) params.next();
-			signature += "_"+var.getType();
-			
-		}
-		return signature;
-	}
 	/**
 	 * Creates the new type using the entered field values.
 	 * 
-	 * @param monitor a progress monitor to report progress.
+	 * @param monitor
+	 *            a progress monitor to report progress.
 	 */
-	public void createType() throws CoreException, InterruptedException {		
+	public void createType() throws CoreException, InterruptedException {
 		monitor = getMonitor();
-		
+
 		monitor.beginTask("Creating a new type", 10);
-		
-		ICompilationUnit createdWorkingCopy= null;
+
+		ICompilationUnit createdWorkingCopy = null;
 		try {
-			IPackageFragmentRoot root= getPackageFragmentRoot();  // Current source folder
-			IPackageFragment pack= root.createPackageFragment(this.packageName,true,monitor);    // Package that contains the class			
+			IPackageFragmentRoot root = getPackageFragmentRoot(); // Current
+			// source
+			// folder
+			IPackageFragment pack = root.createPackageFragment(this.packageName, true, monitor); // Package
+			// that
+			// contains
+			// the class
 			monitor.worked(1);
-			
-			String clName= this.typeName;
-			
+
+			String clName = this.typeName;
+
 			IType createdType;
 			ImportsManager imports;
-			int indent= 0;
-	
+			int indent = 0;
 
-			
-			String lineDelimiter= null;	
-			lineDelimiter= System.getProperty("line.separator", "\n"); //$NON-NLS-1$ //$NON-NLS-2$
-					
-			ICompilationUnit parentCU= pack.getCompilationUnit(clName + ".java");
-			if(!parentCU.exists())
-			  parentCU= pack.createCompilationUnit(clName + ".java", "", false, new SubProgressMonitor(monitor, 2)); //$NON-NLS-1$ //$NON-NLS-2$
-			String targetSource = parentCU.getSource();
-			
+			String lineDelimiter = null;
+			lineDelimiter = System.getProperty("line.separator", "\n"); //$NON-NLS-1$ //$NON-NLS-2$
+
+			ICompilationUnit parentCU = pack.getCompilationUnit(clName + ".java");
+			if (!parentCU.exists())
+				parentCU = pack.createCompilationUnit(clName + ".java", "", false, new SubProgressMonitor(monitor, 2)); //$NON-NLS-1$ //$NON-NLS-2$
+
 			// create a working copy with a new owner
-			createdWorkingCopy= parentCU.getWorkingCopy(null);
-			
+			createdWorkingCopy = parentCU.getWorkingCopy(null);
+
 			// use the compiler template a first time to read the imports
-			String content= CodeGeneration.getCompilationUnitContent(createdWorkingCopy, null, "", lineDelimiter); //$NON-NLS-1$
+			String content = CodeGeneration.getCompilationUnitContent(createdWorkingCopy, null, "", lineDelimiter); //$NON-NLS-1$
 			if (content != null) {
 				createdWorkingCopy.getBuffer().setContents(content);
 			}
-							
-			imports= new ImportsManager(createdWorkingCopy);
-			// add an import that will be removed again. Having this import solves 14661
-			imports.addImport(JavaModelUtil.concatenateName(pack.getElementName(), this.typeName));
-			
+
+			imports = new ImportsManager(createdWorkingCopy);
+
 			String cuContent = content + lineDelimiter + typeComment + lineDelimiter + typeStub;
 			createdWorkingCopy.getBuffer().setContents(cuContent);
-			createdType= createdWorkingCopy.getType(clName);
-			
-			// add imports for superclass/interfaces, so types can be resolved correctly
-			ICompilationUnit cu= createdType.getCompilationUnit();	
-			boolean needsSave= !cu.isWorkingCopy();
-			imports.create(cu,true);
-	
-			JavaModelUtil.reconcile(cu);
-		
+			createdType = createdWorkingCopy.getType(clName);
+
+			// add imports for superclass/interfaces, so types can be resolved
+			// correctly
+			ICompilationUnit cu = createdType.getCompilationUnit();
+			imports.create(cu, true);
+
+			cu.reconcile(ICompilationUnit.NO_AST, false, null, null);
+
 			createTypeMembers(createdType, imports, new SubProgressMonitor(monitor, 1));
-	
+
 			// add imports
-			imports.create(cu,true);
-			
+			imports.create(cu, true);
+
 			if (removeUnused(cu, imports)) {
-				imports.create(cu,true);
+				imports.create(cu, true);
 			}
-			
-			JavaModelUtil.reconcile(cu);
-			
-			ISourceRange range= createdType.getSourceRange();
-			
-			IBuffer buf= cu.getBuffer();
-			String originalContent= buf.getText(range.getOffset(), range.getLength());
-			
-			String formattedContent= CodeFormatterUtil.format(CodeFormatter.K_CLASS_BODY_DECLARATIONS, originalContent, indent, null, lineDelimiter, pack.getJavaProject()); 
+
+			cu.reconcile(ICompilationUnit.NO_AST, false, null, null);
+
+			ISourceRange range = createdType.getSourceRange();
+
+			IBuffer buf = cu.getBuffer();
+			String originalContent = buf.getText(range.getOffset(), range.getLength());
+			CodeFormatter codeFormatter = ToolFactory.createCodeFormatter(JavaCore.getOptions());
+			TextEdit textEdit = codeFormatter.format(CodeFormatter.K_CLASS_BODY_DECLARATIONS, originalContent, 0, originalContent
+					.length(), indent, lineDelimiter);
+			IDocument document = new Document(originalContent);
+			try {
+				textEdit.apply(document);
+			} catch (Exception e) {
+			}
+			String formattedContent = document.get();
+
 			buf.replace(range.getOffset(), range.getLength(), formattedContent);
 			cu.getBuffer().setContents(buf.getContents());
-			String merged = merge(cu.getBuffer().getContents(),targetSource);
-			cu.getBuffer().setContents(merged);
 			cu.commitWorkingCopy(false, new SubProgressMonitor(monitor, 1));
-			 
+
 			fCreatedType = (IType) createdType.getPrimaryElement();
 
 		} finally {
@@ -379,17 +157,17 @@
 			}
 			monitor.done();
 		}
-	}	
-	
+	}
+
 	/**
 	 * @param createdType
 	 * @param imports
 	 * @param monitor2
 	 */
 	private void createTypeMembers(IType createdType, ImportsManager imports, SubProgressMonitor monitor2) throws JavaModelException {
-		if( fields != null && fields.length() > 0 )
-			createdType.createField(fields,null, false, this.getMonitor());
-		if( methodStub != null && methodStub.length() > 0 )
+		if (fields != null && fields.length() > 0)
+			createdType.createField(fields, null, false, this.getMonitor());
+		if (methodStub != null && methodStub.length() > 0)
 			createdType.createMethod(methodStub, null, false, this.getMonitor());
 	}
 
@@ -401,17 +179,17 @@
 	}
 
 	private boolean removeUnused(ICompilationUnit cu, ImportsManager imports) {
-		ASTParser parser= ASTParser.newParser(AST.JLS3);
+		ASTParser parser = ASTParser.newParser(AST.JLS3);
 		parser.setSource(cu);
 		parser.setResolveBindings(true);
-		CompilationUnit root= (CompilationUnit) parser.createAST(null);
-		IProblem[] problems= root.getProblems();
-		boolean importRemoved= false;
-		for (int i= 0; i < problems.length; i++) {
+		CompilationUnit root = (CompilationUnit) parser.createAST(null);
+		IProblem[] problems = root.getProblems();
+		boolean importRemoved = false;
+		for (int i = 0; i < problems.length; i++) {
 			if (problems[i].getID() == IProblem.UnusedImport) {
-				String imp= problems[i].getArguments()[0];
+				String imp = problems[i].getArguments()[0];
 				imports.removeImport(imp);
-				importRemoved=true;
+				importRemoved = true;
 			}
 		}
 		return importRemoved;
@@ -422,61 +200,50 @@
 	 */
 	public IProgressMonitor getMonitor() {
 		if (monitor == null) {
-			monitor= new NullProgressMonitor();
+			monitor = new NullProgressMonitor();
 		}
 		return monitor;
 	}
+
 	/**
-	 * @param monitor The monitor to set.
+	 * @param monitor
+	 *            The monitor to set.
 	 */
 	public void setMonitor(IProgressMonitor monitor) {
 		this.monitor = monitor;
 	}
-	
+
 	public static class ImportsManager {
 
 		private ImportRewrite fImportsStructure;
+
 		private HashSet fAddedTypes;
 
-		/* package */ ImportsManager(ICompilationUnit createdWorkingCopy) throws CoreException {
-			IPreferenceStore store= PreferenceConstants.getPreferenceStore();
-			String[] prefOrder= JavaPreferencesSettings.getImportOrderPreference(createdWorkingCopy.getPrimaryElement().getJavaProject());
-			int threshold= JavaPreferencesSettings.getImportNumberThreshold(createdWorkingCopy.getPrimaryElement().getJavaProject());			
-			fAddedTypes= new HashSet();
-			
-			fImportsStructure= StubUtility.createImportRewrite(createdWorkingCopy, true);
+		ImportsManager(ICompilationUnit createdWorkingCopy) throws CoreException {
+			fAddedTypes = new HashSet();
+			fImportsStructure = CodeStyleConfiguration.createImportRewrite(createdWorkingCopy, true);
 		}
 
-		/* package */ ImportRewrite getImportsStructure() {
+		/* package */ImportRewrite getImportsStructure() {
 			return fImportsStructure;
 		}
-				
-		/**
-		 * Adds a new import declaration that is sorted in the existing imports.
-		 * If an import already exists or the import would conflict with another import
-		 * of an other type with the same simple name  the import is not added.
-		 * 
-		 * @param qualifiedTypeName The fully qualified name of the type to import
-		 * (dot separated)
-		 * @return Returns the simple type name that can be used in the code or the
-		 * fully qualified type name if an import conflict prevented the import
-		 */				
+
 		public String addImport(String qualifiedTypeName) {
 			fAddedTypes.add(qualifiedTypeName);
 			return fImportsStructure.addImport(qualifiedTypeName);
 		}
-		
-		/* package */ void create(ICompilationUnit cu, boolean toRestore) throws CoreException {
-			fImportsStructure.create(cu, toRestore);
+
+		void create(ICompilationUnit cu, boolean toRestore) throws CoreException {
+			ImportRewrite.create(cu, toRestore);
 		}
-		
-		/* package */ void removeImport(String qualifiedName) {
+
+		void removeImport(String qualifiedName) {
 			if (fAddedTypes.contains(qualifiedName)) {
 				fImportsStructure.removeImport(qualifiedName);
 			}
 		}
-		
-	}	
+
+	}
 
 	/**
 	 * @return Returns the fCreatedType.
@@ -484,113 +251,126 @@
 	public IType getCreatedType() {
 		return fCreatedType;
 	}
+
 	/**
-	 * @param createdType The fCreatedType to set.
+	 * @param createdType
+	 *            The fCreatedType to set.
 	 */
 	public void setCreatedType(IType createdType) {
 		fCreatedType = createdType;
 	}
+
 	/**
 	 * @return Returns the methodStub.
 	 */
 	public String getMethodStub() {
 		return methodStub;
 	}
+
 	/**
-	 * @param methodStub The methodStub to set.
+	 * @param methodStub
+	 *            The methodStub to set.
 	 */
 	public void setMethodStub(String methodStub) {
 		this.methodStub = methodStub;
 	}
+
 	/**
 	 * @return Returns the packageName.
 	 */
 	public String getPackageName() {
 		return packageName;
 	}
+
 	/**
-	 * @param packageName The packageName to set.
+	 * @param packageName
+	 *            The packageName to set.
 	 */
 	public void setPackageName(String packageName) {
 		this.packageName = packageName;
 	}
+
 	/**
 	 * @return Returns the typeComment.
 	 */
 	public String getTypeComment() {
 		return typeComment;
 	}
+
 	/**
-	 * @param typeComment The typeComment to set.
+	 * @param typeComment
+	 *            The typeComment to set.
 	 */
 	public void setTypeComment(String typeComment) {
 		this.typeComment = typeComment;
 	}
+
 	/**
 	 * @return Returns the typeName.
 	 */
 	public String getTypeName() {
 		return typeName;
 	}
+
 	/**
-	 * @param typeName The typeName to set.
+	 * @param typeName
+	 *            The typeName to set.
 	 */
 	public void setTypeName(String typeName) {
 		this.typeName = typeName;
 	}
+
 	/**
 	 * @return Returns the typeStub.
 	 */
 	public String getTypeStub() {
 		return typeStub;
 	}
+
 	/**
-	 * @param typeStub The typeStub to set.
+	 * @param typeStub
+	 *            The typeStub to set.
 	 */
 	public void setTypeStub(String typeStub) {
 		this.typeStub = typeStub;
 	}
+
 	/**
-	 * @param packageFragmentRoot The packageFragmentRoot to set.
+	 * @param packageFragmentRoot
+	 *            The packageFragmentRoot to set.
 	 */
 	public void setPackageFragmentRoot(IPackageFragmentRoot packageFragmentRoot) {
 		this.packageFragmentRoot = packageFragmentRoot;
 	}
+
 	/**
 	 * @return Returns the fields.
 	 */
 	public String getFields() {
 		return fields;
 	}
+
 	/**
-	 * @param fields The fields to set.
+	 * @param fields
+	 *            The fields to set.
 	 */
 	public void setFields(String fields) {
 		this.fields = fields;
 	}
+
 	/**
 	 * @return Returns the configurationElement.
 	 */
 	public IConfigurationElement getConfigurationElement() {
 		return configurationElement;
 	}
+
 	/**
-	 * @param configurationElement The configurationElement to set.
+	 * @param configurationElement
+	 *            The configurationElement to set.
 	 */
-	public void setConfigurationElement(
-			IConfigurationElement configurationElement) {
+	public void setConfigurationElement(IConfigurationElement configurationElement) {
 		this.configurationElement = configurationElement;
 	}
-	/**
-	 * @return Returns the IEnterpriseBeanDelegate.
-	 */
-	public IEnterpriseBean getEnterpriseBeanDelegate() {
-		return enterpriseBeanDelegate;
-	}
-	/**
-	 * @param IEnterpriseBeanDelegate The IEnterpriseBeanDelegate to set.
-	 */
-	public void setEnterpriseBeanDelegate(IEnterpriseBean delegate) {
-		this.enterpriseBeanDelegate = delegate;
-	}
+
 }
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/src/org/eclipse/jst/j2ee/ejb/annotations/internal/emitter/EjbEmitter.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/src/org/eclipse/jst/j2ee/ejb/annotations/internal/emitter/EjbEmitter.java
index 5dfce02..2871d60 100644
--- a/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/src/org/eclipse/jst/j2ee/ejb/annotations/internal/emitter/EjbEmitter.java
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/src/org/eclipse/jst/j2ee/ejb/annotations/internal/emitter/EjbEmitter.java
@@ -24,17 +24,23 @@
 
 public abstract class EjbEmitter {
 	public static final String CLASSPATHPROVIDER = "classpathProvider";
+
 	public static final String JAVACLASSPATHVARIABLEPREFIX = "WTPEJBEMITTER";
+
 	public static final String EJBEMITTERPROJECT = ".WtpEjbEmitter";
+
 	protected IConfigurationElement emitterConfig;
+
 	protected IEmitterClasspathProvider classpathProvider;
+
 	protected String base;
+
 	protected IProgressMonitor monitor;
 
 	public EjbEmitter(IConfigurationElement emitterConfig) throws ClassNotFoundException, InstantiationException,
 			IllegalAccessException, CoreException {
 		this.emitterConfig = emitterConfig;
-		String pluginDescriptor = emitterConfig.getDeclaringExtension().getNamespace();
+		String pluginDescriptor = emitterConfig.getDeclaringExtension().getContributor().getName();
 
 		org.osgi.framework.Bundle bundle = Platform.getBundle(pluginDescriptor);
 		Class c = bundle.loadClass(emitterConfig.getAttribute(CLASSPATHPROVIDER));
@@ -82,8 +88,7 @@
 		try {
 			WTPJETEmitter emitter = createJetEmitter(uri);
 			result = emitter.generate(aMonitor, new Object[] { enterpriseBean });
-		}
-		catch (JETException e) {
+		} catch (JETException e) {
 			throw new CoreException(e.getStatus());
 		}
 		return result;
