Made missing Modifier 'optional' by default to handle oneof fields.
Added support for 'repeated oneof' (arrays of unions).
diff --git a/com.google.eclipse.protobuf.feature/feature.xml b/com.google.eclipse.protobuf.feature/feature.xml
index c4de350..4fac131 100644
--- a/com.google.eclipse.protobuf.feature/feature.xml
+++ b/com.google.eclipse.protobuf.feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="com.google.eclipse.protobuf"
       label="%featureName"
-      version="1.4.3.qualifier"
+      version="1.5.0.qualifier"
       provider-name="%providerName">
 
    <description url="https://code.google.com/p/protobuf-dt/">
diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/model/util/IndexedElements_calculateNewIndexFor_Test.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/model/util/IndexedElements_calculateNewIndexFor_Test.java
index afade5d..db7b19a 100644
--- a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/model/util/IndexedElements_calculateNewIndexFor_Test.java
+++ b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/model/util/IndexedElements_calculateNewIndexFor_Test.java
@@ -40,7 +40,7 @@
   @Test public void should_return_one_for_first_and_only_field() {
     MessageField field = xtext.find("name", MessageField.class);
     long index = indexedElements.calculateNewIndexFor(field);
-    assertThat(index, equalTo(1L));
+    assertThat(index, equalTo(3L));
   }
 
   // syntax = "proto2";
@@ -52,6 +52,6 @@
   @Test public void should_return_max_index_value_plus_one_for_new_field() {
     MessageField field = xtext.find("id", MessageField.class);
     long index = indexedElements.calculateNewIndexFor(field);
-    assertThat(index, equalTo(7L));
+    assertThat(index, equalTo(9L));
   }
 }
diff --git a/com.google.eclipse.protobuf.ui/META-INF/MANIFEST.MF b/com.google.eclipse.protobuf.ui/META-INF/MANIFEST.MF
index c71eae4..67642e8 100644
--- a/com.google.eclipse.protobuf.ui/META-INF/MANIFEST.MF
+++ b/com.google.eclipse.protobuf.ui/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2

 Bundle-Name: %Bundle-Name

 Bundle-Vendor: %Bundle-Vendor

-Bundle-Version: 1.4.3.qualifier

+Bundle-Version: 1.5.1.qualifier

 Bundle-SymbolicName: com.google.eclipse.protobuf.ui; singleton:=true

 Bundle-ActivationPolicy: lazy

 Require-Bundle: com.google.eclipse.protobuf;visibility:=reexport,

diff --git a/com.google.eclipse.protobuf/META-INF/MANIFEST.MF b/com.google.eclipse.protobuf/META-INF/MANIFEST.MF
index 2476c62..7a531b1 100644
--- a/com.google.eclipse.protobuf/META-INF/MANIFEST.MF
+++ b/com.google.eclipse.protobuf/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Eclipse-ExtensibleAPI: true

 Bundle-Name: %Bundle-Name

 Bundle-Vendor: %Bundle-Vendor

-Bundle-Version: 1.4.3.qualifier

+Bundle-Version: 1.5.1.qualifier

 Bundle-SymbolicName: com.google.eclipse.protobuf; singleton:=true

 Bundle-ActivationPolicy: lazy

 Require-Bundle: com.ibm.icu;resolution:=optional,

diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/Protobuf.xtext b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/Protobuf.xtext
index 57722aa..35f14b9 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/Protobuf.xtext
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/Protobuf.xtext
@@ -64,16 +64,22 @@
   elements+=GroupElement*
   '}' (';')?;
 
+UnmodifiedGroup returns Group:
+  =>'group' name=Name '=' index=(LONG | HEX)
+  ('[' (fieldOptions+=FieldOption (',' fieldOptions+=FieldOption)*) ']')? '{'
+  elements+=GroupElement*
+  '}' (';')?;
+
 GroupElement:
   Option | IndexedElement | ComplexType | TypeExtension | Extensions;
-  
+
 OneOf:
-  'oneof' name=Name '{'
-  elements+=OneOfElement*
+  (isRepeated?='repeated')? 'oneof' name=Name '{'
+  elements+=OneOfElement+
   '}' (';')?;
-  
+
 OneOfElement returns MessageElement:
-  Extensions | UnmodifiedMessageField;
+  Extensions | UnmodifiedGroup | UnmodifiedMessageField;
 
 Extensions:
   'extensions' ranges+=Range (',' ranges+=Range)* (';')+;
@@ -87,7 +93,7 @@
   ('[' (fieldOptions+=FieldOption (',' fieldOptions+=FieldOption)*)? ']')? (';')+;
 
 enum Modifier:
