diff --git a/nifty6/operators/operator.py b/nifty6/operators/operator.py
index 4d2ebcc51d4e851ecf0f23ca230fda50d967d445..31b24772b9d7fc5eafd5acf41357b2d7eaaa132a 100644
--- a/nifty6/operators/operator.py
+++ b/nifty6/operators/operator.py
@@ -79,6 +79,35 @@ class Operator(metaclass=NiftyMeta):
             return NotImplemented
         return _OpChain.make((self, x))
 
+    def partial_insert(self, x):
+        from ..multi_domain import MultiDomain
+        if not isinstance(x, Operator):
+            raise TypeError
+        if not isinstance(self.domain, MultiDomain):
+            raise TypeError
+        if not isinstance(x.target, MultiDomain):
+            raise TypeError
+        bigdom = MultiDomain.union([self.domain, x.target])
+        k1, k2 = set(self.domain.keys()), set(x.target.keys())
+        le, ri = k2 - k1, k1 - k2
+        leop, riop = self, x
+        if len(ri) > 0:
+            riop = riop + self.identity_operator(
+                MultiDomain.make({kk: bigdom[kk]
+                                  for kk in ri}))
+        if len(le) > 0:
+            leop = leop + self.identity_operator(
+                MultiDomain.make({kk: bigdom[kk]
+                                  for kk in le}))
+        return leop @ riop
+
+    @staticmethod
+    def identity_operator(dom):
+        from .block_diagonal_operator import BlockDiagonalOperator
+        from .scaling_operator import ScalingOperator
+        idops = {kk: ScalingOperator(dd, 1.) for kk, dd in dom.items()}
+        return BlockDiagonalOperator(dom, idops)
+
     def __mul__(self, x):
         if isinstance(x, Operator):
             return _OpProd(self, x)