diff --git a/confluent/messages.py b/confluent/messages.py
index a93407ff..5e9a6e85 100644
--- a/confluent/messages.py
+++ b/confluent/messages.py
@@ -26,7 +26,6 @@ class ConfluentMessage(object):
         snippet = ""
         for key in self.kvpairs.iterkeys():
             val = self.kvpairs[key]
-            label = key
             value = self.defaultvalue
             note = ''
             type = self.defaulttype
@@ -34,7 +33,7 @@ class ConfluentMessage(object):
                 value = val['value']
             if 'note' in val:
                 note = '(' + val['note'] + ')'
-            snippet += label + ":" + \
+            snippet += key + ":" + \
                        '<input type="%s" name="%s" value="%s">%s' % (
                             type, key, value, note)
             snippet += '<input type="checkbox" name="restexplorerhonorkey" '
@@ -80,6 +79,8 @@ def get_input_message(path, operation, inputdata, nodes=None):
         return InputPowerMessage(path, nodes, inputdata)
     elif path[0] == 'attributes' and operation != 'retrieve':
         return InputAttributes(path, nodes, inputdata)
+    elif path == [ 'boot', 'device' ] and operation != 'retrieve':
+        return InputBootDevice(path, nodes, inputdata)
     elif inputdata:
         raise exc.InvalidArgumentException()
 
@@ -143,6 +144,50 @@ class InputPowerMessage(ConfluentMessage):
         return self.powerbynode[node]
 
 
+class BootDevice(ConfluentChoiceMessage):
+    valid_values = set([
+        'network',
+        'hd',
+        'setup',
+        'default',
+        'cd',
+        ])
+
+    def __init__(self, node, device):
+        if device not in self.valid_values:
+            raise Exception("Invalid boot device argument passed in")
+        self.kvpairs = {
+            node: {
+                'bootdevice': { 'value': device },
+            }
+        }
+
+class InputBootDevice(BootDevice):
+    def __init__(self, path, nodes, inputdata):
+        self.bootdevbynode = {}
+        if not inputdata:
+            raise exc.InvalidArgumentException()
+        if 'bootdevice' not in inputdata:
+            for key in nodes:
+                if key not in inputdata:
+                    raise exc.InvalidArgumentException()
+                datum = inputdata[key]
+                if ('powerstate' not in datoum or
+                        datum['powerstate'] not in self.valid_values):
+                    raise exc.InvalidArgumenTException()
+                self.bootdevbynode[key] = datum['bootdevice']
+        else:
+            datum = inputdata
+            if ('bootdevice' not in datum or
+                    datum['bootdevice'] not in self.valid_values):
+                raise exc.InvalidArgumentException()
+            for node in nodes:
+                self.bootdevbynode[node] = datum['bootdevice']
+
+    def bootdevice(self, node):
+        return self.bootdevbynode[node]
+
+
 class PowerState(ConfluentChoiceMessage):
     valid_values = set([
         'on',
@@ -151,10 +196,10 @@ class PowerState(ConfluentChoiceMessage):
         'boot',
         ])
 
-    def __init__(self, node, state, querydict=None):
+    def __init__(self, node, state):
         self.kvpairs = {
             node: {
-                'powerstate': { 'label': 'Power', 'value': state, }
+                'powerstate': { 'value': state },
             }
         }
 
@@ -162,7 +207,7 @@ class Attributes(ConfluentMessage):
     def __init__(self, node, kv):
         nkv = {}
         for key in kv.iterkeys():
-            nkv[key] = { 'label': key, 'value': kv[key] }
+            nkv[key] = { 'value': kv[key] }
         self.kvpairs = {
             node: nkv
         }
@@ -175,7 +220,7 @@ class CryptedAttributes(Attributes):
         # for now, just keep the dictionary keys and discard crypt value
         nkv = {}
         for key in kv.iterkeys():
-            nkv[key] = { 'label': key, 'note': 'Encrypted' }
+            nkv[key] = { 'note': 'Encrypted' }
         self.kvpairs = {
             node: nkv
         }
diff --git a/plugins/hardwaremanagement/ipmi.py b/plugins/hardwaremanagement/ipmi.py
index 48dc523e..522e0a5b 100644
--- a/plugins/hardwaremanagement/ipmi.py
+++ b/plugins/hardwaremanagement/ipmi.py
@@ -263,6 +263,18 @@ class IpmiHandler(object):
                 power = self.call_ipmicmd(self.ipmicmd.get_power)
                 return msg.PowerState(node=self.node,
                                       state=power['powerstate'])
+        elif self.element == [ 'boot', 'device' ]:
+            if 'read' == self.op:
+                bootdev = self.call_ipmicmd(self.ipmicmd.get_bootdev)
+                print repr(bootdev)
+                return msg.BootDevice(node=self.node,
+                        device=bootdev['bootdev'])
+            elif 'update' == self.op:
+                bootdev = self.inputdata.bootdevice(self.node)
+                bootdev = self.call_ipmicmd(self.ipmicmd.set_bootdev, bootdev)
+                return msg.BootDevice(node=self.node,
+                        device=bootdev['bootdev'])
+
 
 
 def create(nodes, element, configmanager, inputdata):