diff --git a/pom.xml b/pom.xml
index de49e349..2ae886df 100644
--- a/pom.xml
+++ b/pom.xml
@@ -33,6 +33,7 @@
qqq-backend-module-api
qqq-backend-module-filesystem
qqq-backend-module-rdbms
+ qqq-language-support-javascript
qqq-middleware-picocli
qqq-middleware-javalin
qqq-middleware-lambda
diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/scripts/ExecuteCodeAction.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/scripts/ExecuteCodeAction.java
new file mode 100644
index 00000000..2715060e
--- /dev/null
+++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/scripts/ExecuteCodeAction.java
@@ -0,0 +1,94 @@
+/*
+ * QQQ - Low-code Application Framework for Engineers.
+ * Copyright (C) 2021-2022. Kingsrook, LLC
+ * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States
+ * contact@kingsrook.com
+ * https://github.com/Kingsrook/
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+package com.kingsrook.qqq.backend.core.actions.scripts;
+
+
+import java.io.Serializable;
+import com.kingsrook.qqq.backend.core.actions.scripts.logging.Log4jCodeExecutionLogger;
+import com.kingsrook.qqq.backend.core.actions.scripts.logging.QCodeExecutionLoggerInterface;
+import com.kingsrook.qqq.backend.core.exceptions.QCodeException;
+import com.kingsrook.qqq.backend.core.exceptions.QException;
+import com.kingsrook.qqq.backend.core.model.actions.scripts.ExecuteCodeInput;
+import com.kingsrook.qqq.backend.core.model.actions.scripts.ExecuteCodeOutput;
+import com.kingsrook.qqq.backend.core.model.metadata.code.QCodeReference;
+
+
+/*******************************************************************************
+ **
+ *******************************************************************************/
+public class ExecuteCodeAction
+{
+
+ /*******************************************************************************
+ **
+ *******************************************************************************/
+ @SuppressWarnings("checkstyle:indentation")
+ public void run(ExecuteCodeInput input, ExecuteCodeOutput output) throws QException, QCodeException
+ {
+ QCodeReference codeReference = input.getCodeReference();
+
+ QCodeExecutionLoggerInterface executionLogger = input.getExecutionLogger();
+ if(executionLogger == null)
+ {
+ executionLogger = getDefaultExecutionLogger();
+ }
+ executionLogger.acceptExecutionStart(input);
+
+ try
+ {
+ String languageExecutor = switch(codeReference.getCodeType())
+ {
+ case JAVA -> "com.kingsrook.qqq.backend.core.actions.scripts.QJavaExecutor";
+ case JAVA_SCRIPT -> "com.kingsrook.qqq.languages.javascript.QJavaScriptExecutor";
+ };
+
+ @SuppressWarnings("unchecked")
+ Class extends QCodeExecutor> executorClass = (Class extends QCodeExecutor>) Class.forName(languageExecutor);
+ QCodeExecutor qCodeExecutor = executorClass.getConstructor().newInstance();
+
+ Serializable codeOutput = qCodeExecutor.execute(codeReference, input.getContext(), executionLogger);
+ output.setOutput(codeOutput);
+ executionLogger.acceptExecutionEnd(codeOutput);
+ }
+ catch(QCodeException qCodeException)
+ {
+ executionLogger.acceptException(qCodeException);
+ throw (qCodeException);
+ }
+ catch(Exception e)
+ {
+ executionLogger.acceptException(e);
+ throw (new QException("Error executing code [" + codeReference + "]", e));
+ }
+ }
+
+
+
+ /*******************************************************************************
+ **
+ *******************************************************************************/
+ private QCodeExecutionLoggerInterface getDefaultExecutionLogger()
+ {
+ return (new Log4jCodeExecutionLogger());
+ }
+
+}
diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/scripts/QCodeExecutor.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/scripts/QCodeExecutor.java
new file mode 100644
index 00000000..9ea44224
--- /dev/null
+++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/scripts/QCodeExecutor.java
@@ -0,0 +1,43 @@
+/*
+ * QQQ - Low-code Application Framework for Engineers.
+ * Copyright (C) 2021-2022. Kingsrook, LLC
+ * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States
+ * contact@kingsrook.com
+ * https://github.com/Kingsrook/
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+package com.kingsrook.qqq.backend.core.actions.scripts;
+
+
+import java.io.Serializable;
+import java.util.Map;
+import com.kingsrook.qqq.backend.core.actions.scripts.logging.QCodeExecutionLoggerInterface;
+import com.kingsrook.qqq.backend.core.exceptions.QCodeException;
+import com.kingsrook.qqq.backend.core.model.metadata.code.QCodeReference;
+
+
+/*******************************************************************************
+ **
+ *******************************************************************************/
+public interface QCodeExecutor
+{
+
+ /*******************************************************************************
+ **
+ *******************************************************************************/
+ Serializable execute(QCodeReference codeReference, Map context, QCodeExecutionLoggerInterface executionLogger) throws QCodeException;
+
+}
diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/scripts/QJavaExecutor.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/scripts/QJavaExecutor.java
new file mode 100644
index 00000000..82d303c6
--- /dev/null
+++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/scripts/QJavaExecutor.java
@@ -0,0 +1,68 @@
+/*
+ * QQQ - Low-code Application Framework for Engineers.
+ * Copyright (C) 2021-2022. Kingsrook, LLC
+ * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States
+ * contact@kingsrook.com
+ * https://github.com/Kingsrook/
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+package com.kingsrook.qqq.backend.core.actions.scripts;
+
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.function.Function;
+import com.kingsrook.qqq.backend.core.actions.customizers.QCodeLoader;
+import com.kingsrook.qqq.backend.core.actions.scripts.logging.QCodeExecutionLoggerInterface;
+import com.kingsrook.qqq.backend.core.exceptions.QCodeException;
+import com.kingsrook.qqq.backend.core.model.metadata.code.QCodeReference;
+
+
+/*******************************************************************************
+ **
+ *******************************************************************************/
+public class QJavaExecutor implements QCodeExecutor
+{
+
+ /*******************************************************************************
+ **
+ *******************************************************************************/
+ @Override
+ public Serializable execute(QCodeReference codeReference, Map input, QCodeExecutionLoggerInterface executionLogger) throws QCodeException
+ {
+ Map context = new HashMap<>(input);
+ if(!context.containsKey("logger"))
+ {
+ context.put("logger", executionLogger);
+ }
+
+ Serializable output;
+ try
+ {
+ Function