Index: src/test/java/org/apache/maven/plugin/doap/stubs/AsfDoapProjectStub.java
===================================================================
--- src/test/java/org/apache/maven/plugin/doap/stubs/AsfDoapProjectStub.java	(revision 820375)
+++ src/test/java/org/apache/maven/plugin/doap/stubs/AsfDoapProjectStub.java	(working copy)
@@ -20,6 +20,7 @@
  */
 
 import java.io.File;
+import java.util.List;
 
 import org.apache.maven.model.Model;
 import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
@@ -60,6 +61,7 @@
         setDescription( model.getDescription() );
         setUrl( model.getUrl() );
         setPackaging( model.getPackaging() );
+        setDevelopers( model.getDevelopers() );
     }
 
     /** {@inheritDoc} */
@@ -67,4 +69,9 @@
     {
         return new File( super.getBasedir() + "/src/test/resources/unit/asf-doap-configuration/" );
     }
+    
+    /** {@inheritDoc} */
+    public List getDevelopers() {
+    	return model.getDevelopers();
+    }    
 }
Index: src/test/java/org/apache/maven/plugin/doap/stubs/DoapProjectStub.java
===================================================================
--- src/test/java/org/apache/maven/plugin/doap/stubs/DoapProjectStub.java	(revision 820375)
+++ src/test/java/org/apache/maven/plugin/doap/stubs/DoapProjectStub.java	(working copy)
@@ -20,6 +20,7 @@
  */
 
 import java.io.File;
+import java.util.List;
 
 import org.apache.maven.model.Model;
 import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
@@ -60,6 +61,7 @@
         setDescription( model.getDescription() );
         setUrl( model.getUrl() );
         setPackaging( model.getPackaging() );
+        setDevelopers( model.getDevelopers() );
     }
 
     /** {@inheritDoc} */
@@ -67,4 +69,9 @@
     {
         return new File( super.getBasedir() + "/src/test/resources/unit/doap-configuration/" );
     }
+
+    /** {@inheritDoc} */
+    public List getDevelopers() {
+    	return model.getDevelopers();
+    }
 }
Index: src/test/java/org/apache/maven/plugin/doap/DoapMojoTest.java
===================================================================
--- src/test/java/org/apache/maven/plugin/doap/DoapMojoTest.java	(revision 820375)
+++ src/test/java/org/apache/maven/plugin/doap/DoapMojoTest.java	(working copy)
@@ -101,6 +101,14 @@
         // ASF ext
         assertFalse( readed.indexOf( "<asfext:pmc rdf:resource=\"" + mavenProject.getUrl() + "\"/>" ) != -1 );
         assertFalse( readed.indexOf( "<asfext:name rdf:resource=\"" + mavenProject.getName() + "\"/>" ) != -1 );
+
+        // Developers and Organizations
+        assertTrue( readed.indexOf( "<maintainer>") != -1);
+        assertTrue( readed.indexOf("<foaf:Person rdf:nodeID=\"b1\">") != -1);
+        assertTrue( readed.indexOf( "<foaf:name>Jane Doe</foaf:name>") != -1);
+        assertTrue( readed.indexOf( "<foaf:Organization>") != -1);
+        assertTrue( readed.indexOf( "<foaf:homepage rdf:resource=\"http://www.example.org\"/>") != -1);
+        assertTrue( readed.indexOf( "<foaf:member rdf:nodeID=\"b1\"/>") != -1);
     }
 
     /**
Index: src/test/resources/unit/doap-configuration/doap-configuration-plugin-config.xml
===================================================================
--- src/test/resources/unit/doap-configuration/doap-configuration-plugin-config.xml	(revision 820375)
+++ src/test/resources/unit/doap-configuration/doap-configuration-plugin-config.xml	(working copy)
@@ -46,6 +46,21 @@
     <system>JIRA</system>
     <url>http://jira.codehaus.org/browse/MDOAPTEST</url>
   </issueManagement>
+  
+  <developers>
+	  <developer>
+	      <id>jdoe</id>
+	      <name>Jane Doe</name>
+	      <email>jdoe@example.org</email>
+	      <organization>Example Organization</organization>
+	      <organizationUrl>http://www.example.org</organizationUrl>
+          <roles>
+              <role>PMC Member</role>
+          </roles>
+	      <timezone>-8</timezone>
+      </developer>
+  </developers>
+  
 
   <build>
     <plugins>
Index: src/main/java/org/apache/maven/plugin/doap/DoapUtil.java
===================================================================
--- src/main/java/org/apache/maven/plugin/doap/DoapUtil.java	(revision 820375)
+++ src/main/java/org/apache/maven/plugin/doap/DoapUtil.java	(working copy)
@@ -24,9 +24,11 @@
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.Set;
 
 import org.apache.maven.model.Contributor;
 import org.apache.maven.model.Developer;
@@ -50,6 +52,12 @@
     /** RDF resource attribute */
     protected static final String RDF_RESOURCE = "rdf:resource";
 
