diff --git a/tempy/tempy.py b/tempy/tempy.py
index 3385be4..83ec459 100755
--- a/tempy/tempy.py
+++ b/tempy/tempy.py
@@ -2,19 +2,20 @@
 # @author: Federico Cerchiari <federicocerchiari@gmail.com>
 """Main Tempy classes"""
 import html
+from collections import deque, Iterable
 from copy import copy
-from uuid import uuid4
-from itertools import chain
 from functools import wraps
-from collections import deque
+from itertools import chain
 from types import GeneratorType
+from uuid import uuid4
 
-from .exceptions import TagError, WrongContentError, DOMModByKeyError, DOMModByIndexError
+from .exceptions import TagError, WrongContentError, WrongArgsError, DOMModByKeyError, DOMModByIndexError
 from .tempyrepr import REPRFinder
 
 
 class DOMGroup:
     """Wrapper used to manage element insertion."""
+
     def __init__(self, name, obj):
         super().__init__()
         if not name and issubclass(obj.__class__, DOMElement):
@@ -167,7 +168,7 @@ class DOMElement(REPRFinder):
         if n == 0:
             self.parent.pop(self._own_index)
             return self
-        return self.after(self * (n-1))
+        return self.after(self * (n - 1))
 
     def to_code(self, pretty=False):
         ret = []
@@ -252,6 +253,7 @@ class DOMElement(REPRFinder):
                     # this trick is used to avoid circular imports
                     class Patched(tempyREPR_cls, DOMElement):
                         pass
+
                     child = Patched(child)
             try:
                 yield child.render(pretty=pretty)
@@ -272,6 +274,7 @@ class DOMElement(REPRFinder):
         Takes args and kwargs and calls the decorated method one time for each argument provided.
         The reverse parameter should be used for prepending (relative to self) methods.
         """
+
         def _receiver(func):
             @wraps(func)
             def wrapped(inst, *tags, **kwtags):
@@ -279,7 +282,9 @@ class DOMElement(REPRFinder):
                     inst._stable = False
                     func(inst, i, dom_group)
                 return inst
+
             return wrapped
+
         return _receiver
 
     def _insert(self, dom_group, idx=None, prepend=False):
@@ -298,7 +303,7 @@ class DOMElement(REPRFinder):
             for i_group, elem in enumerate(dom_group):
                 if elem is not None:
                     # Element insertion in this DOMElement childs
-                    self.childs.insert(idx+i_group, elem)
+                    self.childs.insert(idx + i_group, elem)
                     # Managing child attributes if needed
                     if issubclass(elem.__class__, DOMElement):
                         elem.parent = self
@@ -393,7 +398,6 @@ class DOMElement(REPRFinder):
 
     def wrap(self, other):
         """Wraps this element inside another empty tag."""
-        # TODO: make multiple with content_receiver
         if other.childs:
             raise TagError(self, 'Wrapping in a non empty Tag is forbidden.')
         if self.parent:
@@ -402,6 +406,51 @@ class DOMElement(REPRFinder):
         other.append(self)
         return self
 
+    def wrap_many(self, *args, strict=False):
+        """Wraps different copies of this element inside all empty tags
+        listed in params or param's (non-empty) iterators.
+
+        Returns list of copies of this element wrapped inside args
+        or None if not succeeded, in the same order and same structure,
+        i.e. args = (Div(), (Div())) -> value = (A(...), (A(...)))
+
+        If on some args it must raise TagError, it will only if strict is True,
+        otherwise it will do nothing with them and return Nones on their positions"""
+
+        for arg in args:
+            is_elem = arg and isinstance(arg, DOMElement)
+            is_elem_iter = (not is_elem and arg and isinstance(arg, Iterable) and
+                            isinstance(iter(arg).__next__(), DOMElement))
+            if not (is_elem or is_elem_iter):
+                raise WrongArgsError(self, 'Argument {} is not DOMElement nor iterable of DOMElements'.format(arg))
+
+        wcopies = []
+        failure = []
+
+        def wrap_next(tag, idx):
+            nonlocal wcopies, failure
+            next_copy = self.__copy__()
+            try:
+                return next_copy.wrap(tag)
+            except TagError:
+                failure.append(idx)
+                return next_copy
+
+        for arg_idx, arg in enumerate(args):
+            if isinstance(arg, DOMElement):
+                wcopies.append(wrap_next(arg, (arg_idx, -1)))
+            else:
+                iter_wcopies = []
+                for iter_idx, t in enumerate(arg):
+                    iter_wcopies.append(wrap_next(t, (arg_idx, iter_idx)))
+                wcopies.append(type(arg)(iter_wcopies))
+
+        if failure and strict:
+            raise TagError(self, 'Wrapping in a non empty Tag is forbidden, failed on arguments ' +
+                           ', '.join(list(map(lambda idx: str(idx[0]) if idx[1] == -1 else '[{1}] of {0}'.format(*idx),
+                                              failure))))
+        return wcopies
+
     def wrap_inner(self, other):
         self.move_childs(other)
         self(other)
@@ -599,7 +648,6 @@ class DOMElement(REPRFinder):
 
 
 class Escaped(DOMElement):
-
     def __init__(self, content, **kwargs):
         super().__init__(**kwargs)
         self._render = content

TODO: Wrapping into multiple containers
`DOMElement.wrap` now accepts a single `DOMElement` instance and wraps `self` into this other instance.

Method signature should change to accept a iterable as first argument or multiple (single or iterable) arguments. `self` (copies of) will be wrapped inside each given element, i.e:
    
    some_divs = [Div() for _ in range(10)]
    to_be_wrapped = Span()
    to_be_wrapped.wrap(some_divs, P(), A(), (Pre() for _ in range(10)))

wrap will add `to_be_wrapped` into each div in `some_divs`, and into each `DOMElement` found in args.

Extra implementation:
add kwargs in signature so wrapping will perform a named insertion.

https://codeclimate.com/github/Hrabal/TemPy/tempy/tempy.py#issue_59a0588692503c0001000033
diff --git a/tests/test_DOMElement.py b/tests/test_DOMElement.py
index f8a95d7..87737ff 100755
--- a/tests/test_DOMElement.py
+++ b/tests/test_DOMElement.py
@@ -4,14 +4,13 @@
 """
 import unittest
 
