diff --git a/CHANGELOG.md b/CHANGELOG.md
index d99e3acd87390885dda1102e629743cb1be1822a..88c20d2365e257a73c068ef6c78b93ff7455ceba 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,2 +1,3 @@
 # v2.7.47
 
+added `random.shuffle_together`
diff --git a/docs/index.rst b/docs/index.rst
index 2a7504fcce99d7270da1154daf7dc8283a64c610..28eff3ed499c849b8744e4609cdeff7e8dc95708 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -24,6 +24,7 @@ Visit the project's page at GitHub_!
            posix
            import
            files
+           random
            time
            exceptions
            processes
diff --git a/docs/random.rst b/docs/random.rst
new file mode 100644
index 0000000000000000000000000000000000000000..5652fb6cc5682dc4438df419ff0b77d1008355cc
--- /dev/null
+++ b/docs/random.rst
@@ -0,0 +1,4 @@
+shuffle_together
+================
+
+.. autofunction:: satella.random.shuffle_together
diff --git a/satella/__init__.py b/satella/__init__.py
index a0c7fdb6bbdf213e5c0403dcc6a1e43f5df3b614..19935a15f838b588c727c6af053554d5e186590c 100644
--- a/satella/__init__.py
+++ b/satella/__init__.py
@@ -1 +1 @@
-__version__ = '2.7.47_a1'
+__version__ = '2.7.47'
diff --git a/satella/random.py b/satella/random.py
new file mode 100644
index 0000000000000000000000000000000000000000..5e1eb649f914176d22592a81383c92f45fb4243b
--- /dev/null
+++ b/satella/random.py
@@ -0,0 +1,26 @@
+import random
+import typing as tp
+
+__all__ = ['shuffle_together']
+
+
+def shuffle_together(*args: tp.Sequence) -> tp.List:
+    """
+    args, being sequences of equal length, will be permuted in such a way
+    that their indices will still correspond to each other.
+
+    So given:
+
+    >>> a = [1, 2, 3]
+    >>> b = ['a', 'b', 'c']
+    >>> c = permute_together(a, b)
+
+    Might equal
+
+    >>> c == ([3, 1, 2], ['c', 'a', 'b'])
+    """
+
+    indices = list(range(len(args[0])))
+
+    random.shuffle(indices)
+    return [[arg[i] for arg, i in zip(arg, indices)] for arg in args]
diff --git a/tests/test_random.py b/tests/test_random.py
new file mode 100644
index 0000000000000000000000000000000000000000..a282dd81a87202fc8b616d5827ef5793e7aa12d5
--- /dev/null
+++ b/tests/test_random.py
@@ -0,0 +1,10 @@
+import unittest
+from satella.random import shuffle_together
+
+
+class TestRandom(unittest.TestCase):
+    def test_random(self):
+        a = [(1, 2, 3), ('a', 'b', 'c')]
+        b = zip(shuffle_together(*a))
+        self.assertEqual(set(b), {(1, 'a'), (2, 'b'), (3, 'c')})
+