diff --git a/include/olm/list.hh b/include/olm/list.hh
index e4bf95134a1c10a65c058382e75c63fe5a9f3088..6906c8785bbcf256baa59f33a7631de6d19b7fe2 100644
--- a/include/olm/list.hh
+++ b/include/olm/list.hh
@@ -69,10 +69,10 @@ public:
         } else if (pos == _end) {
             --pos;
         }
-        T * tmp = pos;
-        while (tmp != _end - 1) {
-            *(tmp + 1) = *tmp;
-            ++tmp;
+        T * tmp = _end - 1;
+        while (tmp != pos) {
+            *tmp = *(tmp - 1);
+            --tmp;
         }
         return pos;
     }
diff --git a/tests/test_list.cpp b/tests/test_list.cpp
index c6d9a9a3f3c448fa21c70a48c9f139faa1cd3c14..c054af6df1cda2036c9be59b27ff61f0483b77ed 100644
--- a/tests/test_list.cpp
+++ b/tests/test_list.cpp
@@ -44,6 +44,28 @@ assert_equals(4, test_list[3]);
 
 } /** List insert test **/
 
+{ /** List insert beginning test **/
+
+TestCase test_case("List insert beginning");
+
+olm::List<int, 4> test_list;
+
+assert_equals(std::size_t(0), test_list.size());
+
+for (int i = 0; i < 4; ++i) {
+    test_list.insert(test_list.begin(), i);
+}
+
+assert_equals(std::size_t(4), test_list.size());
+
+int i = 4;
+for (auto item : test_list) {
+    assert_equals(--i, item);
+}
+
+} /** List insert test **/
+
+
 { /** List erase test **/
 TestCase test_case("List erase");