diff --git a/binding-mri/binding-mri.cpp b/binding-mri/binding-mri.cpp
index 0160757..34482df 100644
--- a/binding-mri/binding-mri.cpp
+++ b/binding-mri/binding-mri.cpp
@@ -171,17 +171,41 @@ RB_METHOD(mriDataDirectory)
 	return pathStr;
 }
 
-static void runCustomScript(const char *filename)
+static VALUE newStringUTF8(const char *string, long length)
 {
-	std::string scriptData("#encoding:utf-8\n");
+	return rb_enc_str_new(string, length, rb_utf8_encoding());
+}
 
-	if (!readFile(filename, scriptData))
+struct evalArg
+{
+	VALUE string;
+	VALUE filename;
+};
+
+static VALUE evalHelper(evalArg *arg)
+{
+	VALUE argv[] = { arg->string, Qnil, arg->filename };
+	return rb_funcall2(Qnil, rb_intern("eval"), ARRAY_SIZE(argv), argv);
+}
+
+static VALUE evalString(VALUE string, VALUE filename, int *state)
+{
+	evalArg arg = { string, filename };
+	return rb_protect((VALUE (*)(VALUE))evalHelper, (VALUE)&arg, state);
+}
+
+static void runCustomScript(const std::string &filename)
+{
+	std::string scriptData;
+
+	if (!readFile(filename.c_str(), scriptData))
 	{
 		showMsg(std::string("Unable to open '") + filename + "'");
 		return;
 	}
 
-	rb_eval_string_protect(scriptData.c_str(), 0);
+	evalString(newStringUTF8(scriptData.c_str(), scriptData.size()),
+	           newStringUTF8(filename.c_str(), filename.size()), NULL);
 }
 
 VALUE kernelLoadDataInt(const char *filename);
@@ -210,6 +234,8 @@ static void runRMXPScripts()
 		return;
 	}
 
+	rb_gv_set("$RGSS_SCRIPTS", scriptArray);
+
 	long scriptCount = RARRAY_LEN(scriptArray);
 
 	std::string decodeBuffer;
@@ -259,22 +285,31 @@ static void runRMXPScripts()
 			break;
 		}
 
-		/* Store encoding header + the decoded script
-		 * in 'sc.decData' */
-		std::string decData = "#encoding:utf-8\n";
-		size_t hdSize = decData.size();
-		decData.resize(hdSize + bufferLen);
-		memcpy(&decData[hdSize], decodeBuffer.c_str(), bufferLen);
+		rb_ary_store(script, 3, rb_str_new_cstr(decodeBuffer.c_str()));
+	}
 
-		ruby_script(RSTRING_PTR(scriptName));
+	for (long i = 0; i < scriptCount; ++i)
+	{
+		VALUE script = rb_ary_entry(scriptArray, i);
+		VALUE scriptDecoded = rb_ary_entry(script, 3);
+		VALUE string = newStringUTF8(RSTRING_PTR(scriptDecoded),
+		                             RSTRING_LEN(scriptDecoded));
 
-		rb_gc_start();
+		VALUE fname;
+		if (shState->rtData().config.useScriptNames)
+		{
+			fname = rb_ary_entry(script, 1);
+		}
+		else
+		{
+			char buf[32];
+			int len = snprintf(buf, sizeof(buf), "Section%03ld", i);
+			fname = newStringUTF8(buf, len);
+		}
 
-		/* Execute code */
-		rb_eval_string_protect(decData.c_str(), 0);
-
-		VALUE exc = rb_errinfo();
-		if (!NIL_P(exc))
+		int state;
+		evalString(string, fname, &state);
+		if (state)
 			break;
 	}
 }
@@ -291,7 +326,7 @@ static void mriBindingExecute()
 
 	std::string &customScript = shState->rtData().config.customScript;
 	if (!customScript.empty())
-		runCustomScript(customScript.c_str());
+		runCustomScript(customScript);
 	else
 		runRMXPScripts();
 
diff --git a/mkxp.conf.sample b/mkxp.conf.sample
index 11fb146..cfe7268 100644
--- a/mkxp.conf.sample
+++ b/mkxp.conf.sample
@@ -113,3 +113,9 @@
 # RTP=/path/to/rtp1
 # RTP=/path/to/rtp2.zip
 # RTP=/path/to/game.rgssad
+
+
+# Use the script's name as filename in warnings and error messages
+# (default: disabled)
+#
+# useScriptNames=false
diff --git a/src/config.cpp b/src/config.cpp
index 7e3091f..fcde0c0 100644
--- a/src/config.cpp
+++ b/src/config.cpp
@@ -49,7 +49,8 @@ Config::Config()
       gameFolder("."),
       anyAltToggleFS(false),
       allowSymlinks(false),
-      pathCache(true)
+      pathCache(true),
+      useScriptNames(false)
 {}
 
 void Config::read(int argc, char *argv[])
@@ -72,7 +73,8 @@ void Config::read(int argc, char *argv[])
 	PO_DESC(allowSymlinks, bool) \
 	PO_DESC(iconPath, std::string) \
 	PO_DESC(customScript, std::string) \
-	PO_DESC(pathCache, bool)
+	PO_DESC(pathCache, bool) \
+	PO_DESC(useScriptNames, bool)
 
 // Not gonna take your shit boost
 #define GUARD_ALL( exp ) try { exp } catch(...) {}
diff --git a/src/config.h b/src/config.h
index 411ce51..d91e13a 100644
--- a/src/config.h
+++ b/src/config.h
@@ -51,6 +51,8 @@ struct Config
 
 	std::string iconPath;
 
+	bool useScriptNames;
+
 	std::string customScript;
 	std::vector<std::string> rtps;