improve publish state
diff --git a/plugins/org.eclipse.jst.server.generic.core/src/org/eclipse/jst/server/generic/core/internal/GenericServerBehaviour.java b/plugins/org.eclipse.jst.server.generic.core/src/org/eclipse/jst/server/generic/core/internal/GenericServerBehaviour.java
index deeab0e..c2a9cb5 100644
--- a/plugins/org.eclipse.jst.server.generic.core/src/org/eclipse/jst/server/generic/core/internal/GenericServerBehaviour.java
+++ b/plugins/org.eclipse.jst.server.generic.core/src/org/eclipse/jst/server/generic/core/internal/GenericServerBehaviour.java
@@ -87,13 +87,22 @@
     }
 
     private void setModulePublishState( IModule[] module, IStatus[] status ) throws CoreException {
-        if(status==null || status.length < 1 ){
-            setModulePublishState(module, IServer.PUBLISH_STATE_NONE);
-        }else {
-            for (int i=0; i < status.length; i++) {
-                if (IStatus.ERROR == status[i].getSeverity()){
-                	setModulePublishState(module, IServer.PUBLISH_STATE_UNKNOWN);
-                    throw new CoreException(status[i]);
+        if( module==null )
+            return;
+        for( int i=0; i < module.length; i++)
+        {
+            if(status == null ||
+                    status.length < i ||
+                    status[i]==null || 
+                    status[i].getSeverity() == IStatus.OK )
+            {
+            setModulePublishState(module, IServer.PUBLISH_STATE_NONE);    
+            }
+            else
+            {
+                if ( IStatus.ERROR == status[i].getSeverity() ){
+                    setModulePublishState( module, IServer.PUBLISH_STATE_UNKNOWN );
+                    throw new CoreException( status[i] );
                 }
             }
         }
diff --git a/plugins/org.eclipse.jst.server.generic.core/src/org/eclipse/jst/server/generic/core/internal/publishers/EarModuleAssembler.java b/plugins/org.eclipse.jst.server.generic.core/src/org/eclipse/jst/server/generic/core/internal/publishers/EarModuleAssembler.java
index e75cd7c..210768b 100644
--- a/plugins/org.eclipse.jst.server.generic.core/src/org/eclipse/jst/server/generic/core/internal/publishers/EarModuleAssembler.java
+++ b/plugins/org.eclipse.jst.server.generic.core/src/org/eclipse/jst/server/generic/core/internal/publishers/EarModuleAssembler.java
@@ -21,6 +21,8 @@
 import org.eclipse.jst.server.generic.core.internal.CorePlugin;
 import org.eclipse.jst.server.generic.core.internal.GenericServer;
 import org.eclipse.wst.server.core.IModule;
+import org.eclipse.wst.server.core.internal.Server;
+import org.eclipse.wst.server.core.model.IModuleResourceDelta;
 
 /**
  * Utility for EAR module assembly.
@@ -43,13 +45,25 @@
 				IStatus status = new Status(IStatus.ERROR, CorePlugin.PLUGIN_ID, 0,	"unable to assemble module null uri",null ); //$NON-NLS-1$
 				throw new CoreException(status);
 			}
-				
-			packModule(module,uri, parent);
+			if( shouldRepack( module ) ){	
+			    packModule(module,uri, parent);
+            }
 		}
 		return parent;
 	}
-	
-	protected void packModule(IModule module, String deploymentUnitName, IPath destination) throws CoreException {
+	/**
+     * Checks if there has been a change in the published resources.
+     * @param module
+     * @return module changed
+	 */
+	private boolean shouldRepack( IModule module ) {
+        final Server server = (Server) fServer.getServer();
+        final IModule[] modules ={module}; 
+        IModuleResourceDelta[] deltas = server.getPublishedResourceDelta( modules );
+        return deltas.length > 0;
+    }
+
+    protected void packModule(IModule module, String deploymentUnitName, IPath destination) throws CoreException {
 		if(module.getModuleType().getId().equals("jst.web")) //$NON-NLS-1$
 		{
 			AbstractModuleAssembler assembler= AbstractModuleAssembler.Factory.getModuleAssembler(module, fServer);