       React.DOM.img {src: @props.url, style: {border: '1px solid #aaa'}}
 
 Graphing = modules.export exports, 'graphing', ({component_fn, doc, cmd, fn}) ->
+  doc 'shareCursor', 'Use the same cursor on multiple graphs',
+  '''
+  # Usage
+
+  ## `shareCursor()`
+
+  Sets the `cursor` option to a new cursor. This cursor will be used by all subsequent calls to [`graph`](help:graphing.graph).
+
+  ## `shareCursor(false)`
+
+  Unsets the `cursor` option.
+
+  ## `shareCursor(cursor)`
+
+  Sets the value of the `cursor` option to the specified cursor.
+  '''
+
+  cmd 'shareCursor', (ctx, share=true) ->
+    options = ctx.options()
+    if share == false
+      delete options.cursor
+    else
+      if share instanceof Bacon.Observable
+        options.cursor = share
+      else
+        options.cursor = new Bacon.Model
+
+  doc 'shareBrush', 'Use the same brush on multiple graphs',
+  '''
+  # Usage
+
+  ## `shareBrush()`
+
+  Sets the `brush` option to a new brush. This brush will be used by all subsequent calls to [`graph`](help:graphing.graph).
+
+  ## `shareBrush(false)`
+
+  Unsets the `brush` option.
+
+  ## `shareBrush(brush)`
+
+  Sets the value of the `brush` option to the specified brush.
+  '''
+
+  cmd 'shareBrush', (ctx, share=true) ->
+    options = ctx.options()
+    if share == false
+      delete options.brush
+    else
+      if share instanceof Bacon.Observable
+        options.brush = share
+      else
+        options.brush = new Bacon.Model
+
+  fn 'brushParams', (ctx, brush) ->
+    Context.value brushParams brush ? ctx.options().brush
+
   brushParams = (brush) ->
     brush.filter(({brushing}) -> !brushing).map ({extent}) ->
       if extent?


    Bacon.combineTemplate params



  doc 'shareCursor', 'Use the same cursor on multiple graphs',
  '''
  # Usage

  ## `shareCursor()`

  Sets the `cursor` option to a new cursor. This cursor will be used by all subsequent calls to [`graph`](help:graphing.graph).

  ## `shareCursor(false)`

  Unsets the `cursor` option.

  ## `shareCursor(cursor)`

  Sets the value of the `cursor` option to the specified cursor.
  '''

  cmd 'shareCursor', (ctx, share=true) ->
    options = ctx.options()
    if share == false
      delete options.cursor
    else
      if share instanceof Bacon.Observable
        options.cursor = share
      else
        options.cursor = new Bacon.Model

  doc 'shareBrush', 'Use the same brush on multiple graphs',
  '''
  # Usage

  ## `shareBrush()`

  Sets the `brush` option to a new brush. This brush will be used by all subsequent calls to [`graph`](help:graphing.graph).

  ## `shareBrush(false)`

  Unsets the `brush` option.

  ## `shareBrush(brush)`

  Sets the value of the `brush` option to the specified brush.
  '''

  cmd 'shareBrush', (ctx, share=true) ->
    options = ctx.options()
    if share == false
      delete options.brush
    else
      if share instanceof Bacon.Observable
        options.brush = share
      else
        options.brush = new Bacon.Model

  fn 'brushParams', (ctx, brush) ->
    Context.value brushParams brush ? ctx.options().brush

  bindToBrush = (brush, source) ->
    serverParams = new Bacon.Model null
    serverParams.addSource brushParams(brush)

    serverParams.flatMapLatest (brushParams) ->
      Bacon.fromPromise source.load brushParams

  fn 'bindToBrush', (ctx, args...) ->
    if args[0] instanceof Server.LeadDataSource

      brush = args[1]?.brush ? ctx.options().brush
    else
      allParams = Server.args_to_params {args, default_options: ctx.options()}
      source = serverDataSource(allParams.server)
      brush = allParams.client.brush
    Context.value bindToBrush brush, source

  doc 'graph',
    'Loads and graphs time-series data'
    Documentation.load_file 'graphing.graph'

  serverDataSource = (serverParams) ->
    new Server.LeadDataSource (params) ->
      Server.get_data _.extend {}, serverParams, params

  component_fn 'graph', (ctx, args...) ->
    if Q.isPromise args[0]