-  required | optional | repeated;
+  optional | required | repeated;
 
 TypeLink:
   ScalarTypeLink | ComplexTypeLink;
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/ProtobufRuntimeModule.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/ProtobufRuntimeModule.java
index 26c8496..bae304a 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/ProtobufRuntimeModule.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/ProtobufRuntimeModule.java
@@ -8,23 +8,10 @@
  */
 package com.google.eclipse.protobuf;
 
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.xtext.conversion.IValueConverterService;
-import org.eclipse.xtext.naming.IQualifiedNameConverter;
-import org.eclipse.xtext.naming.IQualifiedNameProvider;
-import org.eclipse.xtext.parser.IAstFactory;
-import org.eclipse.xtext.parser.antlr.ISyntaxErrorMessageProvider;
-import org.eclipse.xtext.resource.IGlobalServiceProvider;
-import org.eclipse.xtext.resource.XtextResource;
-import org.eclipse.xtext.resource.XtextResourceSet;
-import org.eclipse.xtext.scoping.impl.ImportUriResolver;
-import org.eclipse.xtext.validation.IResourceValidator;
-
 import com.google.eclipse.protobuf.conversion.ProtobufTerminalConverters;
 import com.google.eclipse.protobuf.linking.ProtobufResource;
 import com.google.eclipse.protobuf.naming.ProtobufQualifiedNameConverter;
 import com.google.eclipse.protobuf.naming.ProtobufQualifiedNameProvider;
-import com.google.eclipse.protobuf.parser.ProtobufAstFactory;
 import com.google.eclipse.protobuf.resource.FastXtextResourceSet;
 import com.google.eclipse.protobuf.resource.GlobalResourceServiceProvider;
 import com.google.eclipse.protobuf.scoping.ExtensionRegistryProvider;
@@ -33,6 +20,17 @@
 import com.google.eclipse.protobuf.validation.ProtobufSyntaxErrorMessageProvider;
 import com.google.inject.Binder;
 
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.xtext.conversion.IValueConverterService;
+import org.eclipse.xtext.naming.IQualifiedNameConverter;
+import org.eclipse.xtext.naming.IQualifiedNameProvider;
+import org.eclipse.xtext.parser.antlr.ISyntaxErrorMessageProvider;
+import org.eclipse.xtext.resource.IGlobalServiceProvider;
+import org.eclipse.xtext.resource.XtextResource;
+import org.eclipse.xtext.resource.XtextResourceSet;
+import org.eclipse.xtext.scoping.impl.ImportUriResolver;
+import org.eclipse.xtext.validation.IResourceValidator;
+
 /**
  * Use this class to register components to be used at runtime / without the Equinox extension registry.
  */
@@ -49,10 +47,6 @@
     return ProtobufQualifiedNameConverter.class;
   }
   
-  @Override public Class<? extends IAstFactory> bindIAstFactory() {
-    return ProtobufAstFactory.class;
-  }
-
   @Override public Class<? extends IQualifiedNameProvider> bindIQualifiedNameProvider() {
     return ProtobufQualifiedNameProvider.class;
   }
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/parser/ProtobufAstFactory.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/parser/ProtobufAstFactory.java
deleted file mode 100644
index dc8dc4f..0000000
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/parser/ProtobufAstFactory.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.google.eclipse.protobuf.parser;
-import com.google.eclipse.protobuf.protobuf.MessageField;
-import com.google.eclipse.protobuf.protobuf.Modifier;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.xtext.conversion.ValueConverterException;
-import org.eclipse.xtext.nodemodel.INode;
-import org.eclipse.xtext.parser.DefaultEcoreElementFactory;
-
-public class ProtobufAstFactory extends DefaultEcoreElementFactory {
-  private static final String UNMODIFIEDMESSAGEFIELD_RULE = "UnmodifiedMessageField";
-  private static final String ONEOFELEMENT_RULE = "OneOfElement";
-
-  @Override
-  public void add(EObject object, String feature, Object value, String ruleName, INode node)
-      throws ValueConverterException {
-    // TODO(foremans): Auto-generated method stub
-    super.add(object, feature, value, ruleName, node);
-    if (ONEOFELEMENT_RULE.equals(ruleName) && value instanceof MessageField) {
-      MessageField field = (MessageField) value;
-      field.setModifier(Modifier.OPTIONAL);
-    }
-  }
-  
-  @Override
-  public void set(EObject object, String feature, Object value, String ruleName, INode node)
-      throws ValueConverterException {
-    super.set(object, feature, value, ruleName, node);
-    if (UNMODIFIEDMESSAGEFIELD_RULE.equals(ruleName)) {
-      MessageField field = (MessageField) object;
-      field.setModifier(Modifier.OPTIONAL);
-    }
-  }
-}
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/ProtobufJavaValidator.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/ProtobufJavaValidator.java
index 82a7ed5..38bc64e 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/ProtobufJavaValidator.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/ProtobufJavaValidator.java
@@ -75,6 +75,9 @@
     }
     
     EObject container = e.eContainer();
+    if (container instanceof OneOf) {
+      container = container.eContainer();  
+    }
     if (container instanceof Message) {
       Message message = (Message) container;
       Iterable<MessageElement> elements = message.getElements();