Index: templates/gis/google/google-map.js
===================================================================
--- templates/gis/google/google-map.js	(revision 10011)
+++ templates/gis/google/google-map.js	(working copy)
@@ -16,7 +16,15 @@
     {{ js_module }}.{{ dom_id }}.addOverlay({{ js_module }}.{{ dom_id }}_polyline{{ forloop.counter }});
     {% for event in polyline.events %}GEvent.addListener({{ js_module }}.{{ dom_id }}_polyline{{ forloop.parentloop.counter }}, {{ event }}); {% endfor %}
     {% if calc_zoom %}tmp_bounds = {{ js_module }}.{{ dom_id }}_polyline{{ forloop.counter }}.getBounds(); bounds.extend(tmp_bounds.getSouthWest()); bounds.extend(tmp_bounds.getNorthEast());{% endif %}{% endfor %}
-    {% for marker in markers %}{{ js_module }}.{{ dom_id }}_marker{{ forloop.counter }} = new {{ marker }};
+    {% for icon in icons %} 
+    var {{ icon.name }}_icon = new GIcon(G_DEFAULT_ICON); 
+    {% if icon.image %}{{ icon.name }}_icon.image = "{{ icon.image }}";{% endif %} 
+    {% if icon.shadow %}{{ icon.name }}_icon.shadow = "{{ icon.shadow }}";{% endif %} 
+    {% if icon.iconsize %}{{ icon.name }}_icon.iconSize = new GSize({{ icon.iconsize.0 }}, {{ icon.iconsize.1 }});{% endif %} 
+    {% if icon.shadowsize %}{{ icon.name }}_icon.shadowSize = new GSize({{ icon.shadowsize.0 }}, {{ icon.shadowsize.1 }});{% endif %} 
+    {% if icon.iconanchor %}{{ icon.name }}_icon.iconAnchor = new GPoint({{ icon.iconanchor.0 }}, {{ icon.iconanchor.1 }});{% endif %} 
+    {% if icon.infowindowanchor %}{{ icon.name }}_icon.infoWindowAnchor = new GPoint({{ icon.infowindowanchor.0 }}, {{ icon.infowindowanchor.1 }});{% endif %}{% endfor %} 
+	{% for marker in markers %}{{ js_module }}.{{ dom_id }}_marker{{ forloop.counter }} = new {{ marker }};
     {{ js_module }}.{{ dom_id }}.addOverlay({{ js_module }}.{{ dom_id }}_marker{{ forloop.counter }});
     {% for event in marker.events %}GEvent.addListener({{ js_module }}.{{ dom_id }}_marker{{ forloop.parentloop.counter }}, {{ event }}); {% endfor %}
     {% if calc_zoom %}bounds.extend({{ js_module }}.{{ dom_id }}_marker{{ forloop.counter }}.getLatLng()); {% endif %}{% endfor %}
Index: maps/google/gmap.py
===================================================================
--- maps/google/gmap.py	(revision 10011)
+++ maps/google/gmap.py	(working copy)
@@ -4,8 +4,9 @@
 from django.utils.safestring import mark_safe
 
 class GoogleMapException(Exception): pass
-from django.contrib.gis.maps.google.overlays import GPolygon, GPolyline, GMarker
-
+from django.contrib.gis.maps.google.overlays import GPolygon, GPolyline, \
+                                                    GMarker, GIcon
+ 
 # The default Google Maps URL (for the API javascript)
 # TODO: Internationalize for Japan, UK, etc.
 GOOGLE_MAPS_URL='http://maps.google.com/maps?file=api&amp;v=%s&amp;key='
@@ -20,8 +21,8 @@
 
     def __init__(self, key=None, api_url=None, version=None, 
                  center=None, zoom=None, dom_id='map',
-                 kml_urls=[], polygons=[], polylines=[], markers=[],
-                 template='gis/google/google-single.js',
+                 kml_urls=[], icons=None, markers=None, polylines=None, 
+                 polygons=None, template='gis/google/google-single.js',
                  js_module='geodjango',extra_context={}):
 
         # The Google Maps API Key defined in the settings will be used
@@ -57,26 +58,20 @@
         self.kml_urls = kml_urls
         
         # Does the user want any GMarker, GPolygon, and/or GPolyline overlays?