+from tempy.elements import Tag, TagAttrs
+from tempy.exceptions import WrongContentError, WrongArgsError, TagError, DOMModByKeyError, DOMModByIndexError
 from tempy.tags import Div, A, P, Html, Head, Body
 from tempy.tempy import DOMElement, DOMGroup, Escaped
-from tempy.elements import Tag, TagAttrs
-from tempy.exceptions import WrongContentError, TagError, DOMModByKeyError, DOMModByIndexError
 
 
 class TestDOMelement(unittest.TestCase):
-
     def setUp(self):
         self.page = Html()
 
@@ -84,13 +83,13 @@ class TestDOMelement(unittest.TestCase):
         new1 = Div().append_to(self.page)
         new2 = Div()
         new1.after(new2)
-        self.assertEqual(new1._own_index, new2._own_index-1)
+        self.assertEqual(new1._own_index, new2._own_index - 1)
 
     def test_before(self):
         new1 = Div().append_to(self.page)
         new2 = Div()
         new1.before(new2)
-        self.assertEqual(new1._own_index, new2._own_index+1)
+        self.assertEqual(new1._own_index, new2._own_index + 1)
 
     def test_prepend(self):
         self.page(Div(), Div())
@@ -134,6 +133,53 @@ class TestDOMelement(unittest.TestCase):
         self.assertTrue(to_wrap in container)
         self.assertTrue(container in outermost)
 
+    def test_wrap_many(self):
+        def flatten(cnt):
+            res = []
+            for el in cnt:
+                if isinstance(el, DOMElement):
+                    res.append(el)
+                else:
+                    res.extend(el)
+            return res
+
+        def test_return_values(inp, outp):
+            self.assertEqual(len(inp), len(outp))
+            for _ in range(len(inp)):
+                t1, t2 = type(inp[_]), type(outp[_])
+                self.assertTrue(t1 == t2 or
+                                issubclass(t1, DOMElement) and issubclass(t2, DOMElement))
+
+        def test_correctly_wrapped(child, parent):
+            self.assertTrue(child in parent)
+            self.assertTrue(child.get_parent() == parent)
+
+        # check if it works correct with correct arguments
+        args = (Div(), [Div(), Div()], (Div(), Div()))
+        new = A().wrap_many(*args)
+        test_return_values(args, new)
+        for c, p in zip(flatten(new), flatten(args)):
+            test_correctly_wrapped(c, p)
+
+        # check if it raises TagError with strict and returns None without
+        args = (Div()(A()), (Div(), Div()))
+        with self.assertRaisesRegex(TagError, r'^.+arguments 0$'):
+            A().wrap_many(*args, strict=True)
+        new = A().wrap_many(*args)
+        self.assertIs(new[0].get_parent(), None)
+
+        args = (Div()(A()), (Div(), Div()(A())))
+        with self.assertRaisesRegex(TagError, r'^.+arguments 0, \[1\] of 1'):
+            A().wrap_many(*args, strict=True)
+        new = A().wrap_many(*args)
+        self.assertIs(new[0].get_parent(), None)
+        self.assertIs(new[1][1].get_parent(), None)
+
+        # check if it raises WrongArgsError
+        args = (Div(), '')
+        with self.assertRaises(WrongArgsError):
+            A().wrap_many(*args)
+
     def test_replace_with(self):
         old = Div().append_to(self.page)
         old.replace_with(A())

