[305848, 305849] junit tests for mergers and annotation readers.
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/ejb/tests/EjbAnnotationFactoryTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/ejb/tests/EjbAnnotationFactoryTest.java
index 52d1dc4..4474d02 100644
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/ejb/tests/EjbAnnotationFactoryTest.java
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/ejb/tests/EjbAnnotationFactoryTest.java
@@ -20,6 +20,7 @@
 import org.eclipse.jst.javaee.ejb.MessageDrivenBean;
 import org.eclipse.jst.javaee.ejb.RemoveMethodType;
 import org.eclipse.jst.javaee.ejb.SessionBean;
+import org.eclipse.jst.javaee.ejb.SessionType;
 import org.eclipse.jst.javaee.ejb.TransactionType;
 import org.eclipse.jst.jee.model.internal.EjbAnnotationFactory;
 import org.eclipse.jst.jee.model.internal.common.Result;
@@ -137,6 +138,17 @@
 		assertNotNull(sessionBean);
 		assertNull(sessionBean.getTimeoutMethod());
 	}
+	
+	// @Test
+	public void testSingleton() throws Exception {
+		final String beanContent = "package com.sap;"
+				+ "@Singleton public class testSingleton implements SessionBeanLocal{}";
+		IType type = createCompilationUnit("testSingleton", beanContent).findPrimaryType();
+		Result result = fixture.createJavaeeObject(type);
+		SessionBean sessionBean = (SessionBean) result.getMainObject();
+		assertNotNull(sessionBean);
+		assertTrue(sessionBean.getSessionType() == SessionType.SINGLETON_LITERAL);
+	}
 
 	// @Test
 	public void testTransactionManagementBean() throws Exception {
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/mergers/tests/MergersTestSuite.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/mergers/tests/MergersTestSuite.java
index 760910e..5073ef3 100644
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/mergers/tests/MergersTestSuite.java
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/mergers/tests/MergersTestSuite.java
@@ -29,6 +29,7 @@
     	suite.addTestSuite(AssemblyDescriptorMergerTest.class);
     	suite.addTestSuite(JndiRefsTest.class);
     	suite.addTestSuite(WebAppMergerTest.class);
+    	suite.addTestSuite(WebApp3MergerTest.class);
         return suite;
     }
 }
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/mergers/tests/WebApp3MergerTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/mergers/tests/WebApp3MergerTest.java
new file mode 100644
index 0000000..a7c5ba2
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/mergers/tests/WebApp3MergerTest.java
@@ -0,0 +1,1201 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.mergers.tests;
+
+import java.util.List;
+
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
+import org.eclipse.jst.javaee.core.JavaeeFactory;
+import org.eclipse.jst.javaee.core.ParamValue;
+import org.eclipse.jst.javaee.core.RunAs;
+import org.eclipse.jst.javaee.core.SecurityRole;
+import org.eclipse.jst.javaee.core.UrlPatternType;
+import org.eclipse.jst.javaee.web.AuthConstraint;
+import org.eclipse.jst.javaee.web.Filter;
+import org.eclipse.jst.javaee.web.FilterMapping;
+import org.eclipse.jst.javaee.web.SecurityConstraint;
+import org.eclipse.jst.javaee.web.Servlet;
+import org.eclipse.jst.javaee.web.ServletMapping;
+import org.eclipse.jst.javaee.web.TransportGuaranteeType;
+import org.eclipse.jst.javaee.web.UserDataConstraint;
+import org.eclipse.jst.javaee.web.WebApp;
+import org.eclipse.jst.javaee.web.WebFactory;
+import org.eclipse.jst.jee.model.internal.mergers.ModelException;
+import org.eclipse.jst.jee.model.internal.mergers.WebApp3Merger;
+
+/**
+ * Tester class for WebAPp artifact.
+ * 
+ * Base suffix means that the base object has some info and 
+ * toMerge is empty: nothing should be merged
+ * 
+ * ToMerge suffix means that the base is empty object and 
+ * toMerge has some info: all from merge should be present in base.
+ * 
+ * Same suffix means that the information in merge and base is one 
+ * and the same: no merge should occurred and additional checks for 
+ * doubling of the elements are present.
+ * 
+ * Complex suffix means variety of information is present in base 
+ * and to merge: consistent information combined by base and toMerge
+ * should be available at the end.
+ * 
+ * ComplexOverlapped suffix means variety of information is present 
+ * in base and to merge: consistent information combined by base and toMerge
+ * should be available at the end. There are artifacts with one and the same 
+ * name and different values: values should be merged into base.
+ *  
+ * 
+ * @author Dimitar Giormov
+ *
+ */
+public class WebApp3MergerTest extends TestCase{
+
+	/**
+	 * Tests the merger with Base security role only.
+	 * No merge is necessary
+	 * 
+	 * @throws ModelException
+	 */
+	//@Test
+	public void testSingleSecurityRoleCaseBase() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		SecurityRole role = JavaeeFactory.eINSTANCE.createSecurityRole();
+		role.setRoleName("test1");
+
+		descriptorBase.getSecurityRoles().add(role);
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertNotNull(descriptorBase.getSecurityRoles());
+		Assert.assertTrue(descriptorBase.getSecurityRoles().size() == 1);
+		Assert.assertTrue(descriptorToMerge.getSecurityRoles().size() == 0);
+		Assert.assertTrue(((SecurityRole)descriptorBase.getSecurityRoles().get(0)).getRoleName().equals("test1"));
+	}
+
+	/**
+	 * Tests the merger with toMerge security role only.
+	 * The role should be copied in base.
+	 * 
+	 * @throws ModelException
+	 */
+	//@Test
+	public void testSingleSecurityRoleCaseToMerge() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		SecurityRole role = JavaeeFactory.eINSTANCE.createSecurityRole();
+		role.setRoleName("test1");
+
+		descriptorToMerge.getSecurityRoles().add(role);
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertNotNull(descriptorBase.getSecurityRoles());
+		Assert.assertEquals(1, descriptorBase.getSecurityRoles().size());
+		Assert.assertEquals(1, descriptorToMerge.getSecurityRoles().size());
+		Assert.assertTrue(((SecurityRole)descriptorBase.getSecurityRoles().get(0)).getRoleName().equals("test1"));
+	}
+
+	/**
+	 * Tests the merger with one and the same security role.
+	 * The result should be non merged 1 security role.
+	 * 
+	 * @throws ModelException
+	 */
+	//@Test
+	public void testSingleSecurityRoleCaseSameRole() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		SecurityRole role = JavaeeFactory.eINSTANCE.createSecurityRole();
+		role.setRoleName("test1");
+		descriptorBase.getSecurityRoles().add(role);
+		descriptorToMerge.getSecurityRoles().add(role);
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertNotNull(descriptorBase.getSecurityRoles());
+		Assert.assertTrue(descriptorBase.getSecurityRoles().size() == 1);
+		Assert.assertTrue(descriptorToMerge.getSecurityRoles().size() == 1);
+		Assert.assertTrue(((SecurityRole)descriptorBase.getSecurityRoles().get(0)).getRoleName().equals("test1"));
+	}
+
+	/**
+	 * Tests the merger with variety of security roles.
+	 * 
+	 * @throws ModelException
+	 */
+	//@Test
+	public void testSingleSecurityRoleCaseComplex() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		SecurityRole role0 = JavaeeFactory.eINSTANCE.createSecurityRole();
+		SecurityRole role1 = JavaeeFactory.eINSTANCE.createSecurityRole();
+		SecurityRole role2 = JavaeeFactory.eINSTANCE.createSecurityRole();
+		SecurityRole role3 = JavaeeFactory.eINSTANCE.createSecurityRole();
+		SecurityRole role4 = JavaeeFactory.eINSTANCE.createSecurityRole();
+		SecurityRole role5 = JavaeeFactory.eINSTANCE.createSecurityRole();
+		role0.setRoleName("test1");
+		role1.setRoleName("test2");
+		role2.setRoleName("test3");
+		role3.setRoleName("test4");
+		role4.setRoleName("test5");
+		role5.setRoleName("test6");
+
+
+
+		descriptorBase.getSecurityRoles().add(role1);
+		descriptorBase.getSecurityRoles().add(role3);
+		descriptorBase.getSecurityRoles().add(role4);
+		descriptorBase.getSecurityRoles().add(role5);
+
+
+		descriptorToMerge.getSecurityRoles().add(role0);
+		descriptorToMerge.getSecurityRoles().add(role1);
+		descriptorToMerge.getSecurityRoles().add(role2);
+
+
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertNotNull(descriptorBase.getSecurityRoles());
+		Assert.assertTrue(descriptorBase.getSecurityRoles().size() == 6);
+		Assert.assertTrue(descriptorToMerge.getSecurityRoles().size() == 3);
+		Assert.assertTrue(containsSecRole(descriptorBase.getSecurityRoles(), role0.getRoleName()));
+		Assert.assertTrue(containsSecRole(descriptorBase.getSecurityRoles(), role1.getRoleName()));
+		Assert.assertTrue(containsSecRole(descriptorBase.getSecurityRoles(), role2.getRoleName()));
+		Assert.assertTrue(containsSecRole(descriptorBase.getSecurityRoles(), role3.getRoleName()));
+		Assert.assertTrue(containsSecRole(descriptorBase.getSecurityRoles(), role4.getRoleName()));
+		Assert.assertTrue(containsSecRole(descriptorBase.getSecurityRoles(), role5.getRoleName()));
+	}
+
+	private boolean containsSecRole(List list, String roleName) {
+
+
+		for (Object object : list) {
+			SecurityRole role = (SecurityRole) object;
+			if(roleName == null){
+				if(roleName == role.getRoleName()){
+					return true;
+				}
+			} else if(roleName.equals(role.getRoleName())){
+				return true;
+			}
+		}
+		return false;
+	}
+
+
+	/**
+	 * Tests the merger with Base security role only.
+	 * No merge is necessary
+	 * 
+	 * @throws ModelException
+	 */
+	//@Test
+	public void testSingleRunAsCaseBase() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		RunAs role = JavaeeFactory.eINSTANCE.createRunAs();
+		Servlet servletBase = WebFactory.eINSTANCE.createServlet();
+		servletBase.setServletName("servName");
+		Servlet servletMerge = WebFactory.eINSTANCE.createServlet();
+		servletMerge.setServletName("servName");
+		role.setRoleName("test1");
+		servletBase.setRunAs(role);
+
+		descriptorBase.getServlets().add(servletBase);
+		descriptorToMerge.getServlets().add(servletMerge);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertNotNull(servletBase.getRunAs());
+		Assert.assertTrue(((RunAs)servletBase.getRunAs()).getRoleName().equals("test1"));
+	}
+
+	/**
+	 * Tests the merger with toMerge security role only.
+	 * The role should be copied in base.
+	 * 
+	 * @throws ModelException
+	 */
+	//@Test
+	public void testSingleRunAsCaseToMerge() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		RunAs role = JavaeeFactory.eINSTANCE.createRunAs();
+		Servlet servletBase = WebFactory.eINSTANCE.createServlet();
+		servletBase.setServletName("servName");
+		Servlet servletMerge = WebFactory.eINSTANCE.createServlet();
+		servletMerge.setServletName("servName");
+		role.setRoleName("test1");
+		servletMerge.setRunAs(role);
+
+		descriptorBase.getServlets().add(servletBase);
+		descriptorToMerge.getServlets().add(servletMerge);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertNotNull(servletBase.getRunAs());
+		Assert.assertTrue(((RunAs)servletBase.getRunAs()).getRoleName().equals("test1"));
+		Assert.assertEquals(1, descriptorBase.getServlets().size());
+	}
+
+
+	/**
+	 * Tests the merger with null named servlet in toMerge array, the merger should ignore such entries.
+	 * 
+	 * @throws ModelException
+	 */
+	//@Test
+	public void testSingleNullServletToMerge() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		Servlet servletBase = WebFactory.eINSTANCE.createServlet();
+
+		descriptorToMerge.getServlets().add(servletBase);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertEquals(0, descriptorBase.getServlets().size());
+	}
+
+	/**
+	 * Tests the merger with null named servlet in Base, as this is extremely unlikely
+	 * the merger should not stop merging because of such error.
+	 * 
+	 * @throws ModelException
+	 */
+	//@Test
+	public void testSingleNullNamedServletInBase() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		Servlet servletBase = WebFactory.eINSTANCE.createServlet();
+		Servlet servletMerge = WebFactory.eINSTANCE.createServlet();
+		servletMerge.setServletName("servName");
+
+		descriptorBase.getServlets().add(servletBase);
+		descriptorToMerge.getServlets().add(servletMerge);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertEquals(2, descriptorBase.getServlets().size());
+	}
+
+	/**
+	 * Tests the merger with one and the same security role.
+	 * The result should be non merged 1 security role.
+	 * 
+	 * @throws ModelException
+	 */
+	//@Test
+	public void testSingleRunAsCaseSameRole() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		RunAs role = JavaeeFactory.eINSTANCE.createRunAs();
+		Servlet servletBase = WebFactory.eINSTANCE.createServlet();
+		servletBase.setServletName("servName");
+		Servlet servletMerge = WebFactory.eINSTANCE.createServlet();
+		servletMerge.setServletName("servName");
+		role.setRoleName("test1");
+		servletBase.setRunAs(role);
+		servletMerge.setRunAs(role);
+
+		descriptorBase.getServlets().add(servletBase);
+		descriptorToMerge.getServlets().add(servletMerge);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertNotNull(servletBase.getRunAs());
+		Assert.assertTrue(((RunAs)servletBase.getRunAs()).getRoleName().equals("test1"));
+	}
+
+
+
+	/**
+	 * Tests the merger with Base security constraints only.
+	 * No merge is necessary
+	 * 
+	 * @throws ModelException
+	 */
+//	@Test
+	@SuppressWarnings("unchecked")
+	public void testSingleSecurityConstraintCaseBase() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		SecurityConstraint sc = WebFactory.eINSTANCE.createSecurityConstraint();
+		AuthConstraint createAuthConstraint = WebFactory.eINSTANCE.createAuthConstraint();
+		createAuthConstraint.getRoleNames().add("test");
+		sc.setAuthConstraint(createAuthConstraint);
+		UserDataConstraint userDataConstraint = WebFactory.eINSTANCE.createUserDataConstraint();
+		userDataConstraint.setTransportGuarantee(TransportGuaranteeType.CONFIDENTIAL_LITERAL);
+		sc.setUserDataConstraint(userDataConstraint);
+
+		descriptorBase.getSecurityConstraints().add(sc);
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertNotNull(descriptorBase.getSecurityConstraints());
+		Assert.assertTrue(descriptorBase.getSecurityConstraints().size() == 1);
+		Assert.assertTrue(descriptorToMerge.getSecurityConstraints().size() == 0);
+		Assert.assertTrue(((SecurityConstraint)descriptorBase.getSecurityConstraints().get(0)).getAuthConstraint().getRoleNames().get(0).equals("test"));
+	}
+
+	/**
+	 * Tests the merger with toMerge security constraints only.
+	 * The role should be copied in base.
+	 * 
+	 * @throws ModelException
+	 */
+	//@Test
+	public void testSingleSecurityConstraintCaseToMerge() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		SecurityConstraint sc = WebFactory.eINSTANCE.createSecurityConstraint();
+		AuthConstraint createAuthConstraint = WebFactory.eINSTANCE.createAuthConstraint();
+		createAuthConstraint.getRoleNames().add("test");
+		sc.setAuthConstraint(createAuthConstraint);
+		UserDataConstraint userDataConstraint = WebFactory.eINSTANCE.createUserDataConstraint();
+		userDataConstraint.setTransportGuarantee(TransportGuaranteeType.CONFIDENTIAL_LITERAL);
+		sc.setUserDataConstraint(userDataConstraint);
+
+		descriptorBase.getSecurityConstraints().add(sc);
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		WebApp3Merger result = new WebApp3Merger(descriptorToMerge, descriptorBase, 0);
+		result.process();
+		Assert.assertNotNull(descriptorToMerge.getSecurityConstraints());
+		Assert.assertTrue(descriptorToMerge.getSecurityConstraints().size() == 1);
+		Assert.assertTrue(((SecurityConstraint)descriptorToMerge.getSecurityConstraints().get(0)).getAuthConstraint().getRoleNames().get(0).equals("test"));
+	}
+	
+	
+	//@Test
+	public void testSingleServletMappingInBase() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		Servlet servletBase = WebFactory.eINSTANCE.createServlet();
+		Servlet servletMerge = WebFactory.eINSTANCE.createServlet();
+		
+		String sname = "servName";
+		servletBase.setServletName(sname);
+		servletMerge.setServletName(sname);
+		
+		ServletMapping servletMappingBase = WebFactory.eINSTANCE.createServletMapping();
+		UrlPatternType urlPatternType = JavaeeFactory.eINSTANCE.createUrlPatternType();
+		String value = "/1";
+		urlPatternType.setValue(value);
+		
+		servletMappingBase.setServletName(sname);
+		servletMappingBase.getUrlPatterns().add(urlPatternType);
+		
+		descriptorBase.getServletMappings().add(servletMappingBase);
+
+		descriptorBase.getServlets().add(servletBase);
+		descriptorToMerge.getServlets().add(servletMerge);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertEquals(1, descriptorBase.getServletMappings().size());
+		ServletMapping mapping = descriptorBase.getServletMappings().get(0);
+		
+		Assert.assertEquals(sname, mapping.getServletName());
+		
+		Assert.assertEquals(1, mapping.getUrlPatterns().size());
+		Assert.assertEquals(value, mapping.getUrlPatterns().get(0).getValue());
+	}
+	
+	
+	//@Test
+	public void testSingleServletMappingInToMerge() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		Servlet servletBase = WebFactory.eINSTANCE.createServlet();
+		Servlet servletMerge = WebFactory.eINSTANCE.createServlet();
+		
+		String sname = "servName";
+		servletBase.setServletName(sname);
+		servletMerge.setServletName(sname);
+		
+		ServletMapping servletMappingBase = WebFactory.eINSTANCE.createServletMapping();
+		UrlPatternType urlPatternType = JavaeeFactory.eINSTANCE.createUrlPatternType();
+		String value = "/1";
+		urlPatternType.setValue(value);
+		
+		servletMappingBase.setServletName(sname);
+		servletMappingBase.getUrlPatterns().add(urlPatternType);
+		
+		descriptorToMerge.getServletMappings().add(servletMappingBase);
+
+		descriptorBase.getServlets().add(servletBase);
+		descriptorToMerge.getServlets().add(servletMerge);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertEquals(1, descriptorBase.getServletMappings().size());
+		ServletMapping mapping = descriptorBase.getServletMappings().get(0);
+		
+		Assert.assertEquals(sname, mapping.getServletName());
+		
+		Assert.assertEquals(1, mapping.getUrlPatterns().size());
+		Assert.assertEquals(value, mapping.getUrlPatterns().get(0).getValue());
+	}
+	
+	//@Test
+	public void testSingleServletMappingSame() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		Servlet servletBase = WebFactory.eINSTANCE.createServlet();
+		Servlet servletMerge = WebFactory.eINSTANCE.createServlet();
+		
+		String sname = "servName";
+		servletBase.setServletName(sname);
+		servletMerge.setServletName(sname);
+		
+		ServletMapping servletMappingBase = WebFactory.eINSTANCE.createServletMapping();
+		UrlPatternType urlPatternType = JavaeeFactory.eINSTANCE.createUrlPatternType();
+		String value = "/1";
+		urlPatternType.setValue(value);
+		
+		servletMappingBase.setServletName(sname);
+		servletMappingBase.getUrlPatterns().add(urlPatternType);
+		
+		descriptorToMerge.getServletMappings().add(servletMappingBase);
+		descriptorBase.getServletMappings().add(servletMappingBase);
+
+		descriptorBase.getServlets().add(servletBase);
+		descriptorToMerge.getServlets().add(servletMerge);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertEquals(1, descriptorBase.getServletMappings().size());
+		ServletMapping mapping = descriptorBase.getServletMappings().get(0);
+		
+		Assert.assertEquals(sname, mapping.getServletName());
+
+		Assert.assertEquals(1, mapping.getUrlPatterns().size());
+		Assert.assertEquals(value, mapping.getUrlPatterns().get(0).getValue());
+	}
+	
+	//@Test
+	public void testSingleServletMappingAdditive() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		Servlet servletBase = WebFactory.eINSTANCE.createServlet();
+		Servlet servletMerge = WebFactory.eINSTANCE.createServlet();
+		
+		String sname = "servName";
+		servletBase.setServletName(sname);
+		servletMerge.setServletName(sname);
+		
+		String value = "/1";
+		String value2 = "/2";
+		
+		UrlPatternType urlPatternType = JavaeeFactory.eINSTANCE.createUrlPatternType();
+		urlPatternType.setValue(value);
+		
+		UrlPatternType urlPatternType2 = JavaeeFactory.eINSTANCE.createUrlPatternType();
+		urlPatternType2.setValue(value2);
+		
+		ServletMapping servletMappingBase = WebFactory.eINSTANCE.createServletMapping();
+		ServletMapping servletMappingMerge = WebFactory.eINSTANCE.createServletMapping();
+		
+		servletMappingBase.setServletName(sname);
+		servletMappingBase.getUrlPatterns().add(urlPatternType);
+		
+		servletMappingMerge.setServletName(sname);
+		servletMappingMerge.getUrlPatterns().add(urlPatternType2);
+		
+		descriptorBase.getServletMappings().add(servletMappingBase);
+		descriptorToMerge.getServletMappings().add(servletMappingMerge);
+
+		descriptorBase.getServlets().add(servletBase);
+		descriptorToMerge.getServlets().add(servletMerge);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertEquals(1, descriptorBase.getServletMappings().size());
+		ServletMapping mapping = descriptorBase.getServletMappings().get(0);
+		
+		Assert.assertEquals(sname, mapping.getServletName());
+		Assert.assertEquals(2, mapping.getUrlPatterns().size());
+		Assert.assertEquals(value, mapping.getUrlPatterns().get(0).getValue());
+	}
+	
+	//@Test
+	public void testSingleServletMappingDifferentServletName() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		Servlet servletBase = WebFactory.eINSTANCE.createServlet();
+		Servlet servletMerge = WebFactory.eINSTANCE.createServlet();
+		
+		String sname = "servName";
+		String sname1 = "servName1";
+		servletBase.setServletName(sname);
+		servletMerge.setServletName(sname1);
+		
+		String value = "/1";
+		String value2 = "/2";
+		
+		UrlPatternType urlPatternType = JavaeeFactory.eINSTANCE.createUrlPatternType();
+		urlPatternType.setValue(value);
+		
+		UrlPatternType urlPatternType2 = JavaeeFactory.eINSTANCE.createUrlPatternType();
+		urlPatternType2.setValue(value2);
+		
+		ServletMapping servletMappingBase = WebFactory.eINSTANCE.createServletMapping();
+		ServletMapping servletMappingMerge = WebFactory.eINSTANCE.createServletMapping();
+		
+		servletMappingBase.setServletName(sname);
+		servletMappingBase.getUrlPatterns().add(urlPatternType);
+		
+		servletMappingMerge.setServletName(sname1);
+		servletMappingMerge.getUrlPatterns().add(urlPatternType2);
+		
+		descriptorBase.getServletMappings().add(servletMappingBase);
+		descriptorToMerge.getServletMappings().add(servletMappingMerge);
+
+		descriptorBase.getServlets().add(servletBase);
+		descriptorToMerge.getServlets().add(servletMerge);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertEquals(2, descriptorBase.getServletMappings().size());
+	}
+	
+	
+	
+	
+	
+	
+	
+	
+	//@Test
+	public void testSingleFilterMappingInBase() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		Filter servletBase = WebFactory.eINSTANCE.createFilter();
+		Filter servletMerge = WebFactory.eINSTANCE.createFilter();
+		
+		String sname = "servName";
+		servletBase.setFilterName(sname);
+		servletMerge.setFilterName(sname);
+		
+		FilterMapping FilterMappingBase = WebFactory.eINSTANCE.createFilterMapping();
+		UrlPatternType urlPatternType = JavaeeFactory.eINSTANCE.createUrlPatternType();
+		String value = "/1";
+		urlPatternType.setValue(value);
+		
+		FilterMappingBase.setFilterName(sname);
+		FilterMappingBase.getUrlPatterns().add(urlPatternType);
+		
+		descriptorBase.getFilterMappings().add(FilterMappingBase);
+
+		descriptorBase.getFilters().add(servletBase);
+		descriptorToMerge.getFilters().add(servletMerge);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertEquals(1, descriptorBase.getFilterMappings().size());
+		FilterMapping mapping = descriptorBase.getFilterMappings().get(0);
+		
+		Assert.assertEquals(sname, mapping.getFilterName());
+		
+		Assert.assertEquals(1, mapping.getUrlPatterns().size());
+		Assert.assertEquals(value, mapping.getUrlPatterns().get(0).getValue());
+	}
+	
+	
+	//@Test
+	public void testSingleFilterMappingInToMerge() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		Filter servletBase = WebFactory.eINSTANCE.createFilter();
+		Filter servletMerge = WebFactory.eINSTANCE.createFilter();
+		
+		String sname = "servName";
+		servletBase.setFilterName(sname);
+		servletMerge.setFilterName(sname);
+		
+		FilterMapping FilterMappingBase = WebFactory.eINSTANCE.createFilterMapping();
+		UrlPatternType urlPatternType = JavaeeFactory.eINSTANCE.createUrlPatternType();
+		String value = "/1";
+		urlPatternType.setValue(value);
+		
+		FilterMappingBase.setFilterName(sname);
+		FilterMappingBase.getUrlPatterns().add(urlPatternType);
+		
+		descriptorToMerge.getFilterMappings().add(FilterMappingBase);
+
+		descriptorBase.getFilters().add(servletBase);
+		descriptorToMerge.getFilters().add(servletMerge);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertEquals(1, descriptorBase.getFilterMappings().size());
+		FilterMapping mapping = descriptorBase.getFilterMappings().get(0);
+		
+		Assert.assertEquals(sname, mapping.getFilterName());
+		
+		Assert.assertEquals(1, mapping.getUrlPatterns().size());
+		Assert.assertEquals(value, mapping.getUrlPatterns().get(0).getValue());
+	}
+	
+	//@Test
+	public void testSingleFilterMappingSame() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		Filter servletBase = WebFactory.eINSTANCE.createFilter();
+		Filter servletMerge = WebFactory.eINSTANCE.createFilter();
+		
+		String sname = "servName";
+		servletBase.setFilterName(sname);
+		servletMerge.setFilterName(sname);
+		
+		FilterMapping FilterMappingBase = WebFactory.eINSTANCE.createFilterMapping();
+		UrlPatternType urlPatternType = JavaeeFactory.eINSTANCE.createUrlPatternType();
+		String value = "/1";
+		urlPatternType.setValue(value);
+		
+		FilterMappingBase.setFilterName(sname);
+		FilterMappingBase.getUrlPatterns().add(urlPatternType);
+		
+		descriptorToMerge.getFilterMappings().add(FilterMappingBase);
+		descriptorBase.getFilterMappings().add(FilterMappingBase);
+
+		descriptorBase.getFilters().add(servletBase);
+		descriptorToMerge.getFilters().add(servletMerge);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertEquals(1, descriptorBase.getFilterMappings().size());
+		FilterMapping mapping = descriptorBase.getFilterMappings().get(0);
+		
+		Assert.assertEquals(sname, mapping.getFilterName());
+
+		Assert.assertEquals(1, mapping.getUrlPatterns().size());
+		Assert.assertEquals(value, mapping.getUrlPatterns().get(0).getValue());
+	}
+	
+	//@Test
+	public void testSingleFilterMappingAdditive() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		Filter servletBase = WebFactory.eINSTANCE.createFilter();
+		Filter servletMerge = WebFactory.eINSTANCE.createFilter();
+		
+		String sname = "servName";
+		servletBase.setFilterName(sname);
+		servletMerge.setFilterName(sname);
+		
+		String value = "/1";
+		String value2 = "/2";
+		
+		UrlPatternType urlPatternType = JavaeeFactory.eINSTANCE.createUrlPatternType();
+		urlPatternType.setValue(value);
+		
+		UrlPatternType urlPatternType2 = JavaeeFactory.eINSTANCE.createUrlPatternType();
+		urlPatternType2.setValue(value2);
+		
+		FilterMapping filterMappingBase = WebFactory.eINSTANCE.createFilterMapping();
+		FilterMapping filterMappingMerge = WebFactory.eINSTANCE.createFilterMapping();
+		
+		filterMappingBase.setFilterName(sname);
+		filterMappingBase.getUrlPatterns().add(urlPatternType);
+		
+		filterMappingMerge.setFilterName(sname);
+		filterMappingMerge.getUrlPatterns().add(urlPatternType2);
+		
+		descriptorBase.getFilterMappings().add(filterMappingBase);
+		descriptorToMerge.getFilterMappings().add(filterMappingMerge);
+
+		descriptorBase.getFilters().add(servletBase);
+		descriptorToMerge.getFilters().add(servletMerge);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertEquals(1, descriptorBase.getFilterMappings().size());
+		FilterMapping mapping = descriptorBase.getFilterMappings().get(0);
+		
+		Assert.assertEquals(sname, mapping.getFilterName());
+		Assert.assertEquals(2, mapping.getUrlPatterns().size());
+		Assert.assertEquals(value, mapping.getUrlPatterns().get(0).getValue());
+	}
+	
+	//@Test
+	public void testSingleFilterMappingDifferentFilterName() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		Filter servletBase = WebFactory.eINSTANCE.createFilter();
+		Filter servletMerge = WebFactory.eINSTANCE.createFilter();
+		
+		String sname = "servName";
+		String sname1 = "servName1";
+		servletBase.setFilterName(sname);
+		servletMerge.setFilterName(sname1);
+		
+		String value = "/1";
+		String value2 = "/2";
+		
+		UrlPatternType urlPatternType = JavaeeFactory.eINSTANCE.createUrlPatternType();
+		urlPatternType.setValue(value);
+		
+		UrlPatternType urlPatternType2 = JavaeeFactory.eINSTANCE.createUrlPatternType();
+		urlPatternType2.setValue(value2);
+		
+		FilterMapping FilterMappingBase = WebFactory.eINSTANCE.createFilterMapping();
+		FilterMapping FilterMappingMerge = WebFactory.eINSTANCE.createFilterMapping();
+		
+		FilterMappingBase.setFilterName(sname);
+		FilterMappingBase.getUrlPatterns().add(urlPatternType);
+		
+		FilterMappingMerge.setFilterName(sname1);
+		FilterMappingMerge.getUrlPatterns().add(urlPatternType2);
+		
+		descriptorBase.getFilterMappings().add(FilterMappingBase);
+		descriptorToMerge.getFilterMappings().add(FilterMappingMerge);
+
+		descriptorBase.getFilters().add(servletBase);
+		descriptorToMerge.getFilters().add(servletMerge);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertEquals(2, descriptorBase.getFilterMappings().size());
+	}
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	//@Test
+	public void testSingleInitParamsInBase() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		Servlet servletBase = WebFactory.eINSTANCE.createServlet();
+		Servlet servletMerge = WebFactory.eINSTANCE.createServlet();
+		
+		String sname = "servName";
+		servletBase.setServletName(sname);
+		servletMerge.setServletName(sname);
+		
+		ParamValue initParamsType = JavaeeFactory.eINSTANCE.createParamValue();
+		String value = "/1";
+		initParamsType.setParamName(sname);
+		initParamsType.setParamValue(value);
+		
+		servletBase.getInitParams().add(initParamsType);
+		
+		descriptorBase.getServlets().add(servletBase);
+		descriptorToMerge.getServlets().add(servletMerge);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		
+		Assert.assertEquals(1, descriptorBase.getServlets().size());
+		Servlet rservlet = descriptorBase.getServlets().get(0);
+		
+		Assert.assertEquals(1, rservlet.getInitParams().size());
+		Assert.assertEquals(sname, rservlet.getInitParams().get(0).getParamName());
+		Assert.assertEquals(value, rservlet.getInitParams().get(0).getParamValue());
+	}
+	
+	
+	//@Test
+	public void testSingleInitParamsInToMerge() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		Servlet servletBase = WebFactory.eINSTANCE.createServlet();
+		Servlet servletMerge = WebFactory.eINSTANCE.createServlet();
+		
+		String sname = "servName";
+		servletBase.setServletName(sname);
+		servletMerge.setServletName(sname);
+		
+		ParamValue initParamsType = JavaeeFactory.eINSTANCE.createParamValue();
+		String value = "/1";
+		initParamsType.setParamName(sname);
+		initParamsType.setParamValue(value);
+		
+		servletMerge.getInitParams().add(initParamsType);
+		
+		descriptorBase.getServlets().add(servletBase);
+		descriptorToMerge.getServlets().add(servletMerge);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		
+		Assert.assertEquals(1, descriptorBase.getServlets().size());
+		Servlet rservlet = descriptorBase.getServlets().get(0);
+		
+		Assert.assertEquals(1, rservlet.getInitParams().size());
+		Assert.assertEquals(sname, rservlet.getInitParams().get(0).getParamName());
+		Assert.assertEquals(value, rservlet.getInitParams().get(0).getParamValue());
+	}
+	
+	//@Test
+	public void testSingleInitParamsSame() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		Servlet servletBase = WebFactory.eINSTANCE.createServlet();
+		Servlet servletMerge = WebFactory.eINSTANCE.createServlet();
+		
+		String sname = "servName";
+		servletBase.setServletName(sname);
+		servletMerge.setServletName(sname);
+		
+		ParamValue initParamsType = JavaeeFactory.eINSTANCE.createParamValue();
+		String value = "/1";
+		initParamsType.setParamName(sname);
+		initParamsType.setParamValue(value);
+		
+		servletBase.getInitParams().add(initParamsType);
+		servletMerge.getInitParams().add(initParamsType);
+		
+		descriptorBase.getServlets().add(servletBase);
+		descriptorToMerge.getServlets().add(servletMerge);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		
+		Assert.assertEquals(1, descriptorBase.getServlets().size());
+		Servlet rservlet = descriptorBase.getServlets().get(0);
+		
+		Assert.assertEquals(1, rservlet.getInitParams().size());
+		Assert.assertEquals(sname, rservlet.getInitParams().get(0).getParamName());
+		Assert.assertEquals(value, rservlet.getInitParams().get(0).getParamValue());
+	}
+	
+	//@Test
+	public void testSingleInitParamsAdditive() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		Servlet servletBase = WebFactory.eINSTANCE.createServlet();
+		Servlet servletMerge = WebFactory.eINSTANCE.createServlet();
+		
+		String sname = "servName";
+		
+		servletBase.setServletName(sname);
+		servletMerge.setServletName(sname);
+		
+		
+		String value = "/1";
+		String value2 = "/2";
+		
+		ParamValue initParamsType = JavaeeFactory.eINSTANCE.createParamValue();
+		initParamsType.setParamName(sname);
+		initParamsType.setParamValue(value);
+		
+		ParamValue initParamsType2 = JavaeeFactory.eINSTANCE.createParamValue();
+		initParamsType2.setParamName(sname);
+		initParamsType2.setParamValue(value2);
+		
+		servletBase.getInitParams().add(initParamsType);
+		servletMerge.getInitParams().add(initParamsType2);
+		
+		descriptorBase.getServlets().add(servletBase);
+		descriptorToMerge.getServlets().add(servletMerge);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		
+		Assert.assertEquals(1, descriptorBase.getServlets().size());
+		Servlet rservlet = descriptorBase.getServlets().get(0);
+		
+		Assert.assertEquals(1, rservlet.getInitParams().size());
+		Assert.assertEquals(sname, rservlet.getInitParams().get(0).getParamName());
+		Assert.assertEquals(value2, rservlet.getInitParams().get(0).getParamValue());
+	}
+	
+	//@Test
+	public void testSingleInitParamsDifferentServletName() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		Servlet servletBase = WebFactory.eINSTANCE.createServlet();
+		Servlet servletMerge = WebFactory.eINSTANCE.createServlet();
+		
+		String sname = "servName";
+		String sname2 = "servName2";
+		
+		servletBase.setServletName(sname);
+		servletMerge.setServletName(sname);
+		
+		
+		String value = "/1";
+		String value2 = "/2";
+		
+		ParamValue initParamsType = JavaeeFactory.eINSTANCE.createParamValue();
+		initParamsType.setParamName(sname);
+		initParamsType.setParamValue(value);
+		
+		ParamValue initParamsType2 = JavaeeFactory.eINSTANCE.createParamValue();
+		initParamsType2.setParamName(sname2);
+		initParamsType2.setParamValue(value2);
+		
+		servletBase.getInitParams().add(initParamsType);
+		servletMerge.getInitParams().add(initParamsType2);
+		
+		descriptorBase.getServlets().add(servletBase);
+		descriptorToMerge.getServlets().add(servletMerge);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		
+		Assert.assertEquals(1, descriptorBase.getServlets().size());
+		Servlet rservlet = descriptorBase.getServlets().get(0);
+		
+		Assert.assertEquals(2, rservlet.getInitParams().size());
+	}
+	
+	
+	
+	
+	
+	
+	
+	
+	//@Test
+	public void testSingleFilterInitParamsInBase() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		Filter servletBase = WebFactory.eINSTANCE.createFilter();
+		Filter servletMerge = WebFactory.eINSTANCE.createFilter();
+		
+		String sname = "servName";
+		
+		servletBase.setFilterName(sname);
+		servletMerge.setFilterName(sname);
+		
+		
+		String value = "/1";
+		
+		ParamValue initParamsType = JavaeeFactory.eINSTANCE.createParamValue();
+		initParamsType.setParamName(sname);
+		initParamsType.setParamValue(value);
+		
+		ParamValue initParamsType2 = JavaeeFactory.eINSTANCE.createParamValue();
+		initParamsType2.setParamName(sname);
+		initParamsType2.setParamValue(value);
+		
+		servletBase.getInitParams().add(initParamsType);
+		
+		descriptorBase.getFilters().add(servletBase);
+		descriptorToMerge.getFilters().add(servletMerge);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		
+		Assert.assertEquals(1, descriptorBase.getFilters().size());
+		Filter rservlet = descriptorBase.getFilters().get(0);
+		
+		Assert.assertEquals(1, rservlet.getInitParams().size());
+		Assert.assertEquals(sname, rservlet.getInitParams().get(0).getParamName());
+		Assert.assertEquals(value, rservlet.getInitParams().get(0).getParamValue());
+	}
+	
+	
+	//@Test
+	public void testSingleFilterInitParamsInToMerge() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		Filter servletBase = WebFactory.eINSTANCE.createFilter();
+		Filter servletMerge = WebFactory.eINSTANCE.createFilter();
+		
+		String sname = "servName";
+		
+		servletBase.setFilterName(sname);
+		servletMerge.setFilterName(sname);
+		
+		
+		String value = "/1";
+		
+		ParamValue initParamsType = JavaeeFactory.eINSTANCE.createParamValue();
+		initParamsType.setParamName(sname);
+		initParamsType.setParamValue(value);
+		
+		ParamValue initParamsType2 = JavaeeFactory.eINSTANCE.createParamValue();
+		initParamsType2.setParamName(sname);
+		initParamsType2.setParamValue(value);
+		
+		servletMerge.getInitParams().add(initParamsType2);
+		
+		descriptorBase.getFilters().add(servletBase);
+		descriptorToMerge.getFilters().add(servletMerge);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		
+		Assert.assertEquals(1, descriptorBase.getFilters().size());
+		Filter rservlet = descriptorBase.getFilters().get(0);
+		
+		Assert.assertEquals(1, rservlet.getInitParams().size());
+		Assert.assertEquals(sname, rservlet.getInitParams().get(0).getParamName());
+		Assert.assertEquals(value, rservlet.getInitParams().get(0).getParamValue());
+	}
+	
+	//@Test
+	public void testSingleFilterInitParamsSame() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		Filter servletBase = WebFactory.eINSTANCE.createFilter();
+		Filter servletMerge = WebFactory.eINSTANCE.createFilter();
+		
+		String sname = "servName";
+		
+		servletBase.setFilterName(sname);
+		servletMerge.setFilterName(sname);
+		
+		
+		String value = "/1";
+		
+		ParamValue initParamsType = JavaeeFactory.eINSTANCE.createParamValue();
+		initParamsType.setParamName(sname);
+		initParamsType.setParamValue(value);
+		
+		ParamValue initParamsType2 = JavaeeFactory.eINSTANCE.createParamValue();
+		initParamsType2.setParamName(sname);
+		initParamsType2.setParamValue(value);
+		
+		servletBase.getInitParams().add(initParamsType);
+		servletMerge.getInitParams().add(initParamsType2);
+		
+		descriptorBase.getFilters().add(servletBase);
+		descriptorToMerge.getFilters().add(servletMerge);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		
+		Assert.assertEquals(1, descriptorBase.getFilters().size());
+		Filter rservlet = descriptorBase.getFilters().get(0);
+		
+		Assert.assertEquals(1, rservlet.getInitParams().size());
+		Assert.assertEquals(sname, rservlet.getInitParams().get(0).getParamName());
+		Assert.assertEquals(value, rservlet.getInitParams().get(0).getParamValue());
+	}
+	
+	//@Test
+	public void testSingleFilterInitParamsAdditive() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		Filter servletBase = WebFactory.eINSTANCE.createFilter();
+		Filter servletMerge = WebFactory.eINSTANCE.createFilter();
+		
+		String sname = "servName";
+		
+		servletBase.setFilterName(sname);
+		servletMerge.setFilterName(sname);
+		
+		
+		String value = "/1";
+		String value2 = "/2";
+		
+		ParamValue initParamsType = JavaeeFactory.eINSTANCE.createParamValue();
+		initParamsType.setParamName(sname);
+		initParamsType.setParamValue(value);
+		
+		ParamValue initParamsType2 = JavaeeFactory.eINSTANCE.createParamValue();
+		initParamsType2.setParamName(sname);
+		initParamsType2.setParamValue(value2);
+		
+		servletBase.getInitParams().add(initParamsType);
+		servletMerge.getInitParams().add(initParamsType2);
+		
+		descriptorBase.getFilters().add(servletBase);
+		descriptorToMerge.getFilters().add(servletMerge);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		
+		Assert.assertEquals(1, descriptorBase.getFilters().size());
+		Filter rservlet = descriptorBase.getFilters().get(0);
+		
+		Assert.assertEquals(1, rservlet.getInitParams().size());
+		Assert.assertEquals(sname, rservlet.getInitParams().get(0).getParamName());
+		Assert.assertEquals(value2, rservlet.getInitParams().get(0).getParamValue());	
+	}
+	
+	//@Test
+	public void testSingleFilterInitParamDifferentFilterName() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		Filter servletBase = WebFactory.eINSTANCE.createFilter();
+		Filter servletMerge = WebFactory.eINSTANCE.createFilter();
+		
+		String sname = "servName";
+		
+		servletBase.setFilterName(sname);
+		servletMerge.setFilterName(sname);
+		
+		
+		String value = "/1";
+		String value2 = "/2";
+		
+		ParamValue initParamsType = JavaeeFactory.eINSTANCE.createParamValue();
+		initParamsType.setParamName(sname);
+		initParamsType.setParamValue(value);
+		
+		ParamValue initParamsType2 = JavaeeFactory.eINSTANCE.createParamValue();
+		initParamsType2.setParamName(sname);
+		initParamsType2.setParamValue(value2);
+		
+		servletBase.getInitParams().add(initParamsType);
+		servletMerge.getInitParams().add(initParamsType2);
+		
+		descriptorBase.getFilters().add(servletBase);
+		descriptorToMerge.getFilters().add(servletMerge);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		
+		Assert.assertEquals(1, descriptorBase.getFilters().size());
+		Filter rservlet = descriptorBase.getFilters().get(0);
+		
+		Assert.assertEquals(1, rservlet.getInitParams().size());
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/AbstractTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/AbstractTest.java
index 8e8abe0..415925a 100644
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/AbstractTest.java
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/AbstractTest.java
@@ -297,6 +297,10 @@
 	}
 
 	public static IFacetedProject createWebProject(String projectName) throws Exception {
+		return createWebProject(projectName, IJ2EEFacetConstants.DYNAMIC_WEB_25);
+	}
+	
+	public static IFacetedProject createWebProject(String projectName, Object web_version) throws Exception {
 		IDataModel dm = DataModelFactory.createDataModel(new WebFacetProjectCreationDataModelProvider());
 		dm.setProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME, projectName); //$NON-NLS-1$
 		FacetDataModelMap facetDataModelMap = (FacetDataModelMap) dm
