Index: /trunk/doc/manual/en_US/man_VBoxManage-modifynvram.xml
===================================================================
--- /trunk/doc/manual/en_US/man_VBoxManage-modifynvram.xml	(revision 91684)
+++ /trunk/doc/manual/en_US/man_VBoxManage-modifynvram.xml	(revision 91685)
@@ -70,4 +70,18 @@
       <arg>--filename=<replaceable>filename</replaceable></arg>
     </cmdsynopsis>
+    <cmdsynopsis id="synopsis-vboxmanage-modifynvram-deletevar">
+      <command>VBoxManage modifynvram</command>
+      <arg choice="req"><replaceable>uuid|vmname</replaceable></arg>
+      <arg choice="plain">deletevar</arg>
+      <arg>--name=<replaceable>name</replaceable></arg>
+      <arg>--owner-uuid=<replaceable>uuid</replaceable></arg>
+    </cmdsynopsis>
+    <cmdsynopsis id="synopsis-vboxmanage-modifynvram-changevar">
+      <command>VBoxManage modifynvram</command>
+      <arg choice="req"><replaceable>uuid|vmname</replaceable></arg>
+      <arg choice="plain">changevar</arg>
+      <arg>--name=<replaceable>name</replaceable></arg>
+      <arg>--filename=<replaceable>filename</replaceable></arg>
+    </cmdsynopsis>
   </refsynopsisdiv>
 
@@ -172,4 +186,45 @@
     </refsect2>
 
