diff --git a/CMakeLists.txt b/CMakeLists.txt
index 3d9a8456..b2f9e63b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,6 +1,6 @@
 cmake_minimum_required(VERSION 3.14)
 
-project(libscratchcpp VERSION 0.9.0 LANGUAGES C CXX)
+project(libscratchcpp VERSION 0.9.1 LANGUAGES C CXX)
 
 set(CMAKE_INCLUDE_CURRENT_DIR ON)
 set(CMAKE_CXX_STANDARD 17)
diff --git a/src/audio/internal/audioplayer.cpp b/src/audio/internal/audioplayer.cpp
index 9cab04ba..e7cc03a5 100644
--- a/src/audio/internal/audioplayer.cpp
+++ b/src/audio/internal/audioplayer.cpp
@@ -18,11 +18,15 @@ AudioPlayer::~AudioPlayer()
 {
     if (m_loaded) {
         ma_sound_uninit(m_sound);
-        ma_decoder_uninit(m_decoder);
+
+        if (!m_copy)
+            ma_decoder_uninit(m_decoder);
     }
 
-    delete m_decoder;
     delete m_sound;
+
+    if (!m_copy)
+        delete m_decoder;
 }
 
 bool AudioPlayer::load(unsigned int size, const void *data, unsigned long sampleRate)
@@ -74,6 +78,7 @@ bool AudioPlayer::loadCopy(IAudioPlayer *player)
     }
 
     m_loaded = true;
+    m_copy = true;
     ma_sound_set_volume(m_sound, m_volume);
     return true;
 }
diff --git a/src/audio/internal/audioplayer.h b/src/audio/internal/audioplayer.h
index 854691ae..8dd77b54 100644
--- a/src/audio/internal/audioplayer.h
+++ b/src/audio/internal/audioplayer.h
@@ -33,6 +33,7 @@ class AudioPlayer : public IAudioPlayer
         ma_decoder *m_decoder = nullptr;
         ma_sound *m_sound;
         bool m_loaded = false;
+        bool m_copy = false;
         bool m_started = false;
         float m_volume = 1;
 };
diff --git a/src/engine/internal/engine.cpp b/src/engine/internal/engine.cpp
index d2923948..220d5e22 100644
--- a/src/engine/internal/engine.cpp
+++ b/src/engine/internal/engine.cpp
@@ -778,7 +778,7 @@ double Engine::mouseX() const
 
 void Engine::setMouseX(double x)
 {
-    m_mouseX = x;
+    m_mouseX = std::round(x);
 }
 
 double Engine::mouseY() const
@@ -788,7 +788,7 @@ double Engine::mouseY() const
 
 void Engine::setMouseY(double y)
 {
-    m_mouseY = y;
+    m_mouseY = std::round(y);
 }
 
 bool Engine::mousePressed() const
diff --git a/src/engine/virtualmachine_p.cpp b/src/engine/virtualmachine_p.cpp
index b9a99521..50397788 100644
--- a/src/engine/virtualmachine_p.cpp
+++ b/src/engine/virtualmachine_p.cpp
@@ -764,8 +764,14 @@ unsigned int *VirtualMachinePrivate::run(unsigned int *pos, bool reset)
     DISPATCH();
 
     OP(STR_CONTAINS) :
-        REPLACE_RET_VALUE(READ_REG(0, 2)->toUtf16().find(READ_REG(1, 2)->toUtf16()) != std::u16string::npos, 2);
-    FREE_REGS(1);
+    {
+        std::u16string string1 = READ_REG(0, 2)->toUtf16();
+        std::u16string string2 = READ_REG(1, 2)->toUtf16();
+        std::transform(string1.begin(), string1.end(), string1.begin(), ::tolower);
+        std::transform(string2.begin(), string2.end(), string2.begin(), ::tolower);
+        REPLACE_RET_VALUE(string1.find(string2) != std::u16string::npos, 2);
+        FREE_REGS(1);
+    }
     DISPATCH();
 
     OP(EXEC) :
diff --git a/test/engine/engine_test.cpp b/test/engine/engine_test.cpp
index 5b8b6f96..198678bc 100644
--- a/test/engine/engine_test.cpp
+++ b/test/engine/engine_test.cpp
@@ -827,7 +827,10 @@ TEST(EngineTest, MouseX)
     ASSERT_EQ(engine.mouseX(), 0);
 
     engine.setMouseX(-128.038);
-    ASSERT_EQ(engine.mouseX(), -128.038);
+    ASSERT_EQ(engine.mouseX(), -128);
+
+    engine.setMouseX(35.7);
+    ASSERT_EQ(engine.mouseX(), 36);
 }
 
 TEST(EngineTest, MouseY)
@@ -835,8 +838,11 @@ TEST(EngineTest, MouseY)
     Engine engine;
     ASSERT_EQ(engine.mouseY(), 0);
 