pip install -e .
parse_log_pytest
pytest
pytest pytest-coverage
3.9
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
coverage==7.8.0
exceptiongroup @ file:///croot/exceptiongroup_1706031385326/work
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
packaging @ file:///croot/packaging_1734472117206/work
pluggy @ file:///croot/pluggy_1733169602837/work
pytest @ file:///croot/pytest_1738938843180/work
pytest-cov==6.0.0
pytest-cover==3.0.0
pytest-coverage==0.0
-e git+https://github.com/Hrabal/TemPy.git@7995be8f846c0aa8338fa0f3bc01aa3e3a21a6b8#egg=tem_py
tomli @ file:///opt/conda/conda-bld/tomli_1657175507142/work

name: TemPy
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - exceptiongroup=1.2.0=py39h06a4308_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - packaging=24.2=py39h06a4308_0
  - pip=25.0=py39h06a4308_0
  - pluggy=1.5.0=py39h06a4308_0
  - pytest=8.3.4=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tomli=2.0.1=py39h06a4308_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - coverage==7.8.0
      - pytest-cov==6.0.0
      - pytest-cover==3.0.0
      - pytest-coverage==0.0
prefix: /opt/conda/envs/TemPy

tests/test_DOMElement.py::TestDOMelement::test_wrap_many
tests/test_DOMElement.py::TestDOMelement::test__find_content tests/test_DOMElement.py::TestDOMelement::test__insert_negative_index tests/test_DOMElement.py::TestDOMelement::test_add tests/test_DOMElement.py::TestDOMelement::test_after tests/test_DOMElement.py::TestDOMelement::test_append tests/test_DOMElement.py::TestDOMelement::test_append_to tests/test_DOMElement.py::TestDOMelement::test_attrs tests/test_DOMElement.py::TestDOMelement::test_before tests/test_DOMElement.py::TestDOMelement::test_bft tests/test_DOMElement.py::TestDOMelement::test_children tests/test_DOMElement.py::TestDOMelement::test_childs_index tests/test_DOMElement.py::TestDOMelement::test_clone tests/test_DOMElement.py::TestDOMelement::test_contents tests/test_DOMElement.py::TestDOMelement::test_copy tests/test_DOMElement.py::TestDOMelement::test_create_call_generator tests/test_DOMElement.py::TestDOMelement::test_create_call_list tests/test_DOMElement.py::TestDOMelement::test_create_call_multitag tests/test_DOMElement.py::TestDOMelement::test_create_call_singletag tests/test_DOMElement.py::TestDOMelement::test_create_call_tuple tests/test_DOMElement.py::TestDOMelement::test_create_instantiation tests/test_DOMElement.py::TestDOMelement::test_dft tests/test_DOMElement.py::TestDOMelement::test_dft_reverse tests/test_DOMElement.py::TestDOMelement::test_empty tests/test_DOMElement.py::TestDOMelement::test_equality tests/test_DOMElement.py::TestDOMelement::test_escaped tests/test_DOMElement.py::TestDOMelement::test_get_parent tests/test_DOMElement.py::TestDOMelement::test_getattr tests/test_DOMElement.py::TestDOMelement::test_hash tests/test_DOMElement.py::TestDOMelement::test_iadd tests/test_DOMElement.py::TestDOMelement::test_imul tests/test_DOMElement.py::TestDOMelement::test_imul_zero tests/test_DOMElement.py::TestDOMelement::test_inject tests/test_DOMElement.py::TestDOMelement::test_is_root tests/test_DOMElement.py::TestDOMelement::test_isub tests/test_DOMElement.py::TestDOMelement::test_iter_chidls tests/test_DOMElement.py::TestDOMelement::test_iter_reversed tests/test_DOMElement.py::TestDOMelement::test_move tests/test_DOMElement.py::TestDOMelement::test_move_childs tests/test_DOMElement.py::TestDOMelement::test_mul tests/test_DOMElement.py::TestDOMelement::test_next tests/test_DOMElement.py::TestDOMelement::test_next_all tests/test_DOMElement.py::TestDOMelement::test_next_childs tests/test_DOMElement.py::TestDOMelement::test_next_magic tests/test_DOMElement.py::TestDOMelement::test_own_index tests/test_DOMElement.py::TestDOMelement::test_parent tests/test_DOMElement.py::TestDOMelement::test_pop tests/test_DOMElement.py::TestDOMelement::test_prepend tests/test_DOMElement.py::TestDOMelement::test_prepend_to tests/test_DOMElement.py::TestDOMelement::test_prev tests/test_DOMElement.py::TestDOMelement::test_prev_all tests/test_DOMElement.py::TestDOMelement::test_remove tests/test_DOMElement.py::TestDOMelement::test_render_raise tests/test_DOMElement.py::TestDOMelement::test_replace_with tests/test_DOMElement.py::TestDOMelement::test_reverse tests/test_DOMElement.py::TestDOMelement::test_root tests/test_DOMElement.py::TestDOMelement::test_siblings tests/test_DOMElement.py::TestDOMelement::test_slice tests/test_DOMElement.py::TestDOMelement::test_sub tests/test_DOMElement.py::TestDOMelement::test_wrap tests/test_DOMElement.py::TestDOMelement::test_wrap_inner
tempy/tempy.py
tempy/tempy.py