diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/TabularDataGraphServlet.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/TabularDataGraphServlet.java
index 18327b53c5c0975d7c454322981a82ce22277fb8..de46beff3ff0896becaf2a172d1d222d624cf377 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/TabularDataGraphServlet.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/TabularDataGraphServlet.java
@@ -47,6 +47,10 @@ public class TabularDataGraphServlet extends AbstractTabularDataGraphServlet
 
     private IEncapsulatedOpenBISService openBisService;
 
+    final public static String WELL_ROW_COLUMN = "Row";
+
+    final public static String WELL_COLUMN_COLUMN = "Column";
+
     /**
      * An CSV-file-like interface to feature data from the database.
      * 
@@ -56,10 +60,6 @@ public class TabularDataGraphServlet extends AbstractTabularDataGraphServlet
     {
         private static final String WELL_NAME_COLUMN = "WellName";
 
-        private static final String WELL_ROW_COLUMN = "Row";
-
-        private static final String WELL_COLUMN_COLUMN = "Column";
-
         private final IImagingQueryDAO dao;
 
         private final IEncapsulatedOpenBISService service;
@@ -67,7 +67,7 @@ public class TabularDataGraphServlet extends AbstractTabularDataGraphServlet
         private final String dataSetCode;
 
         private String[] headerCodes;
-        
+
         private String[] headerLabels;
 
         private ArrayList<String[]> lines;
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/graph/SpreadsheetColumnTickUnit.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/graph/SpreadsheetColumnTickUnit.java
new file mode 100644
index 0000000000000000000000000000000000000000..b5c0e8682de754ad14a54e7e765185c426e0277d
--- /dev/null
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/graph/SpreadsheetColumnTickUnit.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2010 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.dss.generic.server.graph;
+
+import org.jfree.chart.axis.NumberTickUnit;
+
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.PlateUtils;
+
+/**
+ * @author Chandrasekhar Ramakrishnan
+ */
+public class SpreadsheetColumnTickUnit extends NumberTickUnit
+{
+    private static final long serialVersionUID = 1L;
+
+    // Note: this should work as a way of letting the axis select the appropriate
+    // tick interval, but it doesn't work for some reason.
+    //
+    // public static TickUnitSource createStandardTickUnits()
+    // {
+    // TickUnits tickUnits = new TickUnits();
+    // tickUnits.add(new SpreadsheetColumnTickUnit(1.0));
+    // tickUnits.add(new SpreadsheetColumnTickUnit(2.0));
+    // tickUnits.add(new SpreadsheetColumnTickUnit(5.0));
+    // return tickUnits;
+    // }
+
+    /**
+     * Constructor for a spreadsheet tick unit label.
+     */
+    public SpreadsheetColumnTickUnit(double size)
+    {
+        super(size);
+    }
+
+    /**
+     * Converts the supplied value to a string.
+     * <P>
+     * Subclasses may implement special formatting by overriding this method.
+     * 
+     * @param value the data value.
+     * @return Value as string.
+     */
+    @Override
+    public String valueToString(double value)
+    {
+        if (value < 1)
+        {
+            return "";
+        }
+        return PlateUtils.translateRowNumberIntoLetterCode((int) value);
+    }
+}
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/graph/TabularDataGraphCollectionConfiguration.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/graph/TabularDataGraphCollectionConfiguration.java
index 84d3f1ba72c3d5ea9cef05e8c433c7282c23225c..36fb739e6f57ed6159076145851c1bd2d2008cdb 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/graph/TabularDataGraphCollectionConfiguration.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/graph/TabularDataGraphCollectionConfiguration.java
@@ -30,6 +30,7 @@ import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException;
 import ch.systemsx.cisd.common.utilities.PropertyParametersUtil;
 import ch.systemsx.cisd.common.utilities.PropertyUtils;
 import ch.systemsx.cisd.common.utilities.PropertyParametersUtil.SectionProperties;
