Index: src/org/teiid/designer/vdb/VdbEntry.java
===================================================================
--- src/org/teiid/designer/vdb/VdbEntry.java	(revision 2148)
+++ src/org/teiid/designer/vdb/VdbEntry.java	(working copy)
@@ -7,7 +7,10 @@
  */
 package org.teiid.designer.vdb;
 
-import static org.teiid.designer.vdb.Vdb.Event.*;
+import static org.teiid.designer.vdb.Vdb.Event.ENTRY_CHECKSUM;
+import static org.teiid.designer.vdb.Vdb.Event.ENTRY_DESCRIPTION;
+import static org.teiid.designer.vdb.Vdb.Event.ENTRY_SYNCHRONIZATION;
+
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
@@ -16,25 +19,24 @@
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipOutputStream;
+
 import net.jcip.annotations.ThreadSafe;
+
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.IResourceDelta;
 import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.Path;
 import org.teiid.designer.vdb.manifest.EntryElement;
 import org.teiid.designer.vdb.manifest.PropertyElement;
+
 import com.metamatrix.core.modeler.CoreModelerPlugin;
 import com.metamatrix.core.modeler.util.FileUtils;
 import com.metamatrix.core.modeler.util.OperationUtil;
 import com.metamatrix.core.modeler.util.ZipUtil;
 import com.metamatrix.core.util.ChecksumUtil;
 import com.metamatrix.core.util.StringUtilities;
-import com.metamatrix.modeler.internal.core.workspace.ResourceChangeUtilities;
 
 /**
  *
@@ -49,7 +51,7 @@
                                                                                                           Synchronization.NotApplicable);
     private long checksum;
     final AtomicReference<String> description = new AtomicReference<String>();
-    private final IResourceChangeListener fileListener;
+//    private final IResourceChangeListener fileListener;
     private final int hashcode;
 
     private final ReadWriteLock checksumLock = new ReentrantReadWriteLock();
@@ -74,16 +76,16 @@
         // Calculate hashcode
         hashcode = 31 + name.hashCode();
         // Register to listen for changes to this entries associated workspace file
-        fileListener = new IResourceChangeListener() {
-            public void resourceChanged( final IResourceChangeEvent event ) {
-            	if( ResourceChangeUtilities.isProjectClosing(event)) return;
-            	
-                final IResourceDelta delta = event.getDelta() == null ? null : event.getDelta().findMember(name);
-                if (delta == null) return;
-                fileChanged(delta);
-            }
-        };
-        ResourcesPlugin.getWorkspace().addResourceChangeListener(fileListener);
+//        fileListener = new IResourceChangeListener() {
+//            public void resourceChanged( final IResourceChangeEvent event ) {
+//            	if( ResourceChangeUtilities.isProjectClosing(event)) return;
+//            	
+//                final IResourceDelta delta = event.getDelta() == null ? null : event.getDelta().findMember(name);
+//                if (delta == null) return;
+//                if (ResourceChangeUtilities.isContentChanged(delta)) fileChanged(delta);
+//            }
+//        };
+//        ResourcesPlugin.getWorkspace().addResourceChangeListener(fileListener);
         if (this.description.get() == null) {
             this.description.set(EMPTY_STR);
         }
@@ -121,7 +123,7 @@
     }
 
     void dispose() {
-        ResourcesPlugin.getWorkspace().removeResourceChangeListener(fileListener);
+//        ResourcesPlugin.getWorkspace().removeResourceChangeListener(fileListener);
         new File(vdb.getFolder(), name.toString()).delete();
     }
 
@@ -141,20 +143,20 @@
         } else if (!name.equals(other.name)) return false;
         return true;
     }
-
-    final void fileChanged( final IResourceDelta delta ) {
-        // TODO: Handle renames
-        if ((delta.getFlags() & (IResourceDelta.REPLACED | IResourceDelta.MOVED_FROM | IResourceDelta.MOVED_TO)) > 0) return; // throw
-                                                                                                                              // new
-                                                                                                                              // UnsupportedOperationException(
-        // toString(delta));
-        final int kind = delta.getKind();
-        if (kind == IResourceDelta.REMOVED) setSynchronization(Synchronization.NotApplicable);
-        else if (kind == IResourceDelta.ADDED || kind == IResourceDelta.CHANGED) {
-            if (getChecksum() != computeChecksum((IFile)delta.getResource())) setSynchronization(Synchronization.NotSynchronized);
-            else setSynchronization(Synchronization.Synchronized);
-        } else throw new UnsupportedOperationException(toString(delta));
-    }
+//
+//    final void fileChanged( final IResourceDelta delta ) {
+//        // TODO: Handle renames
+//        if ((delta.getFlags() & (IResourceDelta.REPLACED | IResourceDelta.MOVED_FROM | IResourceDelta.MOVED_TO)) > 0) return; // throw
+//                                                                                                                              // new
+//                                                                                                                              // UnsupportedOperationException(
+//        // toString(delta));
+//        final int kind = delta.getKind();
+//        if (kind == IResourceDelta.REMOVED) setSynchronization(Synchronization.NotApplicable);
+//        else if (kind == IResourceDelta.ADDED || kind == IResourceDelta.CHANGED) {
+//            if (getChecksum() != computeChecksum((IFile)delta.getResource())) setSynchronization(Synchronization.NotSynchronized);
+//            else setSynchronization(Synchronization.Synchronized);
+//        } else throw new UnsupportedOperationException(toString(delta));
+//    }
 
     /**
      * @return <code>true</code> if the associated file exists
@@ -262,7 +264,10 @@
         vdb.setModified(this, ENTRY_DESCRIPTION, oldDescription, description);
     }
 
-    void setSynchronization( final Synchronization synchronization ) {
+    /**
+     * @param synchronization the new sychronization
+     */
+    public void setSynchronization( final Synchronization synchronization ) {
         final Synchronization oldSynchronization = getSynchronization();
         if (oldSynchronization == synchronization) return;
         this.synchronization.set(synchronization);
@@ -321,20 +326,20 @@
         builder.append(')');
         return builder.toString();
     }