+    /** RDF nodeID attribute */
+    protected static final String RDF_NODE_ID = "rdf:nodeID";
+    
+    /** DoaP Organizations stored by name */
+    private static Map organizations = new HashMap();
+
     /**
      * Write comments in the DOAP file header
      *
@@ -151,6 +159,28 @@
     }
 
     /**
+     * @param writer not null
+     * @param name not null
+     * @param value could be null. In this case, the element is not written.
+     * @throws IllegalArgumentException if name is null or empty
+     */
+    public static void writeRdfNodeIdElement( XMLWriter writer, String name, String value )
+        throws IllegalArgumentException
+    {
+        if ( StringUtils.isEmpty( name ) )
+        {
+            throw new IllegalArgumentException( "name should be defined" );
+        }
+
+        if ( value != null )
+        {
+            writer.startElement( name );
+            writer.addAttribute( RDF_NODE_ID, value );
+            writer.endElement();
+        }
+    }
+    
+    /**
      * @param i18n the internationalization component
      * @param developersOrContributors list of <code>{@link Developer}/{@link Contributor}</code>
      * @return a none null list of developers or contributors which have a <code>developer</code> DOAP role.
@@ -219,6 +249,72 @@
     {
         return (List) filterDevelopersOrContributorsByDoapRoles( i18n, developersOrContributors ).get( "unknowns" );
     }
+   
+    /**
+     * Utility class for keeping track of DOAP organizations in the DoaP mojo.
+     *
+     * @author <a href="mailto:t.fliss@gmail.com">Tim Fliss</a>
+     * @version $Id$
+     * @since 1.1
+     */
+    public static class Organization {
+        private String name;
+        private String url;
+        private List members = new LinkedList();
+        
+        public Organization(String name, String url) {
+            this.name = name; 
+            this.url = url;
+        }
+        
+        public void setName(String name) { this.name = name; }
+        public String getName() { return name; }
+        public void setUrl(String url) { this.url = url; }
+        public String getUrl() { return url; }
+        public void addMember(String nodeId) { members.add(nodeId); }
+        public List getMembers() { return members; }
+    };
+    
+    /**
+     * put an organization from the pom file in the organization list.
+     * 
+     * @param name from the pom file (e.g. Yoyodyne)
+     * @param url from the pom file (e.g. http://yoyodyne.example.org/about)
+     * @return the existing organization if a duplicate, or a new one.
+     */
+    public static Organization addOrganization(String name, String url) {
+        Organization organization = (Organization)organizations.get(name);
+        
+        if (organization == null) {
+            organization = new DoapUtil.Organization(name, url);
+        }
+        
+        organizations.put(name, organization);
+        return organization;
+    }
+    
+    // unique RDF blank node index scoped internal to the DOAP file 
+    private static int nodeNumber = 1;
+    
+    /**
+     * get a unique (within the DoaP file) RDF blank node ID
+     * 
+     * @return the nodeID
+     * @see <a href="http://www.w3.org/TR/rdf-syntax-grammar/#section-Syntax-blank-nodes">
+     * http://www.w3.org/TR/rdf-syntax-grammar/#section-Syntax-blank-nodes</a>
+     */
+    public static String getNodeId() {
+        return "b" + nodeNumber++;
+    }
+    
+    /**
+     * get the set of Organizations that people are members of
+     * 
+     * @return Map.EntrySet of DoapUtil.Organization
+     */
+    public static Set getOrganizations() {
+        return organizations.entrySet();
+    }
 
     // ----------------------------------------------------------------------
     // Private methods
Index: src/main/java/org/apache/maven/plugin/doap/DoapMojo.java
===================================================================
--- src/main/java/org/apache/maven/plugin/doap/DoapMojo.java	(revision 820375)
+++ src/main/java/org/apache/maven/plugin/doap/DoapMojo.java	(working copy)
@@ -33,6 +33,8 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
 import java.util.TimeZone;
 
 import org.apache.maven.artifact.Artifact;