+import ch.systemsx.cisd.openbis.dss.generic.server.TabularDataGraphServlet;
 import ch.systemsx.cisd.openbis.dss.generic.server.graph.TabularDataGraphConfiguration.GraphType;
 import ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.ITabularData;
 import ch.systemsx.cisd.openbis.dss.generic.shared.utils.CodeAndLabel;
@@ -177,8 +178,14 @@ public class TabularDataGraphCollectionConfiguration implements ICsvFileReaderCo
         switch (type)
         {
             case HEATMAP:
-                CodeAndLabel xAxis = getCodeAndLabel(props, X_AXIS_KEY);
-                CodeAndLabel yAxis = getCodeAndLabel(props, Y_AXIS_KEY);
+                // Default the Row and Column header names to the standard ones if no override is
+                // specified.
+                CodeAndLabel xAxis =
+                        getCodeAndLabelWithDefault(props, X_AXIS_KEY,
+                                TabularDataGraphServlet.WELL_ROW_COLUMN);
+                CodeAndLabel yAxis =
+                        getCodeAndLabelWithDefault(props, Y_AXIS_KEY,
+                                TabularDataGraphServlet.WELL_ROW_COLUMN);
                 CodeAndLabel zAxis = getCodeAndLabel(props, COLUMN_KEY);
                 if (xAxis.equals(yAxis))
                 {
@@ -203,7 +210,7 @@ public class TabularDataGraphCollectionConfiguration implements ICsvFileReaderCo
         // should never get here
         return null;
     }
-    
+
     private CodeAndLabel getCodeAndLabel(Properties properties, String key)
     {
         String labelWithOptionalCode = properties.getProperty(key);
@@ -227,6 +234,30 @@ public class TabularDataGraphCollectionConfiguration implements ICsvFileReaderCo
         return new CodeAndLabel(code, label);
     }
 
+    private CodeAndLabel getCodeAndLabelWithDefault(Properties properties, String key,
+            String defaultLabel)
+    {
+        String labelWithOptionalCode = properties.getProperty(key);
+        if (labelWithOptionalCode != null)
+        {
+            return new CodeAndLabel(labelWithOptionalCode);
+        }
+        String labelKey = key + LABEL_POSTFIX;
+        String label = properties.getProperty(labelKey);
+        String codeKey = key + CODE_POSTFIX;
+        String code = properties.getProperty(codeKey);
+        if (label == null && code == null)
+        {
+            label = defaultLabel;
+            code = CodeAndLabel.normalize(label);
+        }
+        if (code == null)
+        {
+            return new CodeAndLabel(label);
+        }
+        return new CodeAndLabel(code, label);
+    }
+
     /**
      * Return the graph configuration associated with the graphTypeCode.
      * 
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/graph/TabularDataHeatmap.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/graph/TabularDataHeatmap.java
index 74c322f9cc9c9fbbf9d29e6e338cfa824715eeae..8565bc3f61d48a05ae587c9138807028e2c8479c 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/graph/TabularDataHeatmap.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/graph/TabularDataHeatmap.java
@@ -24,7 +24,6 @@ import java.util.List;
 import org.jfree.chart.ChartFactory;
 import org.jfree.chart.JFreeChart;
 import org.jfree.chart.axis.NumberAxis;
-import org.jfree.chart.axis.NumberTickUnit;
 import org.jfree.chart.plot.PlotOrientation;
 import org.jfree.chart.plot.XYPlot;
 import org.jfree.chart.renderer.LookupPaintScale;
@@ -48,6 +47,8 @@ import ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.ITabularData;
 public class TabularDataHeatmap extends AbstractTabularDataGraph<TabularDataHeatmapConfiguration>
 {
 
+    private static final int PAINT_SCALE_NUM_STEPS = 11;
+
     /**
      * @param configuration
      */
@@ -107,7 +108,7 @@ public class TabularDataHeatmap extends AbstractTabularDataGraph<TabularDataHeat
             throw new IllegalArgumentException("Null 'orientation' argument.");
         }
         NumberAxis xAxis = new NumberAxis(xAxisLabel);