+    <refsect2 id="vboxmanage-modifynvram-deletevar">
+      <title>modifynvram deletevar</title>
+      <remark role="help-copy-synopsis"/>
+      <para>
+        Deletes the given variable identified by its name and owner UUID.
+      </para>
+      <variablelist>
+        <varlistentry>
+          <term><option>--name=<replaceable>name</replaceable></option></term>
+          <listitem><para>UEFI variable name to delete.</para>
+          </listitem>
+        </varlistentry>
+        <varlistentry>
+          <term><option>--owner-uuid=<replaceable>uuid</replaceable></option></term>
+          <listitem><para>The UUID identifying the owner of the variable to delete.</para>
+          </listitem>
+        </varlistentry>
+      </variablelist>
+    </refsect2>
+
+    <refsect2 id="vboxmanage-modifynvram-changevar">
+      <title>modifynvram changevar</title>
+      <remark role="help-copy-synopsis"/>
+      <para>
+        Changes the UEFI variable content to the one form the given file.
+      </para>
+      <variablelist>
+        <varlistentry>
+          <term><option>--name=<replaceable>name</replaceable></option></term>
+          <listitem><para>UEFI variable name to change the data for.</para>
+          </listitem>
+        </varlistentry>
+        <varlistentry>
+          <term><option>--filename=<replaceable>filename</replaceable></option></term>
+          <listitem>
+            <para>The file to read the data from.</para>
+          </listitem>
+        </varlistentry>
+      </variablelist>
+    </refsect2>
+
   </refsect1>
 </refentry>
Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxManageModifyNvram.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxManageModifyNvram.cpp	(revision 91684)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxManageModifyNvram.cpp	(revision 91685)
@@ -289,4 +289,132 @@
 
 /**
+ * Handles the 'modifynvram myvm deletevar' sub-command.
+ * @returns Exit code.
+ * @param   a               The handler argument package.
+ * @param   nvram           Reference to the NVRAM store interface.
+ */
+static RTEXITCODE handleModifyNvramDeleteUefiVar(HandlerArg *a, ComPtr<INvramStore> &nvramStore)
+{
+    static const RTGETOPTDEF s_aOptions[] =
+    {
+        /* common options */
+        { "--name",       'n', RTGETOPT_REQ_STRING },
+        { "--owner-uuid", 'f', RTGETOPT_REQ_STRING }
+    };
+
+    const char *pszVarName = NULL;
+    const char *pszOwnerUuid = NULL;
+
+    RTGETOPTSTATE GetState;
+    int vrc = RTGetOptInit(&GetState, a->argc - 2, &a->argv[2], s_aOptions, RT_ELEMENTS(s_aOptions), 0, 0);
+    AssertRCReturn(vrc, RTEXITCODE_FAILURE);
+
+    int c;
+    RTGETOPTUNION ValueUnion;
+    while ((c = RTGetOpt(&GetState, &ValueUnion)) != 0)
+    {
+        switch (c)
+        {
+            case 'n':
+                pszVarName = ValueUnion.psz;
+                break;
+            case 'f':
+                pszOwnerUuid = ValueUnion.psz;
+                break;
+            default:
+                return errorGetOpt(c, &ValueUnion);
+        }
+    }
+
+    if (!pszVarName)
+        return errorSyntax("No variable name was given to \"deletevar\"");
+    if (!pszOwnerUuid)
+        return errorSyntax("No owner UUID was given to \"deletevar\"");
+
+    ComPtr<IUefiVariableStore> uefiVarStore;
+    CHECK_ERROR2I_RET(nvramStore, COMGETTER(UefiVariableStore)(uefiVarStore.asOutParam()), RTEXITCODE_FAILURE);
+    CHECK_ERROR2I_RET(uefiVarStore, DeleteVariable(Bstr(pszVarName).raw(), Bstr(pszOwnerUuid).raw()), RTEXITCODE_FAILURE);
+
+    return RTEXITCODE_SUCCESS;
+}
+
+
+/**
+ * Handles the 'modifynvram myvm changevar' sub-command.
+ * @returns Exit code.
+ * @param   a               The handler argument package.
+ * @param   nvram           Reference to the NVRAM store interface.
+ */
+static RTEXITCODE handleModifyNvramChangeUefiVar(HandlerArg *a, ComPtr<INvramStore> &nvramStore)
+{
+    static const RTGETOPTDEF s_aOptions[] =
+    {
+        /* common options */
+        { "--name",       'n', RTGETOPT_REQ_STRING },
+        { "--filename",   'f', RTGETOPT_REQ_STRING }
+    };
+
+    const char *pszVarName = NULL;
+    const char *pszVarDataFilename = NULL;
+
+    RTGETOPTSTATE GetState;
+    int vrc = RTGetOptInit(&GetState, a->argc - 2, &a->argv[2], s_aOptions, RT_ELEMENTS(s_aOptions), 0, 0);
+    AssertRCReturn(vrc, RTEXITCODE_FAILURE);
+
+    int c;
+    RTGETOPTUNION ValueUnion;
+    while ((c = RTGetOpt(&GetState, &ValueUnion)) != 0)
+    {
+        switch (c)
+        {
+            case 'n':
+                pszVarName = ValueUnion.psz;
+                break;
+            case 'f':
+                pszVarDataFilename = ValueUnion.psz;
+                break;
+            default:
+                return errorGetOpt(c, &ValueUnion);
+        }
+    }
+
+    if (!pszVarName)
+        return errorSyntax("No variable name was given to \"changevar\"");
+    if (!pszVarDataFilename)
+        return errorSyntax("No variable data filename was given to \"changevar\"");
+
+    RTFILE hFile = NIL_RTFILE;
+    RTEXITCODE rcExit = RTEXITCODE_SUCCESS;
+    vrc = RTFileOpen(&hFile, pszVarDataFilename, RTFILE_O_OPEN | RTFILE_O_READ | RTFILE_O_DENY_NONE);
+    if (RT_SUCCESS(vrc))
+    {
+        uint64_t cbFile = 0;
+        vrc = RTFileQuerySize(hFile, &cbFile);
+        if (RT_SUCCESS(vrc))
+        {
+            com::SafeArray<BYTE> aData;
+            aData.resize(cbFile);
+
+            vrc = RTFileRead(hFile, aData.raw(), aData.size(), NULL /*pcbRead*/);
+            RTFileClose(hFile);
+
+            if (RT_SUCCESS(vrc))
+            {
+                ComPtr<IUefiVariableStore> uefiVarStore;
+                CHECK_ERROR2I_RET(nvramStore, COMGETTER(UefiVariableStore)(uefiVarStore.asOutParam()), RTEXITCODE_FAILURE);
+                CHECK_ERROR2I_RET(uefiVarStore, ChangeVariable(Bstr(pszVarName).raw(), ComSafeArrayAsInParam(aData)), RTEXITCODE_FAILURE);
+            }
+            else
+                rcExit = RTMsgErrorExitFailure("Error reading from '%s': %Rrc", pszVarDataFilename, vrc);
+        }
+    }
+    else
+       rcExit = RTMsgErrorExitFailure("Error opening '%s': %Rrc", pszVarDataFilename, vrc);
+
+    return rcExit;
+}
+
+
+/**
  * Handles the 'modifynvram' command.
  * @returns Exit code.
@@ -344,4 +472,14 @@
         rc = handleModifyNvramQueryUefiVar(a, nvramStore) == RTEXITCODE_SUCCESS ? S_OK : E_FAIL;
     }
+    else if (!strcmp(a->argv[1], "deletevar"))
+    {
+        setCurrentSubcommand(HELP_SCOPE_MODIFYNVRAM_DELETEVAR);
+        rc = handleModifyNvramDeleteUefiVar(a, nvramStore) == RTEXITCODE_SUCCESS ? S_OK : E_FAIL;
+    }
+    else if (!strcmp(a->argv[1], "changevar"))
+    {
+        setCurrentSubcommand(HELP_SCOPE_MODIFYNVRAM_CHANGEVAR);
+        rc = handleModifyNvramChangeUefiVar(a, nvramStore) == RTEXITCODE_SUCCESS ? S_OK : E_FAIL;
+    }
     else
         return errorUnknownSubcommand(a->argv[0]);
Index: /trunk/src/VBox/Main/include/UefiVariableStoreImpl.h
===================================================================
--- /trunk/src/VBox/Main/include/UefiVariableStoreImpl.h	(revision 91684)
+++ /trunk/src/VBox/Main/include/UefiVariableStoreImpl.h	(revision 91685)
@@ -78,4 +78,5 @@
 
     HRESULT i_uefiVarStoreAddVar(PCEFI_GUID pGuid, const char *pszVar, uint32_t fAttr, PRTVFSFILE phVfsFile);
+    HRESULT i_uefiVarStoreOpenVar(const char *pszVar, PRTVFSFILE phVfsFile);
     HRESULT i_uefiVarStoreSetVar(PCEFI_GUID pGuid, const char *pszVar, uint32_t fAttr, const void *pvData, size_t cbData);
     HRESULT i_uefiVarStoreQueryVar(const char *pszVar, void *pvData, size_t cbData);
Index: /trunk/src/VBox/Main/src-server/UefiVariableStoreImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/src-server/UefiVariableStoreImpl.cpp	(revision 91684)
+++ /trunk/src/VBox/Main/src-server/UefiVariableStoreImpl.cpp	(revision 91685)
@@ -242,6 +242,36 @@
 HRESULT UefiVariableStore::deleteVariable(const com::Utf8Str &aName, const com::Guid &aOwnerUuid)
 {
-    RT_NOREF(aName, aOwnerUuid);
-    return E_NOTIMPL;
+    RT_NOREF(aOwnerUuid);
+
+    /* the machine needs to be mutable */
+    AutoMutableStateDependency adep(m->pMachine);
+    if (FAILED(adep.rc())) return adep.rc();
+
+    HRESULT hrc = i_retainUefiVariableStore(false /*fReadonly*/);
+    if (FAILED(hrc)) return hrc;
+
+    AutoWriteLock wlock(this COMMA_LOCKVAL_SRC_POS);
+
+    char szVarPath[_1K];
+    ssize_t cch = RTStrPrintf2(szVarPath, sizeof(szVarPath), "/raw/%s", aName.c_str());
+    if (cch > 0)
+    {
+        RTVFSDIR hVfsDirRoot = NIL_RTVFSDIR;
+        int vrc = RTVfsOpenRoot(m->hVfsUefiVarStore, &hVfsDirRoot);
+        if (RT_SUCCESS(vrc))
+        {
+            vrc = RTVfsDirRemoveDir(hVfsDirRoot, szVarPath, 0 /*fFlags*/);
+            RTVfsDirRelease(hVfsDirRoot);
+            if (RT_FAILURE(vrc))
+                hrc = setError(VBOX_E_IPRT_ERROR, tr("Failed to remove variable '%s' (%Rrc)"), aName.c_str(), vrc);
+        }
+        else
+            hrc = setError(VBOX_E_IPRT_ERROR, tr("Failed to open the variable store root (%Rrc)"), vrc);
+    }
+    else
+        hrc = setError(E_FAIL, tr("The variable name is too long"));
+
+    i_releaseUefiVariableStore();
+    return hrc;
 }
 
