--- /tmp/kml/kml.module	2007-09-21 03:27:06.000000000 +1000
+++ kml.module	2008-06-28 21:11:53.000000000 +1000
@@ -688,21 +688,50 @@ function kml_format_placemark($item, $li
       $output .= "    <TimeStamp><when>". $timestamp ."</when></TimeStamp>\n";
     }
   }
+
+  // Strip any geometry information from args
+  $geometrys = array();
+  $force_multi = FALSE;
+
+  // Handle MultiGeometry on it's own.
+  if ($args['MultiGeometry']) {
+    $geometrys[] = $args['MultiGeometry'] . "\n";
+    unset($args['MultiGeometry']);
+    $force_multi = TRUE;
+  }
+
+  $geo_types = array('Point', 'LineString', 'LinearRing', 'Polygon', 'Model');
+  foreach ($geo_types as $geo_type) {
+    if ($args[$geo_type]) {
+      $geometrys[] = "<$geo_type>" . $args[$geo_type] . "</$geo_type>\n";
+      unset($args[$geo_type]);
+    }
+  }
   
   // Coordinate information
   $lat = $item->location['latitude'];
   $long = $item->location['longitude'];
   if ($lat && $long) {
-    $output .= "    <Point>\n";
+    $point = "    <Point>\n";
     $pointelements = array('altitudeMode', 'extrude');  // elements that extend Point
     foreach ($pointelements as $pointelement) {
       if ($args[$pointelement]) {
-        $output .= "     <$pointelement>". $args[$pointelement] ."</$pointelement>\n";
+        $point .= "     <$pointelement>". $args[$pointelement] ."</$pointelement>\n";
         unset($args[$pointelement]);
       }
     }
-    $output .= '     <coordinates>'. $long .','. $lat .','. $alt ."</coordinates>\n";
-    $output .= "    </Point>\n";
+    $point .= '     <coordinates>'. $long .','. $lat .','. $alt ."</coordinates>\n";
+    $point .= "    </Point>\n";
+    $geometrys[] = $point;
+  }
+  if ($force_multi or count($geometrys) > 1) {
+    $output .= "<MultiGeometry>\n";
+    while ($geometrys) {
+      $output .= array_shift($geometrys);
+    }
+    $output .= "</MultiGeometry>\n";
+  } else if (count($geometrys)) {
+    $output .= array_shift($geometrys);
   }
 
   // Address information. Needs city and country at a minimum.
