diff --git a/com.google.eclipse.protobuf.test/.classpath b/com.google.eclipse.protobuf.test/.classpath
index 64c5e31..4c62a80 100644
--- a/com.google.eclipse.protobuf.test/.classpath
+++ b/com.google.eclipse.protobuf.test/.classpath
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
 	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
 	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/com.google.eclipse.protobuf.test/.settings/org.eclipse.jdt.core.prefs b/com.google.eclipse.protobuf.test/.settings/org.eclipse.jdt.core.prefs
index d8e674c..fa7357b 100644
--- a/com.google.eclipse.protobuf.test/.settings/org.eclipse.jdt.core.prefs
+++ b/com.google.eclipse.protobuf.test/.settings/org.eclipse.jdt.core.prefs
@@ -1,12 +1,12 @@
-#Thu May 05 01:10:30 PDT 2011
+#Tue Oct 18 02:14:12 PDT 2011
 eclipse.preferences.version=1
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.compliance=1.6
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/com.google.eclipse.protobuf.test/META-INF/MANIFEST.MF b/com.google.eclipse.protobuf.test/META-INF/MANIFEST.MF
index f9e6122..dbf6497 100644
--- a/com.google.eclipse.protobuf.test/META-INF/MANIFEST.MF
+++ b/com.google.eclipse.protobuf.test/META-INF/MANIFEST.MF
@@ -10,7 +10,7 @@
  org.eclipse.xtext.junit4;bundle-version="2.0.0",
  org.mockito;bundle-version="1.8.5",
  org.eclipse.core.resources;bundle-version="3.7.100"
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
 Export-Package: com.google.eclipse.protobuf.junit.core,
  com.google.eclipse.protobuf.junit.matchers,
  com.google.eclipse.protobuf.junit.stubs.resources,
diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/core/IntegrationTestSetup.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/core/IntegrationTestSetup.java
index 647c6cc..90f239a 100644
--- a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/core/IntegrationTestSetup.java
+++ b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/core/IntegrationTestSetup.java
@@ -40,7 +40,7 @@
   }
   
   private static class FileUriResolver implements IFileUriResolver {
-    public String resolveUri(String importUri, Resource declaringResource) {
+    @Override public String resolveUri(String importUri, Resource declaringResource) {
       URI uri = URI.createURI(importUri);
       if (!isEmpty(uri.scheme())) return importUri; // already resolved.
       File file = protoFile(importUri);
diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/core/UnitTestSetup.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/core/UnitTestSetup.java
index dc0752a..ca4dd7b 100644
--- a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/core/UnitTestSetup.java
+++ b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/core/UnitTestSetup.java
@@ -34,7 +34,7 @@
   }
   
   private static class ExtensionRegistryProvider implements Provider<IExtensionRegistry> {
-    public IExtensionRegistry get() {
+    @Override public IExtensionRegistry get() {
       return mock(IExtensionRegistry.class);
     }
   }
diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/core/XtextRule.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/core/XtextRule.java
index 838d851..64a83af 100644
--- a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/core/XtextRule.java
+++ b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/core/XtextRule.java
@@ -54,7 +54,7 @@
     reader = new TestSourceReader();
   }
 
-  public Statement apply(Statement base, FrameworkMethod method, Object target) {
+  @Override public Statement apply(Statement base, FrameworkMethod method, Object target) {
     root = null;
     String comments = reader.commentsIn(method);
     if (!isEmpty(comments)) {
diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/matchers/EnumHasLiterals.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/matchers/EnumHasLiterals.java
index e768799..65fd42c 100644
--- a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/matchers/EnumHasLiterals.java
+++ b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/matchers/EnumHasLiterals.java
@@ -33,8 +33,7 @@
     this.literalNames = literalNames;
   }
   
-  /** {@inheritDoc} */
-  public boolean matches(Object arg) {
+  @Override public boolean matches(Object arg) {
     if (!(arg instanceof Enum)) return false;
     Enum anEnum = (Enum) arg;
     List<String> actualNames = literalNames(anEnum);
@@ -50,8 +49,7 @@
     return names;
   }
   
-  /** {@inheritDoc} */
-  public void describeTo(Description description) {
+  @Override public void describeTo(Description description) {
     description.appendValue(Arrays.toString(literalNames));
   }
 }
diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/matchers/PropertyHasType.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/matchers/PropertyHasType.java
index 102325d..066216c 100644
--- a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/matchers/PropertyHasType.java
+++ b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/matchers/PropertyHasType.java
@@ -35,8 +35,7 @@
     this.typeName = typeName;
   }
 
-  /** {@inheritDoc} */
-  public boolean matches(Object arg) {
+  @Override public boolean matches(Object arg) {
     if (!(arg instanceof Property)) return false;
     Property property = (Property) arg;
     return typeName.equals(typeNameOf(property));
@@ -52,8 +51,7 @@
     return r.toString();
   }
 
-  /** {@inheritDoc} */
-  public void describeTo(Description description) {
+  @Override public void describeTo(Description description) {
     description.appendValue(typeName);
   }
 }
diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/stubs/protobuf/PackageStub.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/stubs/protobuf/PackageStub.java
index 87be946..016d558 100644
--- a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/stubs/protobuf/PackageStub.java
+++ b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/stubs/protobuf/PackageStub.java
@@ -29,107 +29,107 @@
   }
 
   /** {@inheritDoc} */
-  public EClass eClass() {
+  @Override public EClass eClass() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public Resource eResource() {
+  @Override public Resource eResource() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public EObject eContainer() {
+  @Override public EObject eContainer() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public EStructuralFeature eContainingFeature() {
+  @Override public EStructuralFeature eContainingFeature() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public EReference eContainmentFeature() {
+  @Override public EReference eContainmentFeature() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public EList<EObject> eContents() {
+  @Override public EList<EObject> eContents() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public TreeIterator<EObject> eAllContents() {
+  @Override public TreeIterator<EObject> eAllContents() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public boolean eIsProxy() {
+  @Override public boolean eIsProxy() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public EList<EObject> eCrossReferences() {
+  @Override public EList<EObject> eCrossReferences() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public Object eGet(EStructuralFeature feature) {
+  @Override public Object eGet(EStructuralFeature feature) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public Object eGet(EStructuralFeature feature, boolean resolve) {
+  @Override public Object eGet(EStructuralFeature feature, boolean resolve) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void eSet(EStructuralFeature feature, Object newValue) {
+  @Override public void eSet(EStructuralFeature feature, Object newValue) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public boolean eIsSet(EStructuralFeature feature) {
+  @Override public boolean eIsSet(EStructuralFeature feature) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void eUnset(EStructuralFeature feature) {
+  @Override public void eUnset(EStructuralFeature feature) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public Object eInvoke(EOperation operation, EList<?> arguments) {
+  @Override public Object eInvoke(EOperation operation, EList<?> arguments) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public EList<Adapter> eAdapters() {
+  @Override public EList<Adapter> eAdapters() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public boolean eDeliver() {
+  @Override public boolean eDeliver() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void eSetDeliver(boolean deliver) {
+  @Override public void eSetDeliver(boolean deliver) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void eNotify(Notification notification) {
+  @Override public void eNotify(Notification notification) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public String getName() {
+  @Override public String getName() {
     return name;
   }
 
   /** {@inheritDoc} */
-  public void setName(String value) {
+  @Override public void setName(String value) {
     name = value;
   }
 
diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/stubs/resources/FileStub.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/stubs/resources/FileStub.java
index d5e6136..67ede73 100644
--- a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/stubs/resources/FileStub.java
+++ b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/stubs/resources/FileStub.java
@@ -28,203 +28,203 @@
   private IPath location;
 
   /** {@inheritDoc} */
-  public void accept(IResourceProxyVisitor visitor, int memberFlags) {
+  @Override public void accept(IResourceProxyVisitor visitor, int memberFlags) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void accept(IResourceVisitor visitor) {
+  @Override public void accept(IResourceVisitor visitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void accept(IResourceVisitor visitor, int depth, boolean includePhantoms) {
+  @Override public void accept(IResourceVisitor visitor, int depth, boolean includePhantoms) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void accept(IResourceVisitor visitor, int depth, int memberFlags) {
+  @Override public void accept(IResourceVisitor visitor, int depth, int memberFlags) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void appendContents(InputStream source, boolean force, boolean keepHistory, IProgressMonitor monitor)
+  @Override public void appendContents(InputStream source, boolean force, boolean keepHistory, IProgressMonitor monitor)
       {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void appendContents(InputStream source, int updateFlags, IProgressMonitor monitor) {
+  @Override public void appendContents(InputStream source, int updateFlags, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void clearHistory(IProgressMonitor monitor) {
+  @Override public void clearHistory(IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public boolean contains(ISchedulingRule rule) {
+  @Override public boolean contains(ISchedulingRule rule) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void copy(IPath destination, boolean force, IProgressMonitor monitor) {
+  @Override public void copy(IPath destination, boolean force, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void copy(IPath destination, int updateFlags, IProgressMonitor monitor) {
+  @Override public void copy(IPath destination, int updateFlags, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void copy(IProjectDescription description, boolean force, IProgressMonitor monitor) {
+  @Override public void copy(IProjectDescription description, boolean force, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void copy(IProjectDescription description, int updateFlags, IProgressMonitor monitor) {
+  @Override public void copy(IProjectDescription description, int updateFlags, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void create(InputStream source, boolean force, IProgressMonitor monitor) {
+  @Override public void create(InputStream source, boolean force, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void create(InputStream source, int updateFlags, IProgressMonitor monitor) {
+  @Override public void create(InputStream source, int updateFlags, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void createLink(IPath localLocation, int updateFlags, IProgressMonitor monitor) {
+  @Override public void createLink(IPath localLocation, int updateFlags, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void createLink(URI location, int updateFlags, IProgressMonitor monitor) {
+  @Override public void createLink(URI location, int updateFlags, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public IMarker createMarker(String type) {
+  @Override public IMarker createMarker(String type) {
     MarkerStub marker = new MarkerStub(type);
     addMarker(marker);
     return marker;
   }
 
   /** {@inheritDoc} */
-  public IResourceProxy createProxy() {
+  @Override public IResourceProxy createProxy() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void delete(boolean force, boolean keepHistory, IProgressMonitor monitor) {
+  @Override public void delete(boolean force, boolean keepHistory, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void delete(boolean force, IProgressMonitor monitor) {
+  @Override public void delete(boolean force, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void delete(int updateFlags, IProgressMonitor monitor) {
+  @Override public void delete(int updateFlags, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void deleteMarkers(String type, boolean includeSubtypes, int depth) {
+  @Override public void deleteMarkers(String type, boolean includeSubtypes, int depth) {
     List<MarkerStub> markers = markersByType.get(type);
     if (markers != null) markers.clear();
   }
 
   /** {@inheritDoc} */
-  public boolean exists() {
+  @Override public boolean exists() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public IMarker findMarker(long id) {
+  @Override public IMarker findMarker(long id) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public IMarker[] findMarkers(String type, boolean includeSubtypes, int depth) {
+  @Override public IMarker[] findMarkers(String type, boolean includeSubtypes, int depth) {
     List<MarkerStub> markers = markersByType.get(type);
     if (markers == null) return new IMarker[0];
     return markers.toArray(new IMarker[markers.size()]);
   }
 
   /** {@inheritDoc} */
-  public int findMaxProblemSeverity(String type, boolean includeSubtypes, int depth) {
+  @Override public int findMaxProblemSeverity(String type, boolean includeSubtypes, int depth) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  @SuppressWarnings("rawtypes") public Object getAdapter(Class adapter) {
+  @Override @SuppressWarnings("rawtypes") public Object getAdapter(Class adapter) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public String getCharset() {
+  @Override public String getCharset() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public String getCharset(boolean checkImplicit) {
+  @Override public String getCharset(boolean checkImplicit) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public String getCharsetFor(Reader reader) {
+  @Override public String getCharsetFor(Reader reader) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public IContentDescription getContentDescription() {
+  @Override public IContentDescription getContentDescription() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public InputStream getContents() {
+  @Override public InputStream getContents() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public InputStream getContents(boolean force) {
+  @Override public InputStream getContents(boolean force) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  @Deprecated public int getEncoding() {
+  @Override @Deprecated public int getEncoding() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public String getFileExtension() {
+  @Override public String getFileExtension() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public IPath getFullPath() {
+  @Override public IPath getFullPath() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public IFileState[] getHistory(IProgressMonitor monitor) {
+  @Override public IFileState[] getHistory(IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public long getLocalTimeStamp() {
+  @Override public long getLocalTimeStamp() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public IPath getLocation() {
+  @Override public IPath getLocation() {
     return location;
   }
 
@@ -233,286 +233,286 @@
   }
 
   /** {@inheritDoc} */
-  public URI getLocationURI() {
+  @Override public URI getLocationURI() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public IMarker getMarker(long id) {
+  @Override public IMarker getMarker(long id) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public long getModificationStamp() {
+  @Override public long getModificationStamp() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public String getName() {
+  @Override public String getName() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public IContainer getParent() {
+  @Override public IContainer getParent() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public IPathVariableManager getPathVariableManager() {
+  @Override public IPathVariableManager getPathVariableManager() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public Map<QualifiedName, String> getPersistentProperties() {
+  @Override public Map<QualifiedName, String> getPersistentProperties() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public String getPersistentProperty(QualifiedName key) {
+  @Override public String getPersistentProperty(QualifiedName key) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public IProject getProject() {
+  @Override public IProject getProject() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public IPath getProjectRelativePath() {
+  @Override public IPath getProjectRelativePath() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public IPath getRawLocation() {
+  @Override public IPath getRawLocation() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public URI getRawLocationURI() {
+  @Override public URI getRawLocationURI() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public ResourceAttributes getResourceAttributes() {
+  @Override public ResourceAttributes getResourceAttributes() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public Map<QualifiedName, Object> getSessionProperties() {
+  @Override public Map<QualifiedName, Object> getSessionProperties() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public Object getSessionProperty(QualifiedName key) {
+  @Override public Object getSessionProperty(QualifiedName key) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public int getType() {
+  @Override public int getType() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public IWorkspace getWorkspace() {
+  @Override public IWorkspace getWorkspace() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public boolean isAccessible() {
+  @Override public boolean isAccessible() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public boolean isConflicting(ISchedulingRule rule) {
+  @Override public boolean isConflicting(ISchedulingRule rule) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public boolean isDerived() {
+  @Override public boolean isDerived() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public boolean isDerived(int options) {
+  @Override public boolean isDerived(int options) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public boolean isHidden() {
+  @Override public boolean isHidden() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public boolean isHidden(int options) {
+  @Override public boolean isHidden(int options) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public boolean isLinked() {
+  @Override public boolean isLinked() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public boolean isLinked(int options) {
+  @Override public boolean isLinked(int options) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  @Deprecated public boolean isLocal(int depth) {
+  @Override @Deprecated public boolean isLocal(int depth) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public boolean isPhantom() {
+  @Override public boolean isPhantom() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public boolean isReadOnly() {
+  @Override public boolean isReadOnly() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public boolean isSynchronized(int depth) {
+  @Override public boolean isSynchronized(int depth) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public boolean isTeamPrivateMember() {
+  @Override public boolean isTeamPrivateMember() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public boolean isTeamPrivateMember(int options) {
+  @Override public boolean isTeamPrivateMember(int options) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public boolean isVirtual() {
+  @Override public boolean isVirtual() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void move(IPath destination, boolean force, boolean keepHistory, IProgressMonitor monitor)
+  @Override public void move(IPath destination, boolean force, boolean keepHistory, IProgressMonitor monitor)
       {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void move(IPath destination, boolean force, IProgressMonitor monitor) {
+  @Override public void move(IPath destination, boolean force, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void move(IPath destination, int updateFlags, IProgressMonitor monitor) {
+  @Override public void move(IPath destination, int updateFlags, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void move(IProjectDescription description, boolean force, boolean keepHistory, IProgressMonitor monitor)
+  @Override public void move(IProjectDescription description, boolean force, boolean keepHistory, IProgressMonitor monitor)
       {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void move(IProjectDescription description, int updateFlags, IProgressMonitor monitor) {
+  @Override public void move(IProjectDescription description, int updateFlags, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void refreshLocal(int depth, IProgressMonitor monitor) {
+  @Override public void refreshLocal(int depth, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void revertModificationStamp(long value) {
+  @Override public void revertModificationStamp(long value) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  @Deprecated public void setCharset(String newCharset) {
+  @Override @Deprecated public void setCharset(String newCharset) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void setCharset(String newCharset, IProgressMonitor monitor) {
+  @Override public void setCharset(String newCharset, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void setContents(IFileState source, boolean force, boolean keepHistory, IProgressMonitor monitor)
+  @Override public void setContents(IFileState source, boolean force, boolean keepHistory, IProgressMonitor monitor)
       {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void setContents(IFileState source, int updateFlags, IProgressMonitor monitor) {
+  @Override public void setContents(IFileState source, int updateFlags, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void setContents(InputStream source, boolean force, boolean keepHistory, IProgressMonitor monitor)
+  @Override public void setContents(InputStream source, boolean force, boolean keepHistory, IProgressMonitor monitor)
       {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void setContents(InputStream source, int updateFlags, IProgressMonitor monitor) {
+  @Override public void setContents(InputStream source, int updateFlags, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  @Deprecated public void setDerived(boolean isDerived) {
+  @Override @Deprecated public void setDerived(boolean isDerived) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void setDerived(boolean isDerived, IProgressMonitor monitor) {
+  @Override public void setDerived(boolean isDerived, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void setHidden(boolean isHidden) {
+  @Override public void setHidden(boolean isHidden) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  @Deprecated public void setLocal(boolean flag, int depth, IProgressMonitor monitor) {
+  @Override @Deprecated public void setLocal(boolean flag, int depth, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public long setLocalTimeStamp(long value) {
+  @Override public long setLocalTimeStamp(long value) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void setPersistentProperty(QualifiedName key, String value) {
+  @Override public void setPersistentProperty(QualifiedName key, String value) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  @Deprecated public void setReadOnly(boolean readOnly) {
+  @Override @Deprecated public void setReadOnly(boolean readOnly) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void setResourceAttributes(ResourceAttributes attributes) {
+  @Override public void setResourceAttributes(ResourceAttributes attributes) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void setSessionProperty(QualifiedName key, Object value) {
+  @Override public void setSessionProperty(QualifiedName key, Object value) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void setTeamPrivateMember(boolean isTeamPrivate) {
+  @Override public void setTeamPrivateMember(boolean isTeamPrivate) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void touch(IProgressMonitor monitor) {
+  @Override public void touch(IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/stubs/resources/MarkerStub.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/stubs/resources/MarkerStub.java
index c34ef25..cdc7eae 100644
--- a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/stubs/resources/MarkerStub.java
+++ b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/stubs/resources/MarkerStub.java
@@ -12,8 +12,7 @@
 
 import java.util.*;
 
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.*;
 
 /**
  * @author alruiz@google.com (Alex Ruiz)
@@ -38,53 +37,53 @@
   }
 
   /** {@inheritDoc} */
-  @SuppressWarnings("rawtypes") public Object getAdapter(Class adapter) {
+  @Override @SuppressWarnings("rawtypes") public Object getAdapter(Class adapter) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void delete() {
+  @Override public void delete() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public boolean exists() {
+  @Override public boolean exists() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public Object getAttribute(String attributeName) {
+  @Override public Object getAttribute(String attributeName) {
     return attributes.get(attributeName);
   }
 
   /** {@inheritDoc} */
-  public int getAttribute(String attributeName, int defaultValue) {
+  @Override public int getAttribute(String attributeName, int defaultValue) {
     Object attribute = attributes.get(attributeName);
     if (attribute instanceof Integer) return (Integer) attribute;
     return defaultValue;
   }
 
   /** {@inheritDoc} */
-  public String getAttribute(String attributeName, String defaultValue) {
+  @Override public String getAttribute(String attributeName, String defaultValue) {
     Object attribute = attributes.get(attributeName);
     if (attribute instanceof String) return (String) attribute;
     return defaultValue;
   }
 
   /** {@inheritDoc} */
-  public boolean getAttribute(String attributeName, boolean defaultValue) {
+  @Override public boolean getAttribute(String attributeName, boolean defaultValue) {
     Object attribute = attributes.get(attributeName);
     if (attribute instanceof Boolean) return (Boolean) attribute;
     return defaultValue;
   }
 
   /** {@inheritDoc} */
-  public Map<String, Object> getAttributes() {
+  @Override public Map<String, Object> getAttributes() {
     return unmodifiableMap(attributes);
   }
 
   /** {@inheritDoc} */
-  public Object[] getAttributes(String[] attributeNames) {
+  @Override public Object[] getAttributes(String[] attributeNames) {
     List<Object> values = new ArrayList<Object>();
     for (String name : attributeNames)
       values.add(attributes.get(name));
@@ -92,52 +91,52 @@
   }
 
   /** {@inheritDoc} */
-  public long getCreationTime() {
+  @Override public long getCreationTime() {
     return creationTime;
   }
 
   /** {@inheritDoc} */
-  public long getId() {
+  @Override public long getId() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public IResource getResource() {
+  @Override public IResource getResource() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public String getType() {
+  @Override public String getType() {
     return type;
   }
 
   /** {@inheritDoc} */
-  public boolean isSubtypeOf(String superType) {
+  @Override public boolean isSubtypeOf(String superType) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void setAttribute(String attributeName, int value) {
+  @Override public void setAttribute(String attributeName, int value) {
     attributes.put(attributeName, value);
   }
 
   /** {@inheritDoc} */
-  public void setAttribute(String attributeName, Object value) {
+  @Override public void setAttribute(String attributeName, Object value) {
     attributes.put(attributeName, value);
   }
 
   /** {@inheritDoc} */
-  public void setAttribute(String attributeName, boolean value) {
+  @Override public void setAttribute(String attributeName, boolean value) {
     attributes.put(attributeName, value);
   }
 
   /** {@inheritDoc} */
-  public void setAttributes(String[] attributeNames, Object[] values) {
+  @Override public void setAttributes(String[] attributeNames, Object[] values) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void setAttributes(Map<String, ? extends Object> attributes) {
+  @Override public void setAttributes(Map<String, ? extends Object> attributes) {
     this.attributes.putAll(attributes);
   }
 
diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/stubs/resources/ResourceStub.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/stubs/resources/ResourceStub.java
index 45389bc..7af740a 100644
--- a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/stubs/resources/ResourceStub.java
+++ b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/stubs/resources/ResourceStub.java
@@ -10,16 +10,13 @@
 
 import static org.eclipse.emf.common.util.URI.createURI;
 
-import java.io.InputStream;
-import java.io.OutputStream;
+import java.io.*;
 import java.util.Map;
 
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.*;
 import org.eclipse.emf.common.util.*;
 import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.resource.*;
 
 /**
  * @author alruiz@google.com (Alex Ruiz)
@@ -35,132 +32,132 @@
   }
   
   /** {@inheritDoc} */
-  public EList<Adapter> eAdapters() {
+  @Override public EList<Adapter> eAdapters() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public boolean eDeliver() {
+  @Override public boolean eDeliver() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void eSetDeliver(boolean deliver) {
+  @Override public void eSetDeliver(boolean deliver) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void eNotify(Notification notification) {
+  @Override public void eNotify(Notification notification) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public ResourceSet getResourceSet() {
+  @Override public ResourceSet getResourceSet() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public URI getURI() {
+  @Override public URI getURI() {
     return uri;
   }
 
   /** {@inheritDoc} */
-  public void setURI(URI uri) {
+  @Override public void setURI(URI uri) {
     this.uri = uri;
   }
 
   /** {@inheritDoc} */
-  public long getTimeStamp() {
+  @Override public long getTimeStamp() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void setTimeStamp(long timeStamp) {
+  @Override public void setTimeStamp(long timeStamp) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public EList<EObject> getContents() {
+  @Override public EList<EObject> getContents() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public TreeIterator<EObject> getAllContents() {
+  @Override public TreeIterator<EObject> getAllContents() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public String getURIFragment(EObject eObject) {
+  @Override public String getURIFragment(EObject eObject) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public EObject getEObject(String uriFragment) {
+  @Override public EObject getEObject(String uriFragment) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void save(Map<?, ?> options) {
+  @Override public void save(Map<?, ?> options) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void load(Map<?, ?> options) {
+  @Override public void load(Map<?, ?> options) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void save(OutputStream outputStream, Map<?, ?> options) {
+  @Override public void save(OutputStream outputStream, Map<?, ?> options) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void load(InputStream inputStream, Map<?, ?> options) {
+  @Override public void load(InputStream inputStream, Map<?, ?> options) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public boolean isTrackingModification() {
+  @Override public boolean isTrackingModification() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void setTrackingModification(boolean isTrackingModification) {
+  @Override public void setTrackingModification(boolean isTrackingModification) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public boolean isModified() {
+  @Override public boolean isModified() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void setModified(boolean isModified) {
+  @Override public void setModified(boolean isModified) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public boolean isLoaded() {
+  @Override public boolean isLoaded() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void unload() {
+  @Override public void unload() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void delete(Map<?, ?> options) {
+  @Override public void delete(Map<?, ?> options) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public EList<Diagnostic> getErrors() {
+  @Override public EList<Diagnostic> getErrors() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public EList<Diagnostic> getWarnings() {
+  @Override public EList<Diagnostic> getWarnings() {
     throw new UnsupportedOperationException();
   }
 