-        self.polygons, self.polylines, self.markers = [], [], []
-        if markers:
-            for point in markers:
-                if isinstance(point, GMarker): 
-                    self.markers.append(point)
-                else:
-                    self.markers.append(GMarker(point))
-        if polygons:
-            for poly in polygons:
-                if isinstance(poly, GPolygon): 
-                    self.polygons.append(poly)
-                else:
-                    self.polygons.append(GPolygon(poly))
-        if polylines:
-            for pline in polylines:
-                if isinstance(pline, GPolyline):
-                    self.polylines.append(pline)
-                else:
-                    self.polylines.append(GPolyline(pline))
-       
+        overlay_info = [[GIcon, icons, 'icons'], 
+                        [GMarker, markers, 'markers'], 
+                        [GPolygon, polygons, 'polygons'], 
+                        [GPolyline, polylines, 'polylines']] 
+
+        for overlay_class, overlay_list, varname in overlay_info: 
+            setattr(self, varname, []) 
+            if overlay_list: 
+                for overlay in overlay_list: 
+                    if isinstance(overlay, overlay_class): 
+                        getattr(self, varname).append(overlay) 
+                    else: 
+                        getattr(self, varname).append(overlay_class(overlay)) 
+
         # If GMarker, GPolygons, and/or GPolylines are used the zoom will be
         # automatically calculated via the Google Maps API.  If both a zoom
         # level and a center coordinate are provided with polygons/polylines,
@@ -105,6 +100,7 @@
                   'zoom' : self.zoom,
                   'polygons' : self.polygons,
                   'polylines' : self.polylines,
+                  'icons': self.icons,
                   'markers' : self.markers,
                   }
         params.update(self.extra_context)
Index: maps/google/overlays.py
===================================================================
--- maps/google/overlays.py	(revision 10011)
+++ maps/google/overlays.py	(working copy)
@@ -165,6 +165,73 @@
     def js_params(self):
         return '%s, "%s", %s, %s' % (self.latlngs, self.color, self.weight, self.opacity)
 
+
+class GIcon(object): 
+    """ 
+    Creates a GIcon object to pass into a Gmarker object. 
+
+    The keyword arguments map to instance attributes of the same name. These,  
+    in turn, correspond to a subset of the attributes of the official GIcon  
+    javascript object: 
+
+    http://code.google.com/apis/maps/documentation/reference.html#GIcon 
+
+    Because a Google map often uses several different icons, a name field has 
+    been added to the required arguments. 
+
+    Required Arguments: 
+        name:  
+            A string which will become the basis for the js variable name of 
+            the marker, for this reason, your code should assign a unique 
+            name for each GIcon you instantiate, otherwise there will be 
+            name space collisions in your javascript. 
+
+    Keyword Options: 
+        image: 
+            The url of the image to be used as the icon on the map defaults  
+            to 'G_DEFAULT_ICON' 
+
+        iconsize: 
+            a tuple representing the pixel size of the foreground (not the  
+            shadow) image of the icon, in the format: (width, height) ex.: 
+
+            GIcon('fast_food',  
+                  image="/media/icon/star.png", 
+                  iconsize=(15,10)) 
+
+            Would indicate your custom icon was 15px wide and 10px height.   
+
+        shadow: 
+            the url of the image of the icon's shadow 
+
+        shadowsize: 
+            a tuple representing the pixel size of the shadow image, format is 
+            the same as ``iconsize`` 
+
+        iconanchor: 
+            a tuple representing the pixel coordinate relative to the top left  
+            corner of the icon image at which this icon is anchored to the map. 
+            In (x, y) format.  x increases to the right in the Google Maps 
+            coordinate system and y increases downwards in the Google Maps  
+            coordinate system.) 
+
+        infowindowanchor: 
+            The pixel coordinate relative to the top left corner of the icon 
+            image at which the info window is anchored to this icon.   
+
+    """ 
+    def __init__(self, name, image='G_DEFAULT_ICON', iconsize=None,  
+                 shadow=None, shadowsize=None, iconanchor=None,  
+                 infowindowanchor=None): 
+        self.name = name 
+        self.image = image 
+        self.iconsize = iconsize 
+        self.shadow = shadow 
+        self.shadowsize = shadowsize 
+        self.iconanchor = iconanchor 
+        self.infowindowanchor = infowindowanchor
+
+
 class GMarker(GOverlayBase):
     """
     A Python wrapper for the Google GMarker object.  For more information
@@ -184,7 +251,7 @@
           return render_to_response('mytemplate.html', 
                  {'google' : GoogleMap(markers=[marker])})
     """
-    def __init__(self, geom, title=None, draggable=False):
+    def __init__(self, geom, title=None, draggable=False, icon=None):
         """
         The GMarker object may initialize on GEOS Points or a parameter
         that may be instantiated into a GEOS point.  Keyword options map to
@@ -209,6 +276,7 @@
         # TODO: Add support for more GMarkerOptions
         self.title = title
         self.draggable = draggable
+        self.icon = icon
         super(GMarker, self).__init__()
 
     def latlng_from_coords(self, coords):
@@ -217,8 +285,10 @@
     def options(self):
         result = []
         if self.title: result.append('title: "%s"' % self.title)
+        if self.icon: result.append('icon: %s_icon' % self.icon.name)
         if self.draggable: result.append('draggable: true') 
         return '{%s}' % ','.join(result)
+    
 
     @property
     def js_params(self):