-        xAxis.setTickUnit(new NumberTickUnit(1.0));
+        xAxis.setTickUnit(new SpreadsheetColumnTickUnit(1.0));
         xAxis.setInverted(true);
         NumberAxis yAxis = new NumberAxis(yAxisLabel);
 
@@ -130,6 +131,9 @@ public class TabularDataHeatmap extends AbstractTabularDataGraph<TabularDataHeat
         NumberAxis scaleAxis = new NumberAxis("Scale");
         scaleAxis.setRange(dataset.getRange());
         scaleAxis.setStandardTickUnits(new TabularDataTickUnitSource());
+        scaleAxis.setTickUnit(new TabularDataTickUnit(dataset.getRange().getLength()
+                / PAINT_SCALE_NUM_STEPS));
+        scaleAxis.setAutoRange(true);
         PaintScaleLegend psl = new PaintScaleLegend(paintScale, scaleAxis);
         psl.setMargin(new RectangleInsets(5, 5, 5, 5));
         psl.setPosition(RectangleEdge.RIGHT);
@@ -160,7 +164,7 @@ public class TabularDataHeatmap extends AbstractTabularDataGraph<TabularDataHeat
 
         LookupPaintScale paintScale = new LookupPaintScale(lowerBound, upperBound, Color.WHITE);
         double binMin = range.getLowerBound();
-        double binStep = range.getLength() / 11;
+        double binStep = range.getLength() / PAINT_SCALE_NUM_STEPS;
         // 1
         paintScale.add(binMin, new Color(5, 48, 97));
         // 2
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/graph/TabularDataTickUnit.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/graph/TabularDataTickUnit.java
new file mode 100644
index 0000000000000000000000000000000000000000..f922a2f021ec270ef4b0cfd663516cc9c85293d0
--- /dev/null
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/graph/TabularDataTickUnit.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright 2010 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.dss.generic.server.graph;
+
+import java.text.DecimalFormat;
+
+import org.jfree.chart.axis.NumberTickUnit;
+
+/**
+ * This is a variation on the NumberTickUnit that gracefully switches from standard to scientific
+ * notation depending on the size of the numbers for the labels.
+ * 
+ * @author Chandrasekhar Ramakrishnan
+ */
+public class TabularDataTickUnit extends NumberTickUnit
+{
+    private static final long serialVersionUID = 1L;
+
+    final private static int largeScientificNotationTransition = 6;
+
+    final private static int smallScientificNotationTransition = 3;
+
+    /**
+     * @param size
+     */
+    public TabularDataTickUnit(double size)
+    {
+        super(size, getNumberFormat(Math.abs(size), size >= 1.0));
+    }
+
+    /**
+     * Use the precision to determine if we should return standard or scientific notation.
+     * 
+     * @param precision The desired precision of the numbers to display.
+     * @param greaterThan1 True if the numbers to be shown are greater then 1
+     */
+    private static DecimalFormat getNumberFormat(double precision, boolean greaterThan1)
+    {
+        DecimalFormat numberFormat;
+        if (greaterThan1)
+        {
+            if (precision > largeScientificNotationTransition)
+            {
+                numberFormat = new DecimalFormat("0.0##E0");
+            } else
+            {
+                numberFormat = getStandardNumberFormat((int) precision, greaterThan1);
+            }
+        } else
+        {
+            if (precision > smallScientificNotationTransition)
+            {
+                numberFormat = new DecimalFormat("0.0##E0");
+            } else
+            {
+                numberFormat = getStandardNumberFormat((int) precision, greaterThan1);
+            }
+        }
+        return numberFormat;
+    }
+
+    /**
+     * Return a DecimalFormat that uses standard notation (not scientific notation).
+     * 
+     * @param precision The desired precision of the numbers to display.
+     * @param greaterThan1 True if the numbers to be shown are greater then 1
+     */
+    private static DecimalFormat getStandardNumberFormat(int precision, boolean greaterThan1)
+    {
+        StringBuilder sb = new StringBuilder();
+        if (greaterThan1)
+        {
+            for (int i = 1; i < precision; ++i)
+            {
+                sb.append("#");
+            }
+            sb.append("0");
+        } else
+        {
+            sb.append("0.0");
+            for (int i = 0; i < precision - 1; ++i)
+            {
+                sb.append("0");
+            }
+        }
+
+        return new DecimalFormat(sb.toString());
+    }
+
+}
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/graph/TabularDataTickUnitSource.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/graph/TabularDataTickUnitSource.java
index 657a0671bfdade1d717ecba73c787fd7677f236a..6215fea85c9e25883ebc03023af801556bf3f722 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/graph/TabularDataTickUnitSource.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/graph/TabularDataTickUnitSource.java
@@ -17,9 +17,7 @@
 package ch.systemsx.cisd.openbis.dss.generic.server.graph;
 
 import java.io.Serializable;