-
-    private String toString( final IResourceDelta delta ) {
-        final StringBuilder builder = new StringBuilder("file="); //$NON-NLS-1$
-        builder.append(delta.getFullPath().toString());
-        builder.append(", kind="); //$NON-NLS-1$
-        builder.append(delta.getKind());
-        builder.append(", flags="); //$NON-NLS-1$
-        builder.append(delta.getFlags());
-        builder.append(", from="); //$NON-NLS-1$
-        builder.append(delta.getMovedFromPath());
-        builder.append(", to="); //$NON-NLS-1$
-        builder.append(delta.getMovedToPath());
-        return builder.toString();
-    }
+//
+//    private String toString( final IResourceDelta delta ) {
+//        final StringBuilder builder = new StringBuilder("file="); //$NON-NLS-1$
+//        builder.append(delta.getFullPath().toString());
+//        builder.append(", kind="); //$NON-NLS-1$
+//        builder.append(delta.getKind());
+//        builder.append(", flags="); //$NON-NLS-1$
+//        builder.append(delta.getFlags());
+//        builder.append(", from="); //$NON-NLS-1$
+//        builder.append(delta.getMovedFromPath());
+//        builder.append(", to="); //$NON-NLS-1$
+//        builder.append(delta.getMovedToPath());
+//        return builder.toString();
+//    }
 
     /**
      * Intended for a subclass to append its properties and their values, in the form ", <name>=<value>, ...", to the supplied
Index: src/org/teiid/designer/vdb/VdbUtil.java
===================================================================
--- src/org/teiid/designer/vdb/VdbUtil.java	(revision 0)
+++ src/org/teiid/designer/vdb/VdbUtil.java	(revision 0)
@@ -0,0 +1,178 @@
+/*
+ * JBoss, Home of Professional Open Source.
+*
+* See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
+*
+* See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
+*/
+package org.teiid.designer.vdb;
+
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Enumeration;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+import javax.xml.XMLConstants;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Unmarshaller;
+import javax.xml.validation.Schema;
+import javax.xml.validation.SchemaFactory;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.teiid.designer.vdb.Vdb.Xml;
+import org.teiid.designer.vdb.manifest.PropertyElement;
+import org.teiid.designer.vdb.manifest.VdbElement;
+import org.xml.sax.SAXException;
+
+import com.metamatrix.core.modeler.util.OperationUtil;
+import com.metamatrix.core.modeler.util.OperationUtil.Unreliable;
+
+/**
+ * Utility methods used to query VDB manifest and VDB's
+ */
+public class VdbUtil {
+	private static final String MANIFEST = "META-INF/vdb.xml"; //$NON-NLS-1$
+	
+	
+	/**
+	 * @param theVdb
+	 * @return list of vdb model files
+	 */
+	public static Collection<IFile> getVdbModels(Vdb theVdb) {
+		Collection<IFile> iFiles = new ArrayList<IFile>();
+		
+		for( VdbModelEntry modelEntry : theVdb.getModelEntries() ) {
+			//IPath modelPath = modelEntry.getName();
+			IResource resource = ResourcesPlugin.getWorkspace().getRoot().findMember(modelEntry.getName());
+			if( resource.exists() ) {
+				iFiles.add((IFile)resource);
+			}
+		}
+		
+		return iFiles;
+	}
+	
+	/**
+	 * @param file
+	 * @return preview attribute value for VDB. true or false
+	 */
+	public static boolean isPreviewVdb(final IFile file) {
+        final boolean[] previewable = new boolean[1];
+        
+        if( !file.exists() ) {
+        	return false;
+        }
+        
+        OperationUtil.perform(new Unreliable() {
+
+            ZipFile archive = null;
+            InputStream entryStream = null;
+
+            @Override
+            public void doIfFails() {
+            }
+
+            @Override
+            public void finallyDo() throws Exception {
+                if (entryStream != null) entryStream.close();
+                if (archive != null) archive.close();
+            }
+
+            @Override
+            public void tryToDo() throws Exception {
+                archive = new ZipFile(file.getLocation().toString());
+                boolean foundManifest = false;
+                for (final Enumeration<? extends ZipEntry> iter = archive.entries(); iter.hasMoreElements();) {
+                    final ZipEntry zipEntry = iter.nextElement();
+                    entryStream = archive.getInputStream(zipEntry);
+                    if (zipEntry.getName().equals(MANIFEST)) {
+                        // Initialize using manifest
+                    	foundManifest = true;
+                        final Unmarshaller unmarshaller = getJaxbContext().createUnmarshaller();
+                        unmarshaller.setSchema(getManifestSchema());
+                        final VdbElement manifest = (VdbElement)unmarshaller.unmarshal(entryStream);
+
+                        // VDB properties
+                        for (final PropertyElement property : manifest.getProperties()) {
+                            final String name = property.getName();
+                            if (Xml.PREVIEW.equals(name)) {
+                            	previewable[0] = Boolean.parseBoolean(property.getValue());
+                            }
+                        }
+                    }
+                    // Don't process any more than we need to.
+                    if( foundManifest ) {
+                    	break;
+                    }
+                }
+            }
+        });
+        return previewable[0];
+	}
+	
+	/**
+	 * @param file
+	 * @return version the vdb version number
+	 */
+	public static int getVdbVersion(final IFile file) {
+        final int[] vdbVersion = new int[1];
+        
+        if( !file.exists() ) {
+        	return 0;
+        }
+        OperationUtil.perform(new Unreliable() {
+
+            ZipFile archive = null;
+            InputStream entryStream = null;
+
+            @Override
+            public void doIfFails() {
+            }
+
+            @Override
+            public void finallyDo() throws Exception {
+                if (entryStream != null) entryStream.close();
+                if (archive != null) archive.close();
+            }
+
+            @Override
+            public void tryToDo() throws Exception {
+                archive = new ZipFile(file.getLocation().toString());
+                boolean foundManifest = false;
+                for (final Enumeration<? extends ZipEntry> iter = archive.entries(); iter.hasMoreElements();) {
+                    final ZipEntry zipEntry = iter.nextElement();
+                    entryStream = archive.getInputStream(zipEntry);
+                    if (zipEntry.getName().equals(MANIFEST)) {
+                        // Initialize using manifest
+                    	foundManifest = true;
+                        final Unmarshaller unmarshaller = getJaxbContext().createUnmarshaller();
+                        unmarshaller.setSchema(getManifestSchema());
+                        final VdbElement manifest = (VdbElement)unmarshaller.unmarshal(entryStream);
+   
+                        vdbVersion[0] = manifest.getVersion();
+                    }
+                    // Don't process any more than we need to.
+                    if( foundManifest ) {
+                    	break;
+                    }
+                }
+            }
+        });
+        return vdbVersion[0];
+	}
+	
+    private static JAXBContext getJaxbContext() throws JAXBException {
+        return JAXBContext.newInstance(new Class<?>[] { VdbElement.class });
+    }
+	
+    private static Schema getManifestSchema() throws SAXException {
+        final SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
+        return schemaFactory.newSchema(VdbElement.class.getResource("/vdb-deployer.xsd")); //$NON-NLS-1$
+    }
+
+}
Index: src/org/teiid/designer/vdb/Vdb.java
===================================================================
--- src/org/teiid/designer/vdb/Vdb.java	(revision 2137)
+++ src/org/teiid/designer/vdb/Vdb.java	(working copy)
@@ -27,6 +27,7 @@
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipFile;
 import java.util.zip.ZipOutputStream;