-    engine.setMouseY(179.9258);
-    ASSERT_EQ(engine.mouseY(), 179.9258);
+    engine.setMouseY(179.1258);
+    ASSERT_EQ(engine.mouseY(), 179);
+
+    engine.setMouseY(-12.98);
+    ASSERT_EQ(engine.mouseY(), -13);
 }
 
 TEST(EngineTest, MousePressed)
diff --git a/test/virtual_machine/virtual_machine_test.cpp b/test/virtual_machine/virtual_machine_test.cpp
index 30ea6dbb..3a91c12c 100644
--- a/test/virtual_machine/virtual_machine_test.cpp
+++ b/test/virtual_machine/virtual_machine_test.cpp
@@ -1359,25 +1359,28 @@ TEST(VirtualMachineTest, OP_STR_LENGTH)
 TEST(VirtualMachineTest, OP_STR_CONTAINS)
 {
     static unsigned int bytecode[] = {
-        OP_START,        OP_CONST, 0, OP_CONST, 1, OP_STR_CONTAINS, OP_CONST, 0, OP_CONST, 2, OP_STR_CONTAINS, OP_CONST, 0, OP_CONST, 3,
-        OP_STR_CONTAINS, OP_CONST, 0, OP_CONST, 4, OP_STR_CONTAINS, OP_CONST, 0, OP_CONST, 5, OP_STR_CONTAINS, OP_CONST, 0, OP_CONST, 6,
-        OP_STR_CONTAINS, OP_CONST, 0, OP_CONST, 7, OP_STR_CONTAINS, OP_CONST, 4, OP_CONST, 4, OP_STR_CONTAINS, OP_HALT
+        OP_START,        OP_CONST, 0, OP_CONST, 1, OP_STR_CONTAINS, OP_CONST, 0, OP_CONST, 2, OP_STR_CONTAINS, OP_CONST, 0, OP_CONST, 3,  OP_STR_CONTAINS, OP_CONST, 0, OP_CONST, 4,
+        OP_STR_CONTAINS, OP_CONST, 0, OP_CONST, 5, OP_STR_CONTAINS, OP_CONST, 0, OP_CONST, 6, OP_STR_CONTAINS, OP_CONST, 0, OP_CONST, 7,  OP_STR_CONTAINS, OP_CONST, 4, OP_CONST, 4,
+        OP_STR_CONTAINS, OP_CONST, 0, OP_CONST, 8, OP_STR_CONTAINS, OP_CONST, 0, OP_CONST, 9, OP_STR_CONTAINS, OP_CONST, 0, OP_CONST, 10, OP_STR_CONTAINS, OP_HALT
     };
-    static Value constValues[] = { "abcd efg  hijý abcĎĐ", "ĎĐ", "a", "test", "", " ", "  ", "k" };
+    static Value constValues[] = { "abcd efg  hijý abcĎĐ", "ĎĐ", "a", "test", "", " ", "  ", "k", "ab", "aB", "AB" };
 
     VirtualMachine vm;
     vm.setBytecode(bytecode);
     vm.setConstValues(constValues);
     vm.run();
-    ASSERT_EQ(vm.registerCount(), 8);
-    ASSERT_EQ(vm.getInput(0, 8)->toBool(), true);
-    ASSERT_EQ(vm.getInput(1, 8)->toBool(), true);
-    ASSERT_EQ(vm.getInput(2, 8)->toBool(), false);
-    ASSERT_EQ(vm.getInput(3, 8)->toBool(), true);
-    ASSERT_EQ(vm.getInput(4, 8)->toBool(), true);
-    ASSERT_EQ(vm.getInput(5, 8)->toBool(), true);
-    ASSERT_EQ(vm.getInput(6, 8)->toBool(), false);
-    ASSERT_EQ(vm.getInput(7, 8)->toBool(), true);
+    ASSERT_EQ(vm.registerCount(), 11);
+    ASSERT_EQ(vm.getInput(0, 11)->toBool(), true);
+    ASSERT_EQ(vm.getInput(1, 11)->toBool(), true);
+    ASSERT_EQ(vm.getInput(2, 11)->toBool(), false);
+    ASSERT_EQ(vm.getInput(3, 11)->toBool(), true);
+    ASSERT_EQ(vm.getInput(4, 11)->toBool(), true);
+    ASSERT_EQ(vm.getInput(5, 11)->toBool(), true);
+    ASSERT_EQ(vm.getInput(6, 11)->toBool(), false);
+    ASSERT_EQ(vm.getInput(7, 11)->toBool(), true);
+    ASSERT_EQ(vm.getInput(8, 11)->toBool(), true);
+    ASSERT_EQ(vm.getInput(9, 11)->toBool(), true);
+    ASSERT_EQ(vm.getInput(10, 11)->toBool(), true);
 }
 
 unsigned int testFunction1(VirtualMachine *vm)
