Index: templates/gis/google/js/google-map.js
===================================================================
--- templates/gis/google/js/google-map.js	(revision 9526)
+++ templates/gis/google/js/google-map.js	(working copy)
@@ -20,6 +20,15 @@
     {% for event in polyline.events %}GEvent.addListener(polyline{{ forloop.parentloop.counter }}, {{ event }}); {% endfor %}
     {% if calc_zoom %}tmp_bounds = polyline{{ forloop.counter }}.getBounds(); bounds.extend(tmp_bounds.getSouthWest()); bounds.extend(tmp_bounds.getNorthEast());{% endif %}{% endfor %}
     
+    {% 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 }});{% endif %}
+    {% if icon.shadowsize %}{{ icon.name }}_icon.shadowSize = new GSize({{ icon.shadowsize }});{% endif %}
+    {% if icon.iconanchor %}{{ icon.name }}_icon.iconAnchor = new GPoint({{ icon.iconanchor }});{% endif %}
+    {% if icon.infowindowanchor %}{{ icon.name }}_icon.infoWindowAnchor = new GPoint({{ icon.infowindowanchor }});{% endif %}{% endfor %}
+    
     {% for marker in markers %}var marker{{ forloop.counter }} = new {{ marker }};
     map.addOverlay(marker{{ forloop.counter }});
     {% for event in marker.events %}GEvent.addListener(marker{{ forloop.parentloop.counter }}, {{ event }}); {% endfor %}
Index: maps/google/gmap.py
===================================================================
--- maps/google/gmap.py	(revision 9526)
+++ maps/google/gmap.py	(working copy)
@@ -4,7 +4,8 @@
 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.
@@ -20,7 +21,7 @@
 
     def __init__(self, key=None, api_url=None, version=None, 
                  center=None, zoom=None, dom_id='map', load_func='gmap_load', 
-                 kml_urls=[], polygons=[], polylines=[], markers=[],
+                 kml_urls=[], polygons=[], polylines=[], markers=[], icons=[],
                  template='gis/google/js/google-map.js',
                  extra_context={}):
 
@@ -56,7 +57,13 @@
         self.kml_urls = kml_urls
         
         # Does the user want any GMarker, GPolygon, and/or GPolyline overlays?
-        self.polygons, self.polylines, self.markers = [], [], []
+        self.polygons, self.polylines, self.markers, self.icons = [], [], [], []
+        if icons:
+            for icon in icons:
+                if isinstance(icon, GIcon): 
+                    self.icons.append(icon)
+                else:
+                    self.icons.append(GIcon(icon))
         if markers:
             for point in markers:
                 if isinstance(point, GMarker): 
@@ -103,6 +110,7 @@
                   'polygons' : self.polygons,
                   'polylines' : self.polylines,
                   'markers' : self.markers,
+                  'icons' : self.icons,
                   }
         params.update(extra_context)
         self.js = render_to_string(self.template, params)
Index: maps/google/overlays.py
===================================================================
--- maps/google/overlays.py	(revision 9526)
+++ maps/google/overlays.py	(working copy)
@@ -165,6 +165,21 @@
     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.
+    """
+    def __init__(self, name='custom', image=None, 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 +199,7 @@
           return render_to_response('mytemplate.html', 
                  {'google' : GoogleMap(markers=[marker])})
     """
-    def __init__(self, geom, title=None):
+    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
@@ -193,6 +208,12 @@
         Keyword Options:
          title: 
            Title option for GMarker, will be displayed as a tooltip.
+         
+         draggable:
+           Draggable option for GMarker, disabled by default
+         
+         icon:
+           Takes a 
         """
         # If a GEOS geometry isn't passed in, try to construct one.
         if isinstance(geom, basestring): geom = fromstr(geom)
@@ -205,6 +226,8 @@
         self.envelope = geom.envelope
         # 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):
@@ -212,7 +235,9 @@
     
     def options(self):
         result = []
-        if self.title: result.append('title: "%s"' % self.title) 
+        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