+
 import javax.xml.XMLConstants;
 import javax.xml.bind.JAXBContext;
 import javax.xml.bind.JAXBException;
@@ -34,7 +35,9 @@
 import javax.xml.bind.Unmarshaller;
 import javax.xml.validation.Schema;
 import javax.xml.validation.SchemaFactory;
+
 import net.jcip.annotations.ThreadSafe;
+
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IMarker;
 import org.eclipse.core.resources.IResource;
@@ -51,10 +54,12 @@
 import org.teiid.designer.vdb.manifest.TranslatorElement;
 import org.teiid.designer.vdb.manifest.VdbElement;
 import org.xml.sax.SAXException;
+
 import com.metamatrix.core.modeler.util.FileUtils;
 import com.metamatrix.core.modeler.util.OperationUtil;
 import com.metamatrix.core.modeler.util.OperationUtil.Unreliable;
 import com.metamatrix.core.util.StringUtilities;
+import com.metamatrix.modeler.internal.core.builder.VdbModelBuilder;
 
 /**
  * 
@@ -96,6 +101,8 @@
     private final boolean preview;
     private final int version;
     private int queryTimeout = DEFAULT_TIMEOUT;
+    
+    private VdbModelBuilder builder;
 
     /**
      * @param file
@@ -105,6 +112,7 @@
     public Vdb( final IFile file,
                 final boolean preview,
                 final IProgressMonitor monitor ) {
+    	this.builder = new VdbModelBuilder();
         this.file = file;
         // Create folder for VDB in state folder
         folder = VdbPlugin.singleton().getStateLocation().append(file.getFullPath()).toFile();
@@ -577,8 +585,19 @@
      * @param monitor
      */
     public final void synchronize( final IProgressMonitor monitor ) {
+    	getBuilder().start();
+
         synchronize(new HashSet<VdbEntry>(modelEntries), monitor);
         synchronize(entries, monitor);
+
+        getBuilder().stop();
+    }
+    
+    /**
+     * @return builder
+     */
+    public VdbModelBuilder getBuilder() {
+    	return this.builder;
     }
 
     /**
Index: src/org/teiid/designer/vdb/VdbModelEntry.java
===================================================================
--- src/org/teiid/designer/vdb/VdbModelEntry.java	(revision 2137)
+++ src/org/teiid/designer/vdb/VdbModelEntry.java	(working copy)
@@ -34,6 +34,7 @@
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Path;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.resource.Resource;
 import org.teiid.designer.datatools.connection.ConnectionInfoHelper;
@@ -51,7 +52,6 @@
 import com.metamatrix.modeler.core.ModelerCore;
 import com.metamatrix.modeler.core.container.ResourceFinder;
 import com.metamatrix.modeler.core.workspace.ModelResource;
-import com.metamatrix.modeler.internal.core.builder.ModelBuildUtil;
 import com.metamatrix.modeler.internal.core.index.IndexUtil;
 import com.metamatrix.modeler.internal.core.resource.EmfResource;
 import com.metamatrix.modeler.internal.core.workspace.ModelUtil;
@@ -410,7 +410,18 @@
             }
 
             // Build model if necessary
-            ModelBuildUtil.buildResources(monitor, Collections.singleton(workspaceFile), ModelerCore.getModelContainer(), false);
+            // Get Index File and check time/date to see if we need to rebuild or not
+            IPath indexPath = new Path(IndexUtil.INDEX_PATH + indexName); //
+            File indexFile = indexPath.toFile();
+            long indexDate = -1;
+            if( indexFile.exists() ) {
+            	indexDate = indexFile.lastModified();
+            	
+            }
+            if( workspaceFile.getLocalTimeStamp() > indexDate ) {
+            	// Note that this will index and validate the model in the workspace
+            	getVdb().getBuilder().buildResources(monitor, Collections.singleton(workspaceFile), ModelerCore.getModelContainer(), false);
+            }
             // Synchronize model problems
             for (final IMarker marker : workspaceFile.findMarkers(IMarker.PROBLEM, true, IResource.DEPTH_INFINITE)) {
                 Object attr = marker.getAttribute(IMarker.SEVERITY);