@@ -249,6 +279,32 @@
 HRESULT UefiVariableStore::changeVariable(const com::Utf8Str &aName, const std::vector<BYTE> &aData)
 {
-    RT_NOREF(aName, aData);
-    return E_NOTIMPL;
+    /* the machine needs to be mutable */
+    AutoMutableStateDependency adep(m->pMachine);
+    if (FAILED(adep.rc())) return adep.rc();
+
+    HRESULT hrc = i_retainUefiVariableStore(false /*fReadonly*/);
+    if (FAILED(hrc)) return hrc;
+
+    AutoWriteLock wlock(this COMMA_LOCKVAL_SRC_POS);
+
+    RTVFSFILE hVfsFile = NIL_RTVFSFILE;
+    hrc = i_uefiVarStoreOpenVar(aName.c_str(), &hVfsFile);
+    if (SUCCEEDED(hrc))
+    {
+        int vrc = RTVfsFileSetSize(hVfsFile, aData.size(), RTVFSFILE_SIZE_F_NORMAL);
+        if (RT_SUCCESS(vrc))
+        {
+            vrc = RTVfsFileWriteAt(hVfsFile, 0 /*off*/, &aData.front(), aData.size(), NULL /*pcbWritten*/);
+            if (RT_FAILURE(vrc))
+                hrc = setError(VBOX_E_IPRT_ERROR, tr("Failed to data for variable '%s' (%Rrc)"), aName.c_str(), vrc);
+        }
+        else
+            hrc = setError(VBOX_E_IPRT_ERROR, tr("Failed to allocate space for the variable '%s' (%Rrc)"), aName.c_str(), vrc);
+
+        RTVfsFileRelease(hVfsFile);
+    }
+
+    i_releaseUefiVariableStore();
+    return hrc;
 }
 
