                 account =
                     first_name    : opts.first_name
                     last_name     : opts.last_name
-                    email_address : opts.email_address
-                    password_hash : opts.password_hash
                     created       : new Date()
                     created_by    : opts.created_by
+
+                if opts.password_hash?
+                    account.password_hash = opts.password_hash
+                if opts.email_address?
+                    account.email_address = opts.email_address
+
                 @table('accounts').insert(account).run (err, x) =>
                     if err
                         cb(err)

        if not @_validate_opts(opts) then return
        @table('projects').get(opts.project_id)('users')(opts.account_id)('group').run (err, group) =>
            if err?
                if err.name == "ReqlRuntimeError"
                    # indicates that there's no opts.account_id key in the table (or users key) -- error is different
                    # (i.e., ReqlDriverError) when caused by connection being down.
                    # one more chance -- admin?
                    @is_admin(opts.account_id, opts.cb)
                else

            cb         : required  # cb(err, ttl actually used in seconds); ttl=0 for infinite ttl
        @table('blobs').get(opts.uuid).pluck('expire').run (err, x) =>
            if err
                if err.name == 'RqlRuntimeError'
                    # get RqlRuntimeError if the blob not already saved, due to trying to pluck from nothing
                    x =
                        id         : opts.uuid
                        blob       : opts.blob
