diff -urpN ./composite_old/composite.module ./composite/composite.module
--- ./composite_old/composite.module	2009-09-12 08:56:18.000000000 +0200
+++ ./composite/composite.module	2010-05-17 17:41:01.688843000 +0200

@@ -603,14 +603,24 @@ function composite_load($node) {
 function composite_view($node, $layout = array(), $references = array()) {
   $composite_content = array();
   $references = _composite_references_preprocess($references, $layout['zones'], FALSE);
-
   foreach (element_children($references) as $id) {
     $reference = $references[$id];
     // Filter out items not in a displayable zone
     if (array_key_exists($reference['zone'], $layout['zones'])) {
       $output = composite_invoke_referenceapi($reference, 'view', $node);
       if ($output) {
+        $position = $reference['data']['position'];
+        $css_class = "";
+        if ($position == 0) {
+          $css_class = "first odd";
+        } elseif ($position % 2 == 0) {
+          $css_class = "odd";
+        } else {
+          $css_class = "even";
+        }
         $composite_content[$reference['zone']][$reference['id']] = array(
+          '#prefix' => '<div class="'. $css_class .'">',
+          '#suffix' => '</div>',
           '#value' => $output,
           '#weight' => $reference['weight'],
         );
diff -urpN ./composite_old/composite.pages.inc ./composite/composite.pages.inc
--- ./composite_old/composite.pages.inc	2009-09-12 08:56:18.000000000 +0200
+++ ./composite/composite.pages.inc	2010-05-17 17:31:27.806098800 +0200
@@ -258,15 +258,33 @@ function composite_zones_form_submit($fo
   }
 
   // Save references
+  $elements = array(); //contains composite elements to dispatch on zones, indexed by zones, then by their weight
+  $zones = array();// will contain, for each zones, the last position known for an element in this zone
+  $position = 0;
   foreach ($form_state['values'] as $reference) {
     if (is_array($reference) && isset($reference['id'])) {
-      $data = $reference['data'] ? serialize($reference['data']) : '';
-      if (isset($existings[$reference['id']])) {
-        db_query("UPDATE {node_composite_references} SET weight = %d, data = '%s', zone = '%s' WHERE vid = %d AND id = '%s'", $reference['weight'], $data, $reference['zone'], $reference['vid'], $reference['id']);
-        unset($existings[$reference['id']]);
-      }
-      else {
-        db_query("INSERT INTO {node_composite_references} (nid, vid, type, weight, id, data, zone) VALUES (%d, %d, '%s', %d, '%s', '%s', '%s')", $reference['nid'], $reference['vid'], $reference['type'], $reference['weight'], $reference['id'], $data, $reference['zone']);
+      $elements[$reference['zone']][$reference['weight']] = $reference;
+    }
+  }
+
+  foreach ($elements as $zone => &$zone_elements) {
+    if (ksort($zone_elements)) {
+      foreach ($zone_elements as $weight => $reference) {
+        if (array_key_exists($reference['zone'], $zones)) {
+          $position = ++$zones [$reference['zone']];
+        } else {
+          $zones[$reference['zone']] = 0;
+          $position = 0;
+        }
+        $reference['data']['position'] = $position;
+        $data = $reference['data'] ? serialize($reference['data']) : '';
+        if (isset($existings[$reference['id']])) {
+          db_query("UPDATE {node_composite_references} SET weight = %d, data = '%s', zone = '%s' WHERE vid = %d AND id = '%s'", $reference['weight'], $data, $reference['zone'], $reference['vid'], $reference['id']);
+          unset($existings[$reference['id']]);
+        }
+        else {
+          db_query("INSERT INTO {node_composite_references} (nid, vid, type, weight, id, data, zone) VALUES (%d, %d, '%s', %d, '%s', '%s', '%s')", $reference['nid'], $reference['vid'], $reference['type'], $reference['weight'], $reference['id'], $data, $reference['zone']);
+        }
       }
     }
   }