@@ -304,7 +308,8 @@
 		IDataModel javaFacetDataModel = facetDataModelMap.getFacetDataModel(J2EEProjectUtilities.JAVA);
 		javaFacetDataModel.setProperty(IFacetDataModelProperties.FACET_VERSION, JavaFacetUtils.JAVA_50);
 		IDataModel ejbFacetDataModel = facetDataModelMap.getFacetDataModel(IJ2EEFacetConstants.DYNAMIC_WEB);
-		ejbFacetDataModel.setProperty(IFacetDataModelProperties.FACET_VERSION, IJ2EEFacetConstants.DYNAMIC_WEB_25);
+		ejbFacetDataModel.setProperty(IJ2EEFacetInstallDataModelProperties.GENERATE_DD, true);
+		ejbFacetDataModel.setProperty(IFacetDataModelProperties.FACET_VERSION, web_version);
 		dm.getDefaultOperation().execute(null, null);
 		IFacetedProject project = ProjectFacetsManager.create(ResourcesPlugin.getWorkspace().getRoot().getProject(
 				projectName));
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/AllAnnotationModelTests.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/AllAnnotationModelTests.java
index 4c77f98..487f677 100644
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/AllAnnotationModelTests.java
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/AllAnnotationModelTests.java
@@ -30,6 +30,7 @@
 import org.eclipse.jst.jee.model.ejb.tests.SecurityRolesTest;
 import org.eclipse.jst.jee.model.web.tests.DeleteWebProjectTest;
 import org.eclipse.jst.jee.model.web.tests.Web25MergedModelProviderTest;
