     ram   : no
     disk  : no
 
+  mapPlansToRadios: (plan) ->
+    @plansByCode[plan.code] = plan
+    { category, resource, upperBound } = plan.usage
+    {
+      title       : @getPlanTitle category, resource, upperBound
+      value       : plan.code
+    }
+
+  getResourceTitle =(resource)->
+    switch resource
+      when 'cpu'    then 'virtual cores'
+      when 'user'   then 'group members'
+      else               '(not implemented)'
+
+
+  getPlanTitle: (category, resource, upperBound)=>
+    """
+    Up to #{upperBound} #{getResourceTitle resource}
+    """
+
+  upperBoundSortFn =(a, b)->
+    a.usage.upperBound - b.usage.upperBound
+
   constructor: (options, data) ->
     super
 
-    {group, bundle} = @getData()
-
-    {JLimit} = KD.remote.api
+    { group, bundle } = @getData()
+
+    { JLimit, JGroupBundle } = KD.remote.api
 
     computeLimit = new JLimit { usage: 0, quota: 0, unit: 'VM', title: 'vms' }
 

      return error err      if err?
      limits.splice 1, 0, computeLimit
      @renderLimits limits  if limits?

    @usersLabel = new KDLabelView
      title       : 'Users'

      slider.setValue quota
      slider.emit 'change'

  changePlan: (types, plan) ->
    return  unless plan?
    for type in types
      limit = @limitsData[type]
      limit.quota = plan.usage.upperBound * (computeUnitMap[type] ? 1)
      limit.emit 'update'

  renderLimits: (limits) ->
    @limits.destroySubViews()
    @limitsData = {}
