diff --git a/nifty5/domain_tuple.py b/nifty5/domain_tuple.py
index 547b8e51bdc51a89f742574481fa241123a7df26..bacbeb8741b546b728bdbd1135961146dfa20120 100644
--- a/nifty5/domain_tuple.py
+++ b/nifty5/domain_tuple.py
@@ -149,6 +149,9 @@ class DomainTuple(object):
         return ("DomainTuple, len: {}\n".format(len(self)) +
                 "\n".join(str(i) for i in self))
 
+    def __reduce__(self):
+        return (_unpickleDomainTuple, (self._dom,))
+
     @staticmethod
     def scalar_domain():
         if DomainTuple._scalarDomain is None:
@@ -158,3 +161,7 @@ class DomainTuple(object):
     def __repr__(self):
         subs = "\n".join(sub.__repr__() for sub in self._dom)
         return "DomainTuple:\n"+utilities.indent(subs)
+
+
+def _unpickleDomainTuple(*args):
+    return DomainTuple.make(*args)
diff --git a/nifty5/multi_domain.py b/nifty5/multi_domain.py
index 613ed5b00031d2a3c784a5006563f7bdc3150a2c..834b06e10cfb47d1ca45de5fe39dddf9ab809f49 100644
--- a/nifty5/multi_domain.py
+++ b/nifty5/multi_domain.py
@@ -73,6 +73,9 @@ class MultiDomain(object):
     def keys(self):
         return self._keys
 
+    def values(self):
+        return self._domains
+
     def domains(self):
         return self._domains
 
@@ -95,7 +98,7 @@ class MultiDomain(object):
     def __eq__(self, x):
         if self is x:
             return True
-        return self.items() == x.items()
+        return list(self.items()) == list(x.items())
 
     def __ne__(self, x):
         return not self.__eq__(x)
@@ -121,7 +124,14 @@ class MultiDomain(object):
                     res[key] = subdom
         return MultiDomain.make(res)
 
+    def __reduce__(self):
+        return (_unpickleMultiDomain, (dict(self),))
+
     def __repr__(self):
         subs = "\n".join("{}:\n  {}".format(key, dom.__repr__())
                          for key, dom in self.items())
         return "MultiDomain:\n"+indent(subs)
+
+
+def _unpickleMultiDomain(*args):
+    return MultiDomain.make(*args)