+import org.eclipse.jst.jee.model.web.tests.Web3AnnotationReaderTest;
 import org.eclipse.jst.jee.model.web.tests.WebAnnotationReaderTest;
 import org.eclipse.wtp.j2ee.headless.tests.plugin.HeadlessTestsPlugin;
 
@@ -63,6 +64,7 @@
 			suite.addTest(RegisterMergedModelProviderTest.suite());
 			suite.addTest(EjbAnnotationFactoryTest.suite());
 			suite.addTest(WebAnnotationReaderTest.suite());
+			suite.addTest(Web3AnnotationReaderTest.suite());
 			suite.addTest(DeleteWebProjectTest.suite());
 			suite.addTest(NotifyCloseProjectTest.suite());
 			suite.addTest(Web25MergedModelProviderTest.suite());
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/web/tests/Web3AnnotationReaderTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/web/tests/Web3AnnotationReaderTest.java
new file mode 100644
index 0000000..dfbb93a
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/web/tests/Web3AnnotationReaderTest.java
@@ -0,0 +1,402 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.web.tests;
+
+import junit.framework.TestSuite;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IPackageFragment;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetConstants;
+import org.eclipse.jst.javaee.core.RunAs;
+import org.eclipse.jst.javaee.core.SecurityRole;
+import org.eclipse.jst.javaee.core.SecurityRoleRef;
+import org.eclipse.jst.javaee.web.Servlet;
+import org.eclipse.jst.javaee.web.WebApp;
+import org.eclipse.jst.javaee.web.WebFactory;
+import org.eclipse.jst.jee.model.internal.WebAnnotationReader;
+import org.eclipse.jst.jee.model.tests.AbstractAnnotationModelTest;
+import org.eclipse.jst.jee.model.tests.AbstractTest;
+import org.eclipse.jst.jee.model.tests.TestUtils;
+import org.eclipse.wst.common.project.facet.core.IFacetedProject;
+
+/**
+ * @author Kiril Mitov k.mitov@sap.com
+ * 
+ */
+public class Web3AnnotationReaderTest extends AbstractAnnotationModelTest {
+
+	private static final String TEST_URL_VALUE = "/testUrl";
+	private static final String SERVLET_WITH_URL = "ServletWithUrl";
+	private static final String SERVLET_NO_ARGUMENTS = "ServletNoArguments";
+	private static final String SERVLET_ANNOTATED_NAME = "ServletNameChange";
+	
+	private static String BEAN_WITH_NAME = "package com.sap;" + "import javax.ejb.Stateless;"
+			+ "@Stateless(name=\"%s\") public class BeanWithName implements SessionBeanLocal {}";
+
+	public static TestSuite suite() throws Exception {
+		TestSuite suite = new TestSuite(Web3AnnotationReaderTest.class);
+		return suite;
+	}
+
+	// @BeforeClass
+	public static void setUpProject() throws Exception {
+		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(Web3AnnotationReaderTest.class.getSimpleName());
+		if (!project.exists())
+		{
+			IFacetedProject facetedProject = AbstractTest.createWebProject(Web3AnnotationReaderTest.class.getSimpleName(), IJ2EEFacetConstants.DYNAMIC_WEB_30);
+			createProjectContent(facetedProject.getProject());
+		}
+	}
+
+	// @AfterClass
+	public static void tearDownAfterClass() throws InterruptedException {
+		AbstractTest.deleteProject(Web3AnnotationReaderTest.class.getSimpleName());
+	}
+
+	private static void createProjectContent(IProject project) throws Exception {
+		IJavaProject javaProject = JavaCore.create(project);
+		IFolder comFolder = javaProject.getProject().getFolder("src/com");
+		comFolder.create(true, true, new NullProgressMonitor());
+		IPackageFragmentRoot root = javaProject.getPackageFragmentRoot(comFolder);
+		IPackageFragment fragment = root.createPackageFragment("sap", true, new NullProgressMonitor());
+		createServlet3(fragment, SERVLET_NO_ARGUMENTS, null, null);
+		createServlet3(fragment, SERVLET_ANNOTATED_NAME, "test", null);
+		createServlet3(fragment, SERVLET_WITH_URL, null, TEST_URL_VALUE);
+		createServletWithSecurity(fragment);
+	}
+	
+	private static void createServletWithSecurity(IPackageFragment fragment) throws Exception {
+		final String servletContent = "package com.sap;"
+				+ "import javax.servlet.http.HttpServlet;"
+				+ "@DeclareRoles(value = {\"role1\", \"role2\"})  public class ServletWithSecurity extends HttpServlet {}";
+		IFile file = ((IContainer) fragment.getResource()).getFile(new Path("ServletWithSecurity.java"));
+		AbstractTest.saveFile(file, servletContent);
+	}
+	
+	private static void createServlet3(IPackageFragment fragment, String className, String name, String urlPattern) throws Exception {
+		String params = "";
+		if (name != null){
+			params="name=\""+name+"\"";
+		}
+		if (urlPattern != null){
+			if (params.length() > 0){
+				params+=", ";
+			}
+			params+="urlPatterns=\""+urlPattern+"\"";
+		}
+		if(params.length() > 0){
+			params="(" + params+ ")";
+		}
+		final String content = "package com.sap;" + "import javax.annotation.Resource;import javax.ejb.EJB;"
+				+ "import javax.servlet.http.HttpServlet;" + "@WebServlet"+params+" public class "+className+" extends HttpServlet {"
+				+ "private static final long serialVersionUID = 1L;"
+				+ "@EJB private Comparable comp; @EJB public void setComparable(Comparable comp){};"
+				+ "@Resource private Comparable comp2; @Resource public void setComparable2(Comparable comp){} }";
+		IFile file = ((IContainer) fragment.getResource()).getFile(new Path(className+".java"));
+		AbstractTest.saveFile(file, content);
+	}
+
+	private WebApp ddApp;
+
+	// @Before
+	@Override
+	protected void setUp() throws Exception {
+		setUpProject();
+		super.setUp();
+		ddApp = WebFactory.eINSTANCE.createWebApp();
+		addServlet(ddApp, SERVLET_NO_ARGUMENTS, "com.sap.Servlet1");
+		fixture = new WebAnnotationReader(facetedProject, ddApp);
+	}
+
+	// @After
+	@Override
+	protected void tearDown() throws Exception {
+		((WebAnnotationReader) fixture).dispose();
+	}
+
+	// @Tets
+	public void testAddDeleteEjbRef() throws Exception {
+		final String content = "package com.sap;" + "import javax.annotation.Resource;import javax.ejb.EJB;"
+				+ "import javax.servlet.http.HttpServlet;" + "@WebServlet public class testAddDeleteEjbRef extends HttpServlet {"
+				+ "private static final long serialVersionUID = 1L;"
+				+ "@EJB private Comparable comp; @EJB public void setComparable(Comparable comp){};}";
+		IFile file = facetedProject.getProject().getFile("src/com/sap/testAddDeleteEjbRef.java");
+		saveFileAndUpdate(file, content);
+
+		WebApp result = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(8), new Integer(result.getEjbLocalRefs().size()));
+
+		deleteFileAndUpdate(file);
+		result = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(6), new Integer(result.getEjbLocalRefs().size()));
+	}
+
+	/**
+	 * The servlet is not described in the web.xml. It is not in the deployment
+	 * descriptor model.
+	 * 
+	 * @throws Exception
+	 */
+	// @Tets
+	public void testNotAServletAddDeleteEjbRef() throws Exception {
+		final String content = "package com.sap;" + "import javax.annotation.Resource;import javax.ejb.EJB;"
+				+ "import javax.servlet.http.HttpServlet;"
+				+ "public class testNotAServletAddDeleteEjbRef {"
+				+ "private static final long serialVersionUID = 1L;"
+				+ "@EJB private Comparable comp; @EJB public void setComparable(Comparable comp){};}";
+		IFile file = facetedProject.getProject().getFile("src/com/sap/testNotAServletAddDeleteEjbRef.java");
+		AbstractTest.saveFile(file, content);
+
+		WebApp result = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(6), new Integer(result.getEjbLocalRefs().size()));
+
+		AbstractTest.deleteFile(file);
+		result = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(6), new Integer(result.getEjbLocalRefs().size()));
+	}
+
+	// @Tets
+	public void testAddDeleteResourceRef() throws Exception {
+		final String content = "package com.sap;" + "import javax.annotation.Resource;import javax.ejb.EJB;"
+				+ "import javax.servlet.http.HttpServlet;"
+				+ "@WebServlet public class testAddDeleteResourceRef extends HttpServlet {"
+				+ "private static final long serialVersionUID = 1L;"
+				+ "@Resource private Comparable comp2; @Resource public void setComparable2(Comparable comp){} }";
+		IFile file = facetedProject.getProject().getFile("src/com/sap/testAddDeleteResourceRef.java");
+		saveFileAndUpdate(file, content);
+
+		WebApp result = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(8), new Integer(result.getResourceRefs().size()));
+		deleteFileAndUpdate(file);
+
+		result = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(6), new Integer(result.getResourceRefs().size()));
+	}
+
+	// @Tets
+	public void testListener() throws Exception {
+		final String content = "package com.sap;" + "import javax.annotation.Resource;import javax.ejb.EJB;"
+				+ "@WebServletContextListener public class testListener {"
+				+ "@EJB private Comparable comp; @EJB public void setComparable(Comparable comp){};"
+				+ "@Resource private Comparable comp2; @Resource public void setComparable2(Comparable comp){} }";
+		IFile file = facetedProject.getProject().getFile("src/com/sap/testListener.java");
+		saveFileAndUpdate(file, content);
+
+		WebApp result = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(8), new Integer(result.getResourceRefs().size()));
+		assertEquals(new Integer(8), new Integer(result.getEjbLocalRefs().size()));
+
+		deleteFileAndUpdate(file);
+		result = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(6), new Integer(result.getResourceRefs().size()));
+		assertEquals(new Integer(6), new Integer(result.getEjbLocalRefs().size()));
+	}
+
+	// @Tets
+	public void testFilter() throws Exception {
+		final String content = "package com.sap;" + "import javax.annotation.Resource;import javax.ejb.EJB;"
+				+ "@WebFilter public class testFilter {"
+				+ "@EJB private Comparable comp; @EJB public void setComparable(Comparable comp){};"
+				+ "@Resource private Comparable comp2; @Resource public void setComparable2(Comparable comp){} }";
+		IFile file = facetedProject.getProject().getFile("src/com/sap/testFilter.java");
+		saveFileAndUpdate(file, content);
+
+		WebApp result = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(8), new Integer(result.getResourceRefs().size()));
+		assertEquals(new Integer(8), new Integer(result.getEjbLocalRefs().size()));
+
+		deleteFileAndUpdate(file);
+		result = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(6), new Integer(result.getResourceRefs().size()));
+		assertEquals(new Integer(6), new Integer(result.getEjbLocalRefs().size()));
+
+	}
+
+	// @Tets
+	public void testResourcesServlet() throws Exception {
+		final String content = "package com.sap;"
+				+ "import javax.annotation.Resource;import javax.ejb.EJB;"
+				+ "@Resources(value = {"
+				+ "@Resource(name = \"withNotDefaults\", mappedName = \"mappedName\", "
+				+ "	shareable = false, type = java.lang.Comparable.class, "
+				+ "	authenticationType = AuthenticationType.APPLICATION, description = \"description\"),"
+				+ "@Resource(name = \"withDefaults\", type = java.lang.Comparable.class), @Resource(name = \"invalidNoType\") })"
+				+ "@WebServlet public class testResourcesServlet {}";
+		IFile file = facetedProject.getProject().getFile("src/com/sap/testResourcesServlet.java");
+		saveFileAndUpdate(file, content);
+
+		WebApp result = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(8), new Integer(result.getResourceRefs().size()));
+
+		deleteFileAndUpdate(file);
+		result = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(6), new Integer(result.getResourceRefs().size()));
+	}
+
+	// @Tets
+	public void testResourcesFilter() throws Exception {
+		final String content = "package com.sap;"
+				+ "import javax.annotation.Resource;import javax.ejb.EJB;"
+				+ "@Resources(value = {"
+				+ "@Resource(name = \"withNotDefaults\", mappedName = \"mappedName\", "
+				+ "	shareable = false, type = java.lang.Comparable.class, "
+				+ "	authenticationType = AuthenticationType.APPLICATION, description = \"description\"),"
+				+ "@Resource(name = \"withDefaults\", type = java.lang.Comparable.class), @Resource(name = \"invalidNoType\") })"
+				+ "@WebFilter public class testResourcesFilter {}";
+		IFile file = facetedProject.getProject().getFile("src/com/sap/testResourcesFilter.java");
+		saveFileAndUpdate(file, content);
+
+		WebApp result = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(8), new Integer(result.getResourceRefs().size()));
+
+		deleteFileAndUpdate(file);
+		result = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(6), new Integer(result.getResourceRefs().size()));
+	}
+
+	// @Tets
+	public void testResourcesOnListener() throws Exception {
+		final String content = "package com.sap;"
+				+ "import javax.annotation.Resource;import javax.ejb.EJB;"
+				+ "@Resources(value = {"
+				+ "@Resource(name = \"withNotDefaults\", mappedName = \"mappedName\", "
+				+ "	shareable = false, type = java.lang.Comparable.class, "
+				+ "	authenticationType = AuthenticationType.APPLICATION, description = \"description\"),"
+				+ "@Resource(name = \"withDefaults\", type = java.lang.Comparable.class), @Resource(name = \"invalidNoType\") })"
+				+ "@WebServletContextListener public class testResourcesOnListener {}";
+		IFile file = facetedProject.getProject().getFile("src/com/sap/testResourcesOnListener.java");
+		saveFileAndUpdate(file, content);
+
+		WebApp result = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(8), new Integer(result.getResourceRefs().size()));
+
+		deleteFileAndUpdate(file);
+		result = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(6), new Integer(result.getResourceRefs().size()));
+	}
+
+	// @Tets
+	public void testDeclareRoles() throws Exception {
+		final String beanContent = "package com.sap;"
+				+ "@DeclareRoles(value = {\"testDeclareRoles1\", \"testDeclareRoles1\"}) "
+				+ "@WebServlet public class testDeclareRoles extends HttpServlet {}";
+		IFile servletFile = facetedProject.getProject().getFile("src/com/sap/testDeclareRoles.java");
+		saveFileAndUpdate(servletFile, beanContent);
+
+		WebApp app = (WebApp) fixture.getModelObject();
+		Servlet result = TestUtils.findServletByName(app, "testDeclareRoles");
+		assertNotNull(result);
+		SecurityRole role1 = TestUtils.findSecurityRole(app.getSecurityRoles(), "testDeclareRoles1");
+		SecurityRole role2 = TestUtils.findSecurityRole(app.getSecurityRoles(), "testDeclareRoles1");
+		assertNotNull(role1);
+		assertNotNull(role2);
+		SecurityRoleRef role1Ref = TestUtils.findSecurityRoleRef(result.getSecurityRoleRefs(), "testDeclareRoles1");
+		assertNotNull(role1Ref);
+		SecurityRoleRef role2Ref = TestUtils.findSecurityRoleRef(result.getSecurityRoleRefs(), "testDeclareRoles1");
+		assertNotNull(role2Ref);
+
+		deleteFileAndUpdate(servletFile);
+		app = (WebApp) fixture.getModelObject();
+		assertNull(TestUtils.findServletByName(app, "testDeclareRoles"));
+		assertNull(TestUtils.findSecurityRole(app.getSecurityRoles(), "testDeclareRoles1"));
+		assertNull(TestUtils.findSecurityRole(app.getSecurityRoles(), "testDeclareRoles1"));
+	}
+
+	// @Tets
+	public void testDeclareRoleOnManyServlets() throws Exception {
+		final String servlet1Content = "package com.sap;"
+				+ "@DeclareRoles(value = {\"testDeclareRoleOnManyBeansRole\"}) "
+				+ "@WebServlet public class testDeclareRoleOnManyServlets1 implements SessionBeanLocal {}";
+		final String servlet2Content = "package com.sap;"
+				+ "@DeclareRoles(value = {\"testDeclareRoleOnManyBeansRole\"}) "
+				+ "@WebServlet public class testDeclareRoleOnManyServlets2 implements SessionBeanLocal {}";
+		IFile bean1File = facetedProject.getProject().getFile("src/com/sap/testDeclareRoleOnManyServlets1.java");
+		IFile bean2File = facetedProject.getProject().getFile("src/com/sap/testDeclareRoleOnManyServlets2.java");
+		saveFileAndUpdate(bean1File, servlet1Content);
+		saveFileAndUpdate(bean2File, servlet2Content);
+		WebApp app = (WebApp) fixture.getModelObject();
+		Servlet result = TestUtils.findServletByName(app, "testDeclareRoleOnManyServlets1");
+		SecurityRole role1 = TestUtils.findSecurityRole(app.getSecurityRoles(), "testDeclareRoleOnManyBeansRole");
+		assertNotNull(role1);
+		SecurityRoleRef role1Ref = TestUtils.findSecurityRoleRef(result.getSecurityRoleRefs(),
+				"testDeclareRoleOnManyBeansRole");
+		assertNotNull(role1Ref);
+
+		deleteFileAndUpdate(bean1File);
+		assertNotNull(TestUtils.findSecurityRole(app.getSecurityRoles(), "testDeclareRoleOnManyBeansRole"));
+		deleteFileAndUpdate(bean2File);
+		assertNull(TestUtils.findSecurityRole(app.getSecurityRoles(), "testDeclareRoleOnManyBeansRole"));
+	}
+
+	// @Tets
+	public void testRunAs() throws Exception {
+		final String servletContent = "package com.sap;"
+				+ "@DeclareRoles(value = {\"testRunAsRole\"}) @RunAs(value = \"testRunAsRole\") "
+				+ "@WebServlet public class testRunAs{}";
+
+		IFile servletFile = facetedProject.getProject().getFile("src/com/sap/testRunAs.java");
+		saveFileAndUpdate(servletFile, servletContent);
+		WebApp app = (WebApp) fixture.getModelObject();
+		Servlet result = TestUtils.findServletByName(app, "testRunAs");
+		SecurityRole role1 = TestUtils.findSecurityRole(app.getSecurityRoles(), "testRunAsRole");
+		assertNotNull(role1);
+		SecurityRoleRef role1Ref = TestUtils.findSecurityRoleRef(result.getSecurityRoleRefs(), "testRunAsRole");
+		assertNotNull(role1Ref);
+		RunAs runAs = (RunAs) result.getRunAs();
+		assertNotNull(runAs);
+		assertEquals("testRunAsRole", runAs.getRoleName());
+
+		deleteFileAndUpdate(servletFile);
+		assertNull(TestUtils.findSecurityRole(((WebApp) fixture.getModelObject()).getSecurityRoles(), "testRunAsRole"));
+	}
+
+	// @Tets
+	public void testAddEjbRefToServlet() throws Exception {
+		final String content1 = "package com.sap;" + "import javax.annotation.Resource;import javax.ejb.EJB;"
+				+ "import javax.servlet.http.HttpServlet;"
+				+ "@WebServlet public class testAddEjbRefToServlet extends HttpServlet {"
+				+ "private static final long serialVersionUID = 1L;}";
+		final String content2 = "package com.sap;" + "import javax.annotation.Resource;import javax.ejb.EJB;"
+				+ "import javax.servlet.http.HttpServlet;"
+				+ "@WebServlet public class testAddEjbRefToServlet extends HttpServlet {"
+				+ "private static final long serialVersionUID = 1L;"
+				+ "@EJB private Comparable comp; @EJB public void setComparable(Comparable comp){};}";
+		IFile file = facetedProject.getProject().getFile("src/com/sap/testAddEjbRefToServlet.java");
+		saveFileAndUpdate(file, content1);
+		WebApp app = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(6), new Integer(app.getEjbLocalRefs().size()));
+
+		saveFileAndUpdate(file, content2);
+		app = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(8), new Integer(app.getEjbLocalRefs().size()));
+
+		deleteFileAndUpdate(file);
+		app = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(6), new Integer(app.getEjbLocalRefs().size()));
+	}
+
+	private static void addServlet(WebApp app, String servletName, String servletClass) {
+		Servlet servlet = WebFactory.eINSTANCE.createServlet();
+		servlet.setServletName(servletName);
+		servlet.setServletClass(servletClass);
+		app.getServlets().add(servlet);
+	}
+
+}