Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxManage.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxManage.cpp	(revision 51888)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxManage.cpp	(revision 51889)
@@ -480,4 +480,5 @@
             { "unregistervm",     USAGE_UNREGISTERVM,      handleUnregisterVM },
             { "clonevm",          USAGE_CLONEVM,           handleCloneVM },
+            { "hdproperty",       USAGE_HDPROPERTY,        handleMediumProperty },
             { "createhd",         USAGE_CREATEHD,          handleCreateHardDisk },
             { "createvdi",        USAGE_CREATEHD,          handleCreateHardDisk }, /* backward compatibility */
Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxManage.h
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxManage.h	(revision 51888)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxManage.h	(revision 51889)
@@ -104,4 +104,5 @@
 #define USAGE_REPAIRHD              RT_BIT_64(58)
 #define USAGE_NATNETWORK            RT_BIT_64(59)
+#define USAGE_HDPROPERTY            RT_BIT_64(60)
 #define USAGE_ALL                   (~(uint64_t)0)
 /** @} */
@@ -260,4 +261,5 @@
 int handleModifyHardDisk(HandlerArg *a);
 int handleCloneHardDisk(HandlerArg *a);
+int handleMediumProperty(HandlerArg *a);
 RTEXITCODE handleConvertFromRaw(int argc, char *argv[]);
 HRESULT showMediumInfo(const ComPtr<IVirtualBox> &pVirtualBox,
Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxManageDisk.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxManageDisk.cpp	(revision 51888)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxManageDisk.cpp	(revision 51889)
@@ -1352,3 +1352,56 @@
     return SUCCEEDED(rc) ? 0 : 1;
 }
+
+int handleMediumProperty(HandlerArg *a)
+{
+    HRESULT rc = S_OK;
+    const char *pszAction = NULL;
+    const char *pszFilenameOrUuid = NULL;
+    const char *pszProperty = NULL;
+    ComPtr<IMedium> pMedium;
+
+    if (a->argc == 0)
+        return errorSyntax(USAGE_HDPROPERTY, "Missing action");
+
+    pszAction = a->argv[0];
+    if (   RTStrICmp(pszAction, "set")
+        && RTStrICmp(pszAction, "get")
+        && RTStrICmp(pszAction, "delete"))
+        return errorSyntax(USAGE_HDPROPERTY, "Invalid action given: %s", pszAction);
+
+    if (   (   !RTStrICmp(pszAction, "set")
+            && a->argc != 4)
+        || (   RTStrICmp(pszAction, "set")
+            && a->argc != 3))
+        return errorSyntax(USAGE_HDPROPERTY, "Invalid number of arguments given for action: %s", pszAction);
+
+    pszFilenameOrUuid = a->argv[1];
+    pszProperty       = a->argv[2];
+
+    rc = openMedium(a, pszFilenameOrUuid, DeviceType_HardDisk,
+                    AccessMode_ReadWrite, pMedium,
+                    false /* fForceNewUuidOnOpen */, false /* fSilent */);
+    if (SUCCEEDED(rc) && !pMedium.isNull())
+    {
+        if (!RTStrICmp(pszAction, "set"))
+        {
+            const char *pszValue = a->argv[3];
+            CHECK_ERROR(pMedium, SetProperty(Bstr(pszProperty).raw(), Bstr(pszValue).raw()));
+        }
+        else if (!RTStrICmp(pszAction, "get"))
+        {
+            Bstr strVal;
+            CHECK_ERROR(pMedium, GetProperty(Bstr(pszProperty).raw(), strVal.asOutParam()));
+            if (SUCCEEDED(rc))
+                RTPrintf("%s=%ls\n", pszProperty, strVal.raw());
+        }
+        else if (!RTStrICmp(pszAction, "delete"))
+        {
+            /** @todo */
+        }
+    }
+
+    return SUCCEEDED(rc) ? 0 : 1;
+}
+
 #endif /* !VBOX_ONLY_DOCS */
Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp	(revision 51888)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp	(revision 51889)
@@ -615,4 +615,16 @@
                      "\n", SEP);
 
+    if (fCategory & USAGE_HDPROPERTY)
+        RTStrmPrintf(pStrm,
+                           "%s hdproperty %s      set <uuid|filename>\n"
+                     "                            <property> <value>\n"
+                     "\n"
+                     "                            get <uuid|filename>\n"
+                     "                            <property>\n"
+                     "\n"
+                     "                            delete <uuid|filename>\n"
+                     "                            <property>\n"
+                     "\n", SEP);
+
     if (fCategory & USAGE_CONVERTFROMRAW)
         RTStrmPrintf(pStrm,
