Index: /trunk/src/VBox/Main/src-server/MachineImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/src-server/MachineImpl.cpp	(revision 78071)
+++ /trunk/src/VBox/Main/src-server/MachineImpl.cpp	(revision 78072)
@@ -1947,5 +1947,6 @@
 HRESULT Machine::getRecordingSettings(ComPtr<IRecordingSettings> &aRecordingSettings)
 {
-    /* mRecordingSettings is constant during life time, no need to lock */
+    AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
+
     aRecordingSettings = mRecordingSettings;
 
Index: /trunk/src/VBox/Main/src-server/RecordingScreenSettingsImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/src-server/RecordingScreenSettingsImpl.cpp	(revision 78071)
+++ /trunk/src/VBox/Main/src-server/RecordingScreenSettingsImpl.cpp	(revision 78072)
@@ -140,5 +140,8 @@
     unconst(m->pPeer)   = aThat;
 
-    AutoWriteLock thatlock(aThat COMMA_LOCKVAL_SRC_POS);
+    AutoCaller thatCaller(aThat);
+    AssertComRCReturnRC(thatCaller.rc());
+
+    AutoReadLock thatlock(aThat COMMA_LOCKVAL_SRC_POS);
 
     m->uScreenId = aThat->m->uScreenId;
@@ -183,5 +186,8 @@
     /* mPeer is left null. */
 
-    AutoWriteLock thatlock(aThat COMMA_LOCKVAL_SRC_POS);
+    AutoCaller thatCaller(aThat);
+    AssertComRCReturnRC(thatCaller.rc());
+
+    AutoReadLock thatlock(aThat COMMA_LOCKVAL_SRC_POS);
 
     m->uScreenId = aThat->m->uScreenId;
Index: /trunk/src/VBox/Main/src-server/RecordingSettingsImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/src-server/RecordingSettingsImpl.cpp	(revision 78071)
+++ /trunk/src/VBox/Main/src-server/RecordingSettingsImpl.cpp	(revision 78072)
@@ -100,4 +100,6 @@
  *  @note This object must be destroyed before the original object
  *  it shares data with is destroyed.
+ *
+ *  @note Locks @a aThat object for reading.
  */
 HRESULT RecordingSettings::init(Machine *aParent, RecordingSettings *aThat)
@@ -117,5 +119,8 @@
     unconst(m->pPeer)    = aThat;
 
-    AutoWriteLock thatlock(aThat COMMA_LOCKVAL_SRC_POS);
+    AutoCaller thatCaller(aThat);
+    AssertComRCReturnRC(thatCaller.rc());
+
+    AutoReadLock thatlock(aThat COMMA_LOCKVAL_SRC_POS);
 
     m->bd.share(aThat->m->bd);
@@ -132,4 +137,6 @@
  *  (a kind of copy constructor). This object makes a private copy of data
  *  of the original object passed as an argument.
+ *
+ *  @note Locks @a aThat object for reading.
  */
 HRESULT RecordingSettings::initCopy(Machine *aParent, RecordingSettings *aThat)
@@ -149,5 +156,5 @@
     // mPeer is left null
 
-    AutoWriteLock thatlock(aThat COMMA_LOCKVAL_SRC_POS);
+    AutoReadLock thatlock(aThat COMMA_LOCKVAL_SRC_POS);
 
     m->bd.attachCopy(aThat->m->bd);
@@ -201,5 +208,7 @@
 HRESULT RecordingSettings::setEnabled(BOOL enable)
 {
-    LogFlowThisFuncEnter();
+    /* the machine needs to be mutable */
+    AutoMutableOrSavedOrRunningStateDependency adep(m->pMachine);
+    if (FAILED(adep.rc())) return adep.rc();
 
     AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
@@ -215,4 +224,5 @@
 
         alock.release();
+
         rc = m->pMachine->i_onRecordingChange(enable);
         if (FAILED(rc))
@@ -232,4 +242,8 @@
             m->pMachine->i_setModified(Machine::IsModified_Recording);
 
+            /* Make sure to release the mutable dependency lock from above before
+             * actually saving the settings. */
+            adep.release();
+
             /** Save settings if online - @todo why is this required? -- @bugref{6818} */
             if (Global::IsOnline(m->pMachine->i_getMachineState()))
@@ -492,4 +506,8 @@
 void RecordingSettings::i_rollback()
 {
+    /* sanity */
+    AutoCaller autoCaller(this);
+    AssertComRCReturnVoid(autoCaller.rc());
+
     AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
     m->bd.rollback();
@@ -516,5 +534,4 @@
         {
             /* attach new data to the peer and reshare it */
-            AutoWriteLock peerlock(m->pPeer COMMA_LOCKVAL_SRC_POS);
             m->pPeer->m->bd.attach(m->bd);
         }
