diff --git a/daemons/ganeti-noded b/daemons/ganeti-noded
index e37c78985236c6990f77a9004924baa7291bcb0c..58d755e10f9260b7d30b421be5f9028c814af8f1 100755
--- a/daemons/ganeti-noded
+++ b/daemons/ganeti-noded
@@ -385,6 +385,14 @@ class NodeHttpServer(http.server.HttpServer):
     (su_name, su_args, name, changes) = params
     return storage.GetStorage(su_name, *su_args).Modify(name, changes)
 
+  @staticmethod
+  def perspective_storage_execute(params):
+    """Execute an operation on a storage unit.
+
+    """
+    (su_name, su_args, name, op) = params
+    return storage.GetStorage(su_name, *su_args).Execute(name, op)
+
   # bridge  --------------------------
 
   @staticmethod
diff --git a/lib/rpc.py b/lib/rpc.py
index c2e088014fd2270801053a2db8ec622ad802585a..235754e2183d4785be4cac3e5dd8abd5d613c8e9 100644
--- a/lib/rpc.py
+++ b/lib/rpc.py
@@ -450,6 +450,15 @@ class RpcRunner(object):
     return self._SingleNodeCall(node, "storage_modify",
                                 [su_name, su_args, name, changes])
 
+  def call_storage_execute(self, node, su_name, su_args, name, op):
+    """Executes an operation on a storage unit.
+
+    This is a single-node call.
+
+    """
+    return self._SingleNodeCall(node, "storage_execute",
+                                [su_name, su_args, name, op])
+
   def call_bridges_exist(self, node, bridges_list):
     """Checks if a node has all the bridges given.