     # DIFFICULT change configuration of this VM
     # WARNING: this may be a possibly dangerous multi-step process that
     # could involve deleting and recreating the VM.
+    ###
+    1. [x] Determine if any changes need to be made.
+    2. [x] Get configuration of machine so know how to recreate it; including if machine is on.
+    3. [x] If so, ensure machine is off.
+    4. [x] Delete machine (not deleting any attached disks)
+    5. [ ] Move disks to new zone if zone changed
+    6. [x] Create machine with new params, disks, starting if it was running initially (but not otherwise).
+    ###
     change: (opts) =>
         opts = defaults opts,
             preemptible  : undefined    # whether or not VM is preemptible
-            type         : undefined    # the instance type
-            zone         : undefined    # which zone it runs in
+            type         : undefined    # the VM machine type
+            zone         : undefined    # which zone VM is located in
             boot_size_GB : undefined    # size in GB of boot disk
+            start        : undefined    # leave machine started after change, even if it was off
             cb           : undefined
         dbg = @dbg("change(#{misc.to_json(misc.map_without_undefined(misc.copy_with(opts, ['cb'])))})")
         dbg()
         data = undefined
         changes = {}
+        no_change = false
         async.series([
             (cb) =>
                 dbg('get vm metadata to see what needs to be changed')

        opts = defaults opts,
            size_GB   : undefined  # if specified must be at least as large as existing disk
            type      : undefined  # 'pd-standard' or 'pd-ssd'; if not given same as current
            cb        : required
        dbg = @dbg("reconfigure(name=#{misc.to_json(misc.copy_without(opts, ['cb']))})")
        if not opts.size_GB? and not opts.type?
            opts.cb()  # nothing to do
            return
        @_utility
            size_GB : opts.size_GB
            type    : opts.type
            delete  : true
            cb      : opts.cb


                            cb()
            (cb) =>
                dbg("determined changes=#{misc.to_json(changes)}")
                no_change = misc.len(changes) == 0
                if no_change
                    cb(); return
                dbg("data.status = '#{data.status}'")
                if data.status != 'TERMINATED'
                    dbg("Ensure machine is off.")
                    @stop(cb:cb)
                else
                    cb()
            (cb) =>
                if no_change
                    cb(); return
                dbg("delete machine (not deleting any attached disks)")
                @delete
                    keep_disks : true
                    cb         : cb
            (cb) =>
                if no_change
                    cb(); return
                if not changes.zone
                    cb(); return
                dbg("move disks to new zone")
                f = (disk, cb) =>
                    dbg("moving disk '#{disk}'")
                    d = @gcloud.disk(name:disk, zone:@zone)
                    async.series([
                        (cb) =>
                            d.copy
                                zone : changes.zone
                                cb   : cb
                        (cb) =>
                            d.delete
                                cb : cb
                    ], cb)
                async.map((filename(x.source) for x in data.disks), f, cb)
            (cb) =>
                if no_change
                    cb(); return
                dbg("Create machine with new params, disks, starting if it was running initially (but not otherwise).")
                @gcloud.create_vm
                    name        : @name
                    zone        : changes.zone ? @zone
                    disks       : (filename(x.source) for x in data.disks)
                    type        : changes.type ? filename(data.machineType)
                    tags        : data.tags.items
                    preemptible : changes.preemptible ? data.scheduling.preemptible
                    cb          : cb
            (cb) =>
                if no_change or data.status == 'RUNNING' or opts.start
                    cb(); return
                dbg("Stop machine")
                @stop(cb:cb)
        ], (err) =>
            opts.cb?(err)
        )

class Disk
    constructor: (@gcloud, @name, @zone=DEFAULT_ZONE) ->