-import java.text.DecimalFormat;
 
-import org.jfree.chart.axis.NumberTickUnit;
 import org.jfree.chart.axis.TickUnit;
 import org.jfree.chart.axis.TickUnitSource;
 
@@ -39,10 +37,6 @@ public class TabularDataTickUnitSource implements TickUnitSource, Serializable
     /** Constant for log(10.0). */
     final private static double LOG_10_VALUE = Math.log(10.0);
 
-    final private int largeScientificNotationTransition = 6;
-
-    final private int smallScientificNotationTransition = 3;
-
     /**
      * Returns a tick unit that is larger than the supplied unit.
      * 
@@ -75,75 +69,12 @@ public class TabularDataTickUnitSource implements TickUnitSource, Serializable
      */
     public TickUnit getCeilingTickUnit(double size)
     {
-        // Use number of decimal digits to determine what the tick size and display format should
-        // be.
         final double numberOfDigits = Math.log(size) / LOG_10_VALUE;
         final double higher = Math.ceil(numberOfDigits);
-        final DecimalFormat numberFormat = getNumberFormat(Math.abs(higher), size >= 1.0);
         final double fullTickIncrement = Math.pow(10, higher);
         final double halfTickIncrement = fullTickIncrement / 2;
         final double tickIncrement =
                 (size <= halfTickIncrement) ? halfTickIncrement : fullTickIncrement;
-        return new NumberTickUnit(tickIncrement, numberFormat);
-    }
-
-    /**
-     * Use the precision to determine if we should return standard or scientific notation.
-     * 
-     * @param precision The desired precision of the numbers to display.
-     * @param greaterThan1 True if the numbers to be shown are greater then 1
-     */
-    private DecimalFormat getNumberFormat(double precision, boolean greaterThan1)
-    {
-        DecimalFormat numberFormat;
-        if (greaterThan1)
-        {
-            if (precision > largeScientificNotationTransition)
-            {
-                numberFormat = new DecimalFormat("0.0##E0");
-            } else
-            {
-                numberFormat = getStandardNumberFormat((int) precision, greaterThan1);
-            }
-        } else
-        {
-            if (precision > smallScientificNotationTransition)
-            {
-                numberFormat = new DecimalFormat("0.0##E0");
-            } else
-            {
-                numberFormat = getStandardNumberFormat((int) precision, greaterThan1);
-            }
-        }
-        return numberFormat;
-    }
-
-    /**
-     * Return a DecimalFormat that uses standard notation (not scientific notation).
-     * 
-     * @param precision The desired precision of the numbers to display.
-     * @param greaterThan1 True if the numbers to be shown are greater then 1
-     */
-    private DecimalFormat getStandardNumberFormat(int precision, boolean greaterThan1)
-    {
-        StringBuilder sb = new StringBuilder();
-        if (greaterThan1)
-        {
-            for (int i = 1; i < precision; ++i)
-            {
-                sb.append("#");
-            }
-            sb.append("0");
-        } else
-        {
-            sb.append("0.0");
-            for (int i = 0; i < precision - 1; ++i)
-            {
-                sb.append("0");
-            }
-        }
-
-        return new DecimalFormat(sb.toString());
-
+        return new TabularDataTickUnit(tickIncrement);
     }
 }