diff --git a/VERSION b/VERSION
index 005119ba..8e8299dc 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-2.4.1
+2.4.2
diff --git a/cmake/util.cmake b/cmake/util.cmake
index 8becb14d..10e9ae2a 100644
--- a/cmake/util.cmake
+++ b/cmake/util.cmake
@@ -8,3 +8,24 @@ function(install_symlink target link)
     file(CREATE_LINK "${target}" "${CMAKE_BINARY_DIR}/symlink/${link}" SYMBOLIC)
     install(FILES "${CMAKE_BINARY_DIR}/symlink/${link}" DESTINATION "${parent}")
 endfunction()
+
+# Embed Resources
+function(embed_resource target file)
+    # Read Hex Data
+    file(READ "${file}" data HEX)
+    # Convert Hex Data For C Compatibility
+    string(REGEX REPLACE "([0-9a-f][0-9a-f])" "0x\\1," data "${data}")
+    # Get C Name
+    get_filename_component(name "${file}" NAME)
+    string(MAKE_C_IDENTIFIER "${name}" name)
+    # Write Data
+    file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/${name}.c" "#include <stddef.h>\nconst unsigned char ${name}[] = {${data}};\nconst size_t ${name}_len = sizeof (${name});\n")
+    # Add To Target
+    target_sources("${target}" PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/${name}.c")
+    # Mark Dependency
+    set_property(
+        DIRECTORY
+        APPEND
+        PROPERTY CMAKE_CONFIGURE_DEPENDS "${file}"
+    )
+endfunction()
diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md
index 38acb381..6f0af9c3 100644
--- a/docs/CHANGELOG.md
+++ b/docs/CHANGELOG.md
@@ -1,5 +1,9 @@
 # Changelog
 
+**2.4.2**
+* Fix Picking Up Lava
+* Fix Wayland App ID
+
 **2.4.1**
 * Allow More Characters In Usernames And Chat
 * Fix Running On ARMHF Debian Buster
diff --git a/images/start.png b/images/start.png
index a15bc003..1085febf 100644
Binary files a/images/start.png and b/images/start.png differ
diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt
index 11113b0f..7d7345f2 100644
--- a/launcher/CMakeLists.txt
+++ b/launcher/CMakeLists.txt
@@ -8,14 +8,8 @@ add_executable(launcher src/bootstrap.c src/patchelf.c src/crash-report.c)
 if(MCPI_SERVER_MODE)
     target_sources(launcher PRIVATE src/server/launcher.c)
 else()
-    add_custom_command(
-        OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/available-feature-flags.c"
-        COMMAND xxd -i available-feature-flags "${CMAKE_CURRENT_BINARY_DIR}/available-feature-flags.c"
-        DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/src/client/available-feature-flags"
-        WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/src/client"
-        VERBATIM
-    )
-    target_sources(launcher PRIVATE src/client/launcher.cpp "${CMAKE_CURRENT_BINARY_DIR}/available-feature-flags.c")
+    embed_resource(launcher src/client/available-feature-flags)
+    target_sources(launcher PRIVATE src/client/launcher.cpp)
 endif()
 target_link_libraries(launcher reborn-util)
 # RPath
@@ -44,7 +38,7 @@ else()
     file(APPEND "${CMAKE_CURRENT_BINARY_DIR}/launcher.desktop"
         "Terminal=false\n"
         "StartupNotify=false\n"
-        "StartupWMClass=${MCPI_APP_TITLE}\n"
+        "StartupWMClass=${MCPI_APP_ID}\n"
     )
 endif()
 install(
diff --git a/launcher/src/client/launcher.cpp b/launcher/src/client/launcher.cpp
index a108198c..47c68ae1 100644
--- a/launcher/src/client/launcher.cpp
+++ b/launcher/src/client/launcher.cpp
@@ -37,7 +37,7 @@ static std::string strip_feature_flag_default(std::string flag, bool *default_re
 
 // Load Available Feature Flags
 extern unsigned char available_feature_flags[];
-extern unsigned int available_feature_flags_len;
+extern size_t available_feature_flags_len;
 static void load_available_feature_flags(std::function<void(std::string)> callback) {
     // Get Path
     char *binary_directory = get_binary_directory();
@@ -112,7 +112,7 @@ static void run_zenity_and_set_env(const char *env_name, std::vector<std::string
     full_command.push_back("--title");
     full_command.push_back(DIALOG_TITLE);
     full_command.push_back("--name");
-    full_command.push_back(MCPI_APP_TITLE);
+    full_command.push_back(MCPI_APP_ID);
     full_command.insert(full_command.end(), command.begin(), command.end());
     // Convert To C Array
     const char *full_command_array[full_command.size() + 1];
diff --git a/launcher/src/crash-report.c b/launcher/src/crash-report.c
index 88bf4b2e..3bee5b61 100644
--- a/launcher/src/crash-report.c
+++ b/launcher/src/crash-report.c
@@ -22,7 +22,7 @@ static void show_report(const char *log_filename) {
     const char *command[] = {
         "zenity",
         "--title", DIALOG_TITLE,
-        "--name", MCPI_APP_TITLE,
+        "--name", MCPI_APP_ID,
         "--width", CRASH_REPORT_DIALOG_WIDTH,
         "--height", CRASH_REPORT_DIALOG_HEIGHT,
         "--text-info",
diff --git a/libreborn/include/libreborn/config.h.in b/libreborn/include/libreborn/config.h.in
index 064d6c80..6281a164 100644
--- a/libreborn/include/libreborn/config.h.in
+++ b/libreborn/include/libreborn/config.h.in
@@ -6,5 +6,6 @@
 #cmakedefine MCPI_USE_PREBUILT_ARMHF_TOOLCHAIN
 #cmakedefine MCPI_USE_GLES1_COMPATIBILITY_LAYER
 #cmakedefine MCPI_APP_TITLE "@MCPI_APP_TITLE@"
+#cmakedefine MCPI_APP_ID "@MCPI_APP_ID@"
 #cmakedefine MCPI_VERSION "@MCPI_VERSION@"
 #cmakedefine MCPI_SDK_DIR "@MCPI_SDK_DIR@"
diff --git a/media-layer/core/dependencies/glfw/src b/media-layer/core/dependencies/glfw/src
index c50d5316..c18851f5 160000
--- a/media-layer/core/dependencies/glfw/src
+++ b/media-layer/core/dependencies/glfw/src
@@ -1 +1 @@
-Subproject commit c50d53160fa9b579dda0d0a4f9a7c2512940df8e
+Subproject commit c18851f52ec9704eb06464058a600845ec1eada1
diff --git a/media-layer/core/gles/CMakeLists.txt b/media-layer/core/gles/CMakeLists.txt
index 81806879..3f17dcb9 100644
--- a/media-layer/core/gles/CMakeLists.txt
+++ b/media-layer/core/gles/CMakeLists.txt
@@ -14,6 +14,11 @@ endif()
 add_library(GLESv1_CM SHARED ${GLES_SRC})
 if(NOT MCPI_HEADLESS_MODE)
     target_link_libraries(GLESv1_CM PRIVATE glfw PUBLIC reborn-util PRIVATE dl PRIVATE m)
+    # Shaders
+    if(MCPI_USE_GLES1_COMPATIBILITY_LAYER)
+        embed_resource(GLESv1_CM src/compatibility-layer/shaders/main.vert)
+        embed_resource(GLESv1_CM src/compatibility-layer/shaders/main.frag)
+    endif()
 endif()
 
 # Common
diff --git a/media-layer/core/gles/src/compatibility-layer/draw.c b/media-layer/core/gles/src/compatibility-layer/draw.c
index fb4ca1a5..68b4b5ec 100644
--- a/media-layer/core/gles/src/compatibility-layer/draw.c
+++ b/media-layer/core/gles/src/compatibility-layer/draw.c
@@ -54,16 +54,16 @@ static void log_shader(GLuint shader, const char *name) {
         ERR("Failed To Compile %s Shader", name);
     }
 }
-static GLuint compile_shader(const char *vertex_shader_text, const char *fragment_shader_text) {
+static GLuint compile_shader(const char *vertex_shader_text, const int vertex_shader_length, const char *fragment_shader_text, const int fragment_shader_length) {
     // Vertex Shader
     const GLuint vertex_shader = real_glCreateShader()(REAL_GL_VERTEX_SHADER);
-    real_glShaderSource()(vertex_shader, 1, &vertex_shader_text, NULL);
+    real_glShaderSource()(vertex_shader, 1, &vertex_shader_text, &vertex_shader_length);
     real_glCompileShader()(vertex_shader);
     log_shader(vertex_shader, "Vertex");
 
     // Fragment Shader
     const GLuint fragment_shader = real_glCreateShader()(REAL_GL_FRAGMENT_SHADER);
-    real_glShaderSource()(fragment_shader, 1, &fragment_shader_text, NULL);
+    real_glShaderSource()(fragment_shader, 1, &fragment_shader_text, &fragment_shader_length);
     real_glCompileShader()(fragment_shader);
     log_shader(fragment_shader, "Fragment");
 
@@ -78,70 +78,14 @@ static GLuint compile_shader(const char *vertex_shader_text, const char *fragmen
 }
 
 // Shader
+extern unsigned char main_vert[];
+extern size_t main_vert_len;
+extern unsigned char main_frag[];
+extern size_t main_frag_len;
 static GLuint get_shader() {
     static GLuint program = 0;
     if (program == 0) {
-        static const char *vertex_shader_text =
-            "#version 100\n"
-            "precision mediump float;\n"
-            // Matrices
-            "uniform mat4 u_projection;\n"
-            "uniform mat4 u_model_view;\n"
-            "uniform mat4 u_texture;\n"
-            // Texture
-            "attribute vec3 a_vertex_coords;\n"
-            "attribute vec2 a_texture_coords;\n"
-            "varying vec4 v_texture_pos;\n"
-            // Color
-            "attribute vec4 a_color;\n"
-            "varying vec4 v_color;\n"
-            // Fog
-            "varying vec4 v_fog_eye_position;\n"
-            // Main
-            "void main() {\n"
-            "    v_texture_pos = u_texture * vec4(a_texture_coords.xy, 0.0, 1.0);\n"
-            "    gl_Position = u_projection * u_model_view * vec4(a_vertex_coords.xyz, 1.0);\n"
-            "    v_color = a_color;\n"
-            "    v_fog_eye_position = u_model_view * vec4(a_vertex_coords.xyz, 1.0);\n"
-            "}";
-        static const char *fragment_shader_text =
-            "#version 100\n"
-            "precision mediump float;\n"
-            // Texture
-            "uniform bool u_has_texture;"
-            "uniform sampler2D u_texture_unit;\n"
-            // Color
-            "varying vec4 v_color;\n"
-            "varying vec4 v_texture_pos;\n"
-            // Alpha Test
-            "uniform bool u_alpha_test;\n"
-            // Fog
-            "uniform bool u_fog;\n"
-            "uniform vec4 u_fog_color;\n"
-            "uniform bool u_fog_is_linear;\n"
-            "uniform float u_fog_start;\n"
-            "uniform float u_fog_end;\n"
-            "varying vec4 v_fog_eye_position;\n"
-            // Main
-            "void main(void) {\n"
-            "    gl_FragColor = v_color;\n"
-            "    if (u_has_texture) {\n"
-            "        gl_FragColor *= texture2D(u_texture_unit, v_texture_pos.xy);\n"
-            "    }\n"
-            "    if (u_alpha_test && gl_FragColor.a <= 0.1) {\n"
-            "        discard;\n"
-            "    }\n"
-            "    if (u_fog) {\n"
-            "        float fog_factor;\n"
-            "        if (u_fog_is_linear) {\n"
-            "            fog_factor = (u_fog_end - length(v_fog_eye_position)) / (u_fog_end - u_fog_start);\n"
-            "        } else {\n"
-            "            fog_factor = exp(-u_fog_start * length(v_fog_eye_position));\n"
-            "        }\n"
-            "        gl_FragColor = mix(gl_FragColor, u_fog_color, 1.0 - clamp(fog_factor, 0.0, 1.0));\n"
-            "    }\n"
-            "}";
-        program = compile_shader(vertex_shader_text, fragment_shader_text);
+        program = compile_shader((const char *) main_vert, main_vert_len, (const char *) main_frag, main_frag_len);
     }
     return program;
 }
diff --git a/media-layer/core/gles/src/compatibility-layer/shaders/main.frag b/media-layer/core/gles/src/compatibility-layer/shaders/main.frag
new file mode 100644
index 00000000..66fbe5bd
--- /dev/null
+++ b/media-layer/core/gles/src/compatibility-layer/shaders/main.frag
@@ -0,0 +1,39 @@
+#version 100
+precision mediump float;
+// Texture
+uniform bool u_has_texture;
+uniform sampler2D u_texture_unit;
+// Color
+varying vec4 v_color;
+varying vec4 v_texture_pos;
+// Alpha Test
+uniform bool u_alpha_test;
+// Fog
+uniform bool u_fog;
+uniform vec4 u_fog_color;
+uniform bool u_fog_is_linear;
+uniform float u_fog_start;
+uniform float u_fog_end;
+varying vec4 v_fog_eye_position;
+// Main
+void main(void) {
+    gl_FragColor = v_color;
+    // Texture
+    if (u_has_texture) {
+        gl_FragColor *= texture2D(u_texture_unit, v_texture_pos.xy);
+    }
+    // Alpha Test
+    if (u_alpha_test && gl_FragColor.a <= 0.1) {
+        discard;
+    }
+    // Fog
+    if (u_fog) {
+        float fog_factor;
+        if (u_fog_is_linear) {
+            fog_factor = (u_fog_end - length(v_fog_eye_position)) / (u_fog_end - u_fog_start);
+        } else {
+            fog_factor = exp(-u_fog_start * length(v_fog_eye_position));
+        }
+        gl_FragColor = mix(gl_FragColor, u_fog_color, 1.0 - clamp(fog_factor, 0.0, 1.0));
+    }
+}
diff --git a/media-layer/core/gles/src/compatibility-layer/shaders/main.vert b/media-layer/core/gles/src/compatibility-layer/shaders/main.vert
new file mode 100644
index 00000000..24e34ded
--- /dev/null
+++ b/media-layer/core/gles/src/compatibility-layer/shaders/main.vert
@@ -0,0 +1,22 @@
+#version 100
+precision mediump float;
+// Matrices
+uniform mat4 u_projection;
+uniform mat4 u_model_view;
+uniform mat4 u_texture;
+// Texture
+attribute vec3 a_vertex_coords;
+attribute vec2 a_texture_coords;
+varying vec4 v_texture_pos;
+// Color
+attribute vec4 a_color;
+varying vec4 v_color;
+// Fog
+varying vec4 v_fog_eye_position;
+// Main
+void main(void) {
+    v_texture_pos = u_texture * vec4(a_texture_coords.xy, 0.0, 1.0);
+    gl_Position = u_projection * u_model_view * vec4(a_vertex_coords.xyz, 1.0);
+    v_color = a_color;
+    v_fog_eye_position = u_model_view * vec4(a_vertex_coords.xyz, 1.0);
+}
diff --git a/media-layer/core/src/media.c b/media-layer/core/src/media.c
index 05633151..7f0cf10a 100644
--- a/media-layer/core/src/media.c
+++ b/media-layer/core/src/media.c
@@ -308,6 +308,9 @@ void SDL_WM_SetCaption(const char *title, __attribute__((unused)) const char *ic
     // Extra Settings
     glfwWindowHint(GLFW_AUTO_ICONIFY, GLFW_FALSE);
     glfwWindowHint(GLFW_ALPHA_BITS, 0); // Fix Transparent Window On Wayland
+    // App ID
+    glfwWindowHintString(GLFW_X11_CLASS_NAME, MCPI_APP_ID);
+    glfwWindowHintString(GLFW_WAYLAND_APP_ID, MCPI_APP_ID);
 
     // Create Window
     glfw_window = glfwCreateWindow(DEFAULT_WIDTH, DEFAULT_HEIGHT, title, NULL, NULL);
diff --git a/mods/src/bucket/bucket.cpp b/mods/src/bucket/bucket.cpp
index 82c3036c..2005b7c1 100644
--- a/mods/src/bucket/bucket.cpp
+++ b/mods/src/bucket/bucket.cpp
@@ -40,7 +40,7 @@ static int32_t BucketItem_useOn(__attribute__((unused)) unsigned char *item, Ite
         if (tile == *(int32_t *) (*Tile_calmWater + Tile_id_property_offset)) {
             new_auxiliary = *(int32_t *) (*Tile_water + Tile_id_property_offset);
         } else if (tile == *(int32_t *) (*Tile_calmLava + Tile_id_property_offset)) {
-            new_auxiliary = *(int32_t *) (*Tile_water + Tile_id_property_offset);
+            new_auxiliary = *(int32_t *) (*Tile_lava + Tile_id_property_offset);
         }
         if (new_auxiliary != 0) {
             // Valid
@@ -108,6 +108,9 @@ static int32_t BucketItem_useOn(__attribute__((unused)) unsigned char *item, Ite
             Material_isSolid_t Material_isSolid = *(Material_isSolid_t *) (material_vtable + Material_isSolid_vtable_offset);
             valid = !(*Material_isSolid)(material);
         }
+        if (item_instance->auxiliary != *(int32_t *) (*Tile_water + Tile_id_property_offset) && item_instance->auxiliary != *(int32_t *) (*Tile_lava + Tile_id_property_offset)) {
+            valid = false;
+        }
         if (valid) {
             (*Level_setTileAndData)(level, x, y, z, item_instance->auxiliary, 0);
             item_instance->auxiliary = 0;
diff --git a/mods/src/chat/ui.c b/mods/src/chat/ui.c
index 3752a2e4..b0a6650f 100644
--- a/mods/src/chat/ui.c
+++ b/mods/src/chat/ui.c
@@ -29,7 +29,7 @@ static void *chat_thread(__attribute__((unused)) void *nop) {
     const char *command[] = {
         "zenity",
         "--title", DIALOG_TITLE,
-        "--name", MCPI_APP_TITLE,
+        "--name", MCPI_APP_ID,
         "--entry",
         "--text", "Enter Chat Message:",
         NULL
diff --git a/mods/src/game-mode/ui.cpp b/mods/src/game-mode/ui.cpp
index 3d16e12f..ffba4cc6 100644
--- a/mods/src/game-mode/ui.cpp
+++ b/mods/src/game-mode/ui.cpp
@@ -88,7 +88,7 @@ static void *create_world_thread(__attribute__((unused)) void *nop) {
             const char *command[] = {
                 "zenity",
                 "--title", DIALOG_TITLE,
-                "--name", MCPI_APP_TITLE,
+                "--name", MCPI_APP_ID,
                 "--entry",
                 "--text", "Enter World Name:",
                 "--entry-text", DEFAULT_WORLD_NAME,
@@ -115,7 +115,7 @@ static void *create_world_thread(__attribute__((unused)) void *nop) {
             const char *command[] = {
                 "zenity",
                 "--title", DIALOG_TITLE,
-                "--name", MCPI_APP_TITLE,
+                "--name", MCPI_APP_ID,
                 "--list",
                 "--radiolist",
                 "--width", GAME_MODE_DIALOG_SIZE,
@@ -148,7 +148,7 @@ static void *create_world_thread(__attribute__((unused)) void *nop) {
             const char *command[] = {
                 "zenity",
                 "--title", DIALOG_TITLE,
-                "--name", MCPI_APP_TITLE,
+                "--name", MCPI_APP_ID,
                 "--entry",
                 "--only-numerical",
                 "--text", "Enter Seed (Leave Blank For Random):",
diff --git a/scripts/build.sh b/scripts/build.sh
index f0300220..f40fde61 100755
--- a/scripts/build.sh
+++ b/scripts/build.sh
@@ -11,20 +11,22 @@ build() {
     cd "build/${MODE}-${ARCH}"
 
     # Create Prefix
-    local prefix="$(cd ../../; pwd)/out/${MODE}-${ARCH}"
-    rm -rf "${prefix}"
-    mkdir -p "${prefix}"
+    if [ -z "${DESTDIR+x}" ]; then
+        export DESTDIR="$(cd ../../; pwd)/out/${MODE}-${ARCH}"
+        rm -rf "${DESTDIR}"
+        mkdir -p "${DESTDIR}"
+    fi
 
     # Build ARM Components
     cd arm
     cmake --build .
-    DESTDIR="${prefix}" cmake --install .
+    cmake --install .
     cd ../
 
     # Build Native Components
     cd native
     cmake --build .
-    DESTDIR="${prefix}" cmake --install .
+    cmake --install .
     cd ../
 
     # Exit
diff --git a/scripts/install-dependencies.sh b/scripts/install-dependencies.sh
index 9ac1b1f9..6978ecf3 100755
--- a/scripts/install-dependencies.sh
+++ b/scripts/install-dependencies.sh
@@ -30,8 +30,7 @@ run() {
 
     # Host Dependencies Needed For Compile
     queue_pkg \
-        libwayland-bin \
-        xxd
+        libwayland-bin
 
     # Host Dependencies Needed For Running
     queue_pkg \