diff --git a/src/openmap/com/bbn/openmap/layer/location/csv/CSVLocationHandler.java b/src/openmap/com/bbn/openmap/layer/location/csv/CSVLocationHandler.java
index fb2df41..d36d080 100644
--- a/src/openmap/com/bbn/openmap/layer/location/csv/CSVLocationHandler.java
+++ b/src/openmap/com/bbn/openmap/layer/location/csv/CSVLocationHandler.java
@@ -49,10 +49,12 @@ import com.bbn.openmap.layer.location.LocationMenuItem;
 import com.bbn.openmap.layer.location.URLRasterLocation;
 import com.bbn.openmap.omGraphics.OMGraphic;
 import com.bbn.openmap.omGraphics.OMGraphicList;
+import com.bbn.openmap.omGraphics.OMCircle;
 import com.bbn.openmap.util.CSVTokenizer;
 import com.bbn.openmap.util.DataOrganizer;
 import com.bbn.openmap.util.PropUtils;
 import com.bbn.openmap.util.quadtree.QuadTree;
+import com.bbn.openmap.proj.Length;
 
 /**
  * The CSVLocationLayer is a LocationHandler designed to let you put data on the
@@ -115,6 +117,11 @@ import com.bbn.openmap.util.quadtree.QuadTree;
  *       csvlocationhandler.defaultIconURL=/data/symbols/default.gif
  *       # Optional property, if the eastern hemisphere longitudes are negative.  False by default.
  *       csvlocationhandler.eastIsNeg=false
+ *       # Optional property, if you want a circle around each point, as well as other artifacts. -1 disables, or >=0 to choose a CSV column with radius in it
+ *       csvlocationhandler.circleRadiusIndex=-1
+ *       # Optional property. If you want circles, the radius defaults to KM as the units. 
+ *       #    Choices are value values in com.bbn.openmap.proj.Length
+ *       csvlocationhandler.circleRadiusUnit=KM
  *       
  *       # CSVLocationHandler has been updated to have regular DrawingAttribute properties for both name and location.
  *      csvlocationhandler.name.lineColor=FF008C54
@@ -159,6 +166,16 @@ public class CSVLocationHandler
      */
     public static final String NameIndexProperty = "nameIndex";
 
+    /** Index of column in CSV to use as circle radius */
+    protected int circleRadiusIndex = -1;
+    /** Property to use to designate the column of the CSV file to use as circle radius */
+    public static final String CircleRadiusIndexProperty = "circleRadiusIndex";
+    
+    /** Units if using circle radius */
+    protected Length circleRadiusUnit = Length.KM;
+    /** Property to use to designate the column of the CSV file to use as circle radius */
+    public static final String CircleRadiusUnitProperty = "circleRadiusUnit";
+
     // //////////////////////
     // Location Variables
 
@@ -229,6 +246,21 @@ public class CSVLocationHandler
         }
 
         csvHasHeader = PropUtils.booleanFromProperties(properties, prefix + csvHeaderProperty, false);
+        circleRadiusIndex = PropUtils.intFromProperties(properties, prefix + CircleRadiusIndexProperty, -1);
+        if(circleRadiusIndex >= 0) {
+            // Ignore unit malarkey unless they're actually using circles
+            String radiusUnitStr = properties.getProperty(prefix + CircleRadiusUnitProperty);
+            if(null != radiusUnitStr) {
+                // Check for a valid unit description
+                Length testLength = Length.get(radiusUnitStr);
+                if(null == testLength) {
+                    logger.warning("CSVLocationHandler: " + radiusUnitStr
+                            + " is not a known unit, default to " + circleRadiusUnit.toString());
+                } else {
+                    circleRadiusUnit = testLength;
+                }
+            }
+        }
 
         if (logger.isLoggable(Level.FINE)) {
             logger.fine("CSVLocationHandler indexes:\n  latIndex = " + latIndex + "\n  lonIndex = " + lonIndex + "\n  nameIndex = "
@@ -263,6 +295,8 @@ public class CSVLocationHandler
         props.put(prefix + LonIndexProperty, (lonIndex != -1 ? Integer.toString(lonIndex) : ""));
         props.put(prefix + IconIndexProperty, (iconIndex != -1 ? Integer.toString(iconIndex) : ""));
         props.put(prefix + DefaultIconURLProperty, PropUtils.unnull(defaultIconURL));
+        props.put(prefix + CircleRadiusIndexProperty, (circleRadiusIndex != -1 ? Integer.toString(circleRadiusIndex) : ""));
+        props.put(prefix + CircleRadiusUnitProperty, circleRadiusUnit.getAbbr());
 
         return props;
     }
@@ -299,6 +333,8 @@ public class CSVLocationHandler
         list.put(IconIndexProperty, "The column index, in the location file, of the icon for locations (optional).");
         list.put(DefaultIconURLProperty, "The URL of an image file to use as a default for the location markers (optional).");
         list.put(csvHeaderProperty, "Flag to note that the first line in the csv file is a header line and should be ignored.");
+        list.put(CircleRadiusIndexProperty, "The column index, in the location file, to use as circle radii (optional).");
+        list.put(CircleRadiusUnitProperty, "Short moniker for units of length of circle radius (optional, defaults to KM)");
 
         return list;
     }
@@ -466,7 +502,28 @@ public class CSVLocationHandler
 
         return loc;
     }
+    
+    /**
+     * When a new circle object needs to be created from data read in the CSV
+     * file, this method is called. This method lets you extend the
+     * CSVLocationLayer and easily set what kind of Location objects to use.
+     * 
+     * @param lat latitude of location, decimal degrees.
+     * @param lon longitude of location, decimal degrees.
+     * @param radius Radius of the circle
+     * @return graphic object for lat/lon circle.
+     */
+    protected OMCircle createCircleLocation(float lat, float lon, double radius) {
 
+        // This will turn into a regular location if iconURL is null.
+        OMCircle loc = new OMCircle(lat, lon, radius, circleRadiusUnit);
+        getLocationDrawingAttributes().setTo(loc);
+        
+        logger.fine("CSVLocationHandler " + loc.toString());
+
+        return loc;
+    }
+    
     /**
      * @param ranFile the file to be read. The file pointer should be set to the
      *        line you want read.
@@ -646,6 +703,7 @@ public class CSVLocationHandler
         protected String name;
         protected float lat;
         protected float lon;
+        protected float circleRadius;
         protected String iconURL;
 
         public DefaultLocationDecoder() {
@@ -655,6 +713,7 @@ public class CSVLocationHandler
             name = null;
             lat = 0f;
             lon = 0f;
+            circleRadius = 1f;
             iconURL = null;
         }
 
@@ -674,6 +733,8 @@ public class CSVLocationHandler
                 }
             } else if (i == iconIndex) {
                 iconURL = (String) token;
+            } else if (i == circleRadiusIndex) {
+                circleRadius = ((Double) token).floatValue();
             }
         }
 
@@ -681,10 +742,15 @@ public class CSVLocationHandler
             if (iconURL == null && defaultIconURL != null) {
                 iconURL = defaultIconURL;
             }
-
+            
+            if(circleRadiusIndex > -1) {
+                OMCircle circle = createCircleLocation(lat, lon, circleRadius);
+                organizer.put(lat, lon, circle);
+            }
+            
             Location loc = createLocation(lat, lon, name, iconURL);
-
             organizer.put(lat, lon, loc);
+            
             reset();
         }
 

