diff --git a/VirtualRobot/MJCF/Document.cpp b/VirtualRobot/MJCF/Document.cpp
index 153c478a1b9eecf2310096de4cb36cc2f1d5a290..df62aed86ad7f288ced04902d6cf1997b033a914 100644
--- a/VirtualRobot/MJCF/Document.cpp
+++ b/VirtualRobot/MJCF/Document.cpp
@@ -15,6 +15,27 @@ Document::Document() : document(new tinyxml2::XMLDocument())
     root.reset(new MujocoRoot(this, xml));
 }
 
+Document::Document(const Document& other)
+{
+    deepCopyFrom(other);
+}
+
+Document::Document(Document&& other) = default;
+
+Document& Document::operator=(const Document& other)
+{
+    if (&other == this)
+    {
+        return *this;
+    }
+    
+    deepCopyFrom(other);
+    return *this;
+}
+
+Document& Document::operator=(Document&& other) = default;
+
+
 void Document::loadFile(const std::string& fileName)
 {
     tinyxml2::XMLError error = document->LoadFile(fileName.c_str());
diff --git a/VirtualRobot/MJCF/Document.h b/VirtualRobot/MJCF/Document.h
index 38aef4d53bd98014afca9ad7e48588947eeb2db0..17b15d0a64dfd8c1fceadd9cfe241275c93a021a 100644
--- a/VirtualRobot/MJCF/Document.h
+++ b/VirtualRobot/MJCF/Document.h
@@ -25,6 +25,18 @@ namespace mjcf
         /// Constructor.
         Document();
         
+        
+        /// Copy constructor. Performs a deep copy from `other` to `*this`.
+        Document(const Document& other);
+        /// Move constructor.
+        Document(Document&& other);
+        
+        /// Copy assignment operator. Performs a deep copy from `other` to `*this`.
+        Document& operator= (const Document& other);
+        /// Move assignment operator.
+        Document& operator= (Document&& other);
+        
+        
         /// Set the precision for float comparison.
         float getFloatCompPrecision() const;
         /// Set the precision for float comparison (used e.g. when comparing
@@ -40,7 +52,7 @@ namespace mjcf
         /// Save to an MJCF file.
         void saveFile(const std::string& fileName);
         
-        /// Make a deep copy of source to this.
+        /// Make a deep copy of source to `*this`.
         void deepCopyFrom(const Document& source);
         
         void print(std::ostream& os = std::cout) const;