@@ -743,4 +799,31 @@
 
 
+/**
+ * Tries to open the given variable from the variable store and returns a file handle.
+ *
+ * @returns IPRT status code.
+ * @param   pszVar              The variable name.
+ * @param   phVfsFile           Where to return the VFS file handle to the created variable on success.
+ */
+HRESULT UefiVariableStore::i_uefiVarStoreOpenVar(const char *pszVar, PRTVFSFILE phVfsFile)
+{
+    char szVarPath[_1K];
+    ssize_t cch = RTStrPrintf2(szVarPath, sizeof(szVarPath), "/by-name/%s", pszVar);
+    Assert(cch > 0); RT_NOREF(cch);
+
+    HRESULT hrc = S_OK;
+    int vrc = RTVfsFileOpen(m->hVfsUefiVarStore, szVarPath,
+                            RTFILE_O_READWRITE | RTFILE_O_DENY_NONE | RTFILE_O_OPEN,
+                            phVfsFile);
+    if (   vrc == VERR_PATH_NOT_FOUND
+        || vrc == VERR_FILE_NOT_FOUND)
+        hrc = setError(VBOX_E_OBJECT_NOT_FOUND, tr("The variable '%s' could not be found"), pszVar);
+    else if (RT_FAILURE(vrc))
+        hrc = setError(VBOX_E_IPRT_ERROR, tr("Couldn't open variable '%s' (%Rrc)"), pszVar, vrc);
+
+    return hrc;
+}
+
+
 HRESULT UefiVariableStore::i_uefiVarStoreSetVar(PCEFI_GUID pGuid, const char *pszVar, uint32_t fAttr, const void *pvData, size_t cbData)
 {
