         @ctx.fillRect.apply(@ctx, args)
         @ctx.strokeRect.apply(@ctx, args)
 
-  # Makes a new data representation of a tick
-  _makeTick: (bucket, time, enter) ->
+
+  # This is called every time we introduce new data (as a result of _shift)
+  # it checks to see if we also need to update the working tick set and
+  # makes the approriate changes for handling tick animation (enter, exit, 
+  # and update in the d3 model).
+  _updateTicks: (newTime) ->
+    # Incoming ticks
+    unless (++@_tickTimer) % @options.ticks.bottom
+      @_pushTick(@options.windowSize, newTime, true)
+
+    # Outgoing ticks
+    unless @_ticks[0].x - @w() >= 0
+      @_ticks[0].exit = true
+
+  # Prepares bottom and top time axes for rendering
+  _prepareTimeAxes: ->
+    if @hasAxis('bottom')
+      axis = @bottomAxis = @svg.append('g')
+        .attr('class', 'x axis bottom canvas')
+        .attr('transform', "translate(#{@margins.left-1}, #{@innerHeight()+@margins.top})")
+      axis.append('path')
+        .attr('class', 'domain')
+        .attr('d', "M0,0H#{@innerWidth()+1}")
+      
+    [@_ticks, tickInterval] = [[], @options.ticks.bottom]
+    @_tickTimer = @options.windowSize % tickInterval
+    for i, entry of @data[0].values
+      continue unless i % tickInterval == tickInterval - 1
+      @_pushTick(i, entry.time)
+
+  # Makes and pushes a new tick into the visualization
+  _pushTick: (bucket, time, enter=false) ->
     tick =
       time: time
       label: @options.tickFormats.bottom(time)

    axes: ['bottom']
    ticks:
      top: 5
      bottom: 5
      left: 5
      right: 5
    tickFormats:

  draw: (delta=0) ->
    @ctx.clearRect(0, 0, @width, @height)
    @drawLayers(delta)
    @_updateTimeAxes()




