 
   if vars[axis].scale.value isnt "share" and !vars[axis].range.value and vars[axis].reset
 
+    testScale = vars[axis].scale.viz.copy().clamp(false)
+
     if axis is vars.axes.discrete
 
-      domain = vars[axis].scale.viz.domain()
+      domain = testScale.domain()
 
       if typeof domain[0] is "string"
         i = domain.length
         while i >= 0
           domain.splice(i, 0, "d3plus_buffer_"+i)
           i--
-        range = vars[axis].scale.viz.range()
+        range = testScale.range()
         range = buckets d3.extent(range), domain.length
         vars[axis].scale.viz.domain(domain).range(range)
 

          additional = difference / (vars[axis].ticks.values.length - 1)
          additional = additional / 2

          rangeMax = vars[axis].scale.viz.range()[1]
          maxSize  = vars.axes.scale.range()[1] * 1.5
          domainLow = vars[axis].scale.viz.invert -maxSize
          domainHigh  = vars[axis].scale.viz.invert rangeMax + maxSize

          if domain[0] - additional < domainLow


            (buffer is "y" and axis.indexOf("y") is 0) or
            (buffer is true)

      domain = testScale.domain()

      allPositive = domain[0] >= 0 and domain[1] >= 0
      allNegative = domain[0] <= 0 and domain[1] <= 0
