Index: trac/ticket/api.py
===================================================================
--- trac/ticket/api.py	(revision 5112)
+++ trac/ticket/api.py	(working copy)
@@ -209,7 +209,14 @@
                 id=id, name=id))
         if 'leave_status' in operations:
             control.append("as %s" % (ticket['status'], ))
-
+        if 'set_status' in operations:
+            options = [val.name for val in model.Status.select(self.env)]
+            id = action + "_new_status"
+            selected_option = req.args.get(id, '')
+            control.append(tag.select(
+                [tag.option(x, selected = (x == selected_option and "selected" or ""))
+                    for x in options],
+                id = id, name = id))
         return (this_action['name'], tag(*control))
 
     def get_ticket_changes(self, req, ticket, action):
@@ -255,6 +262,11 @@
                 if ticket['resolution'] != newresolution:
                     updated['resolution'] = newresolution
 
+            if operation == "set_status":
+                newstatus = req.args.get(action + '_new_status')
+                if ticket['status'] != newstatus:
+                    updated['status'] = newstatus
+
             if operation == "leave_status":
                 pass # It's a no-op.
         return updated, ''
