Index: src/test/resources/maven.mdo
===================================================================
--- src/test/resources/maven.mdo	(revision 525)
+++ src/test/resources/maven.mdo	(working copy)
@@ -17,6 +17,7 @@
  |
  -->
 <model>
+  <modelVersion>4.0.0</modelVersion>
   <id>maven</id>
   <name>Maven</name>
   <description>Maven's model for Java project.</description>
Index: src/test/verifiers/xpp3/expected.xml
===================================================================
--- src/test/verifiers/xpp3/expected.xml	(revision 525)
+++ src/test/verifiers/xpp3/expected.xml	(working copy)
@@ -1,5 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?><mavenModel extender="/foo/bar" modelVersion="4.0.0">
+  <groupId>com.example.foo</groupId>
+  <artifactId>foo</artifactId>
   <name>Maven</name>
+  <version>1.0</version>
+  <inceptionYear>2005</inceptionYear>
   <component>
     <name>component1</name>
   </component>
Index: src/test/verifiers/xpp3/expected-encoding.xml
===================================================================
--- src/test/verifiers/xpp3/expected-encoding.xml	(revision 525)
+++ src/test/verifiers/xpp3/expected-encoding.xml	(working copy)
@@ -1,4 +1,5 @@
-<mavenModel extender="/foo/bar" modelVersion="4.0.0">
+<mavenModel extender="/foo/bar">
+  <modelVersion>4.0.0</modelVersion>
   <name>Maven#&x00A9;</name>
   <component>
     <name>component1</name>
@@ -6,6 +7,8 @@
   <component>
     <name>component2</name>
   </component>
+  <groupId>com.example.foo</groupId>
+  <artifactId>foo</artifactId>
   <repositories>
     <repo>
       <id>foo</id>
Index: src/test/verifiers/xpp3/Xpp3Verifier.java
===================================================================
--- src/test/verifiers/xpp3/Xpp3Verifier.java	(revision 525)
+++ src/test/verifiers/xpp3/Xpp3Verifier.java	(working copy)
@@ -153,6 +153,11 @@
         component.setName( "component2" );
 
         expected.addComponent( component );
+        
+        expected.setGroupId( "com.example.foo" );
+        expected.setArtifactId( "foo" );
+        expected.setVersion( "1.0" );
+        expected.setInceptionYear( "2005" );
 
         Repository repository = new Repository();
         repository.setId( "foo" );
@@ -208,7 +213,9 @@
         // Test that the entities is properly resolved
         // ----------------------------------------------------------------------
 
-        String xml = "<mavenModel>\n" + "  <groupId>Laugst&oslash;l</groupId>\n" + "</mavenModel>";
+        String xml = "<mavenModel>\n" + 
+                     "  <groupId>Laugst&oslash;l</groupId>\n" +
+                     "</mavenModel>";
 
         Model expected = new Model();
 
@@ -216,7 +223,7 @@
 
         expected.setGroupId( groupId );
 
-        Model actual = reader.read( new StringReader( xml ) );
+        Model actual = reader.read( new StringReader( xml ), false );
 
         assertModel( expected, actual );
     }
@@ -226,8 +233,10 @@
     {
         MavenXpp3Reader reader = new MavenXpp3Reader();
 
-        String xml = "<mavenModel>\n" + "  <website>http://maven.apache.org/website</website>\n" +
-            "  <organisation><name>my-org</name></organisation>\n" + "</mavenModel>";
+        String xml = "<mavenModel>\n" + 
+                     "  <website>http://maven.apache.org/website</website>\n" +
+                     "  <organisation><name>my-org</name></organisation>\n" + 
+                     "</mavenModel>";
 
         Model expected = new Model();
 
@@ -239,7 +248,7 @@
 
         expected.setOrganization( org );
 
-        Model actual = reader.read( new StringReader( xml ) );
+        Model actual = reader.read( new StringReader( xml ), false );
 
         assertModel( expected, actual );
     }
@@ -266,7 +275,7 @@
 
         try
         {
-            reader.read( new StringReader( xml ) );
+            reader.read( new StringReader( xml ), false );
             Assert.fail( "Should have obtained a parse error for duplicate build" );
         }
         catch ( XmlPullParserException expected )
Index: src/main/java/org/codehaus/modello/plugin/xpp3/Xpp3ReaderGenerator.java
===================================================================
--- src/main/java/org/codehaus/modello/plugin/xpp3/Xpp3ReaderGenerator.java	(revision 525)
+++ src/main/java/org/codehaus/modello/plugin/xpp3/Xpp3ReaderGenerator.java	(working copy)
@@ -365,15 +365,22 @@
         sc.add( "}" );
 
         String statement = "else if";
+        
+        boolean hasRequired = false;
 
         //Write other fields
 
         for ( Iterator i = modelClass.getAllFields( getGeneratedVersion(), true ).iterator(); i.hasNext(); )
         {
             ModelField field = (ModelField) i.next();
+            
+            if ( field.isRequired() )
+            {
+                hasRequired = true;
+            }
 
             XmlFieldMetadata fieldMetadata = (XmlFieldMetadata) field.getMetadata( XmlFieldMetadata.ID );
-
+            
             if ( fieldMetadata.isAttribute() )
             {
                 continue;
@@ -776,7 +783,53 @@
         sc.unindent();
 
         sc.add( "}" );
+        
+        if ( hasRequired )
+        {
+            sc.add( "/* Perform Required Checks */" );
+            
+            sc.add("if ( strict )");
+            
+            sc.add("{");
+            
+            sc.indent();
+            
+            for ( Iterator i = modelClass.getAllFields( getGeneratedVersion(), true ).iterator(); i.hasNext(); )
+            {
+                ModelField field = (ModelField) i.next();
+                
+                if ( !field.isRequired() )
+                {
+                    continue;
+                }
+                
+                XmlFieldMetadata fieldMetaData = (XmlFieldMetadata) field.getMetadata( XmlFieldMetadata.ID );
 
+                String tagName = fieldMetaData.getTagName();
+
+                if ( tagName == null )
+                {
+                    tagName = field.getName();
+                }
+                
+                sc.add( "if ( !parsed.contains( \"" + tagName + "\" ) )" );
+                
+                sc.add( "{" );
+                
+                sc.indent();
+                
+                sc.add( "throw new IllegalStateException( \"" + uncapClassName + "/" + tagName + " is required.\" );" );
+                
+                sc.unindent();
+                
+                sc.add( "}" );
+            }
+            
+            sc.unindent();
+            
+            sc.add( "}" );
+        }
+
         sc.add( "return " + uncapClassName + ";" );
 
         jClass.addMethod( unmarshall );
@@ -889,6 +942,11 @@
         {
             throw new IllegalArgumentException( "Unknown type: " + type );
         }
+        
+        if ( fieldMetaData.isAttribute() )
+        {
+            sc.add( "parsed.add( \"" + tagName + "\" );" );
+        }
     }
 
     private void writeParserInitialization( JSourceCode sc )