@@ -407,6 +409,9 @@
         }
 
         writer.endElement(); // Project
+        
+        writeOrganizations(writer);
+        
         writer.endElement(); // rdf:RDF
 
         try
@@ -1252,7 +1257,9 @@
         String name;
         String email;
         String organization;
+        String organizationUrl;
         String homepage;
+        String nodeId = null;
 
         if ( Developer.class.isAssignableFrom( developerOrContributor.getClass() ) )
         {
@@ -1260,6 +1267,7 @@
             name = d.getName();
             email = d.getEmail();
             organization = d.getOrganization();
+            organizationUrl = d.getOrganizationUrl();
             homepage = d.getUrl();
         }
         else
@@ -1268,6 +1276,7 @@
             name = c.getName();
             email = c.getEmail();
             organization = c.getOrganization();
+            organizationUrl = c.getOrganizationUrl();
             homepage = c.getUrl();
         }
 
@@ -1277,8 +1286,18 @@
             return;
         }
 
+        if (!StringUtils.isEmpty(organization) || !StringUtils.isEmpty(organizationUrl)) {
+            DoapUtil.Organization doapOrganization = 
+                DoapUtil.addOrganization(organization, organizationUrl);
+            nodeId = DoapUtil.getNodeId();
+            doapOrganization.addMember(nodeId);
+        }
+
         writer.startElement( doapType );
         writer.startElement( "foaf:Person" );
+        if (StringUtils.isNotEmpty(nodeId)) {
+            writer.addAttribute("rdf:nodeID", nodeId);
+        }
         writer.startElement( "foaf:name" );
         writer.writeText( name );
         writer.endElement(); // foaf:name
@@ -1286,9 +1305,9 @@
         {
             DoapUtil.writeRdfResourceElement( writer, "foaf:mbox", "mailto:" + email );
         }
-        if ( StringUtils.isNotEmpty( organization ) )
+        if ( StringUtils.isNotEmpty( organization ) || StringUtils.isNotEmpty(organizationUrl) )
         {
-            DoapUtil.writeRdfResourceElement( writer, "foaf:Organization", organization );
+            DoapUtil.addOrganization(organization, organizationUrl);
         }
         if ( StringUtils.isNotEmpty( homepage ) )
         {
@@ -1519,6 +1538,42 @@
         }
     }
 
+    /**
+     * Write a Foaf Organization, for instance:
+     * <pre>
+     *   &lt;<foaf:Organization&gt;
+     *     &lt;foaf:name&gt;YoyoDyne&lt;/foaf:name&gt;
+     *     &lt;foaf:homepage rdf:resource="http://yoyodyne.example.org"/&gt;
+     *     &lt;foaf:member rdf:nodeID="benny_profane"&gt;
+     *   &lt;/foaf:Organization&gt;
+     * </pre>
+     *
+     * @param writer not null
+     * @param developersOrContributors list of <code>{@link Developer}/{@link Contributor}</code>
+     * @param doapType not null
+     * @see #writeDeveloperOrContributor(XMLWriter, Object, String)
+     */
+    private void writeOrganizations( XMLWriter writer )
+    {
+        Set organizations = DoapUtil.getOrganizations();
+        
+        for (Iterator it = organizations.iterator(); it.hasNext();) {
+            DoapUtil.Organization organization = (DoapUtil.Organization)((Map.Entry)it.next()).getValue();
+            writer.startElement( "foaf:Organization" );
+            if (!StringUtils.isEmpty(organization.getName())) {
+                DoapUtil.writeElement(writer, "foaf:name", organization.getName());
+            }
+            if (!StringUtils.isEmpty(organization.getUrl())) {
+                DoapUtil.writeRdfResourceElement(writer, "foaf:homepage", organization.getUrl());
+            }
+            List members = organization.getMembers();
+            for (Iterator memberIterator = members.iterator(); memberIterator.hasNext();) {
+                DoapUtil.writeRdfNodeIdElement(writer, "foaf:member", (String)memberIterator.next());
+            }
+            writer.endElement();  // foaf:Organization
+        }
+    }
+    
     // ----------------------------------------------------------------------
     // Static methods
     // ----------------------------------------------------------------------
