diff --git a/settings.gradle b/settings.gradle
index 04043f00..96cab8a8 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1,3 +1,11 @@
+pluginManagement {
+ plugins {
+ id 'org.jetbrains.kotlin.jvm' version '1.9.22'
+ }
+}
+plugins {
+ id 'org.gradle.toolchains.foojay-resolver-convention' version '0.5.0'
+}
rootProject.name = 'unit-api'
include 'unit-api-core'
diff --git a/unit-api-core/build.gradle b/unit-api-core/build.gradle
index f5bdfc5b..94cc1208 100644
--- a/unit-api-core/build.gradle
+++ b/unit-api-core/build.gradle
@@ -1,3 +1,13 @@
+plugins {
+ id 'org.jetbrains.kotlin.jvm'
+}
dependencies {
implementation("org.reflections:reflections:0.10.2")
+ implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
+}
+repositories {
+ mavenCentral()
+}
+kotlin {
+ jvmToolchain(17)
}
\ No newline at end of file
diff --git a/unit-api-core/src/main/java/com/raynigon/unit/api/core/quantities/Luminance.java b/unit-api-core/src/main/java/com/raynigon/unit/api/core/quantities/Luminance.java
new file mode 100644
index 00000000..2a569edb
--- /dev/null
+++ b/unit-api-core/src/main/java/com/raynigon/unit/api/core/quantities/Luminance.java
@@ -0,0 +1,19 @@
+package com.raynigon.unit.api.core.quantities;
+
+import javax.measure.Quantity;
+import javax.measure.quantity.Area;
+import javax.measure.quantity.LuminousIntensity;
+
+/**
+ * Luminous intensity per unit area of light traveling in a given direction.
+ * The system unit for this quantity is "cd/m²" (candela per square meter).
+ *
+ * @author Jean-Marie Dautelle
+ * @author Werner Keil
+ * @version 1.3
+ *
+ * @see LuminousIntensity
+ * @see Area
+ */
+public interface Luminance extends Quantity {
+}
\ No newline at end of file
diff --git a/unit-api-core/src/main/java/com/raynigon/unit/api/core/units/si/angle/Radian.java b/unit-api-core/src/main/java/com/raynigon/unit/api/core/units/si/angle/Radian.java
new file mode 100644
index 00000000..04c0b787
--- /dev/null
+++ b/unit-api-core/src/main/java/com/raynigon/unit/api/core/units/si/angle/Radian.java
@@ -0,0 +1,21 @@
+package com.raynigon.unit.api.core.units.si.angle;
+
+import com.raynigon.unit.api.core.units.general.BaseUnit;
+import com.raynigon.unit.api.core.units.general.UnitDimension;
+import com.raynigon.unit.api.core.units.si.SISystem;
+
+import javax.measure.quantity.Angle;
+import javax.measure.quantity.SolidAngle;
+
+public class Radian extends BaseUnit {
+
+ public Radian() {
+ super(
+ SISystem.ID,
+ "rad",
+ "Radian",
+ Angle.class,
+ UnitDimension.NONE
+ );
+ }
+}
\ No newline at end of file
diff --git a/unit-api-core/src/main/java/com/raynigon/unit/api/core/units/si/angle/Steradian.java b/unit-api-core/src/main/java/com/raynigon/unit/api/core/units/si/angle/Steradian.java
new file mode 100644
index 00000000..6c1943fe
--- /dev/null
+++ b/unit-api-core/src/main/java/com/raynigon/unit/api/core/units/si/angle/Steradian.java
@@ -0,0 +1,20 @@
+package com.raynigon.unit.api.core.units.si.angle;
+
+import com.raynigon.unit.api.core.units.general.BaseUnit;
+import com.raynigon.unit.api.core.units.general.UnitDimension;
+import com.raynigon.unit.api.core.units.si.SISystem;
+
+import javax.measure.quantity.SolidAngle;
+
+public class Steradian extends BaseUnit {
+
+ public Steradian() {
+ super(
+ SISystem.ID,
+ "sr",
+ "Steradian",
+ SolidAngle.class,
+ UnitDimension.NONE
+ );
+ }
+}
\ No newline at end of file
diff --git a/unit-api-core/src/main/java/com/raynigon/unit/api/core/units/si/luminance/Candela.java b/unit-api-core/src/main/java/com/raynigon/unit/api/core/units/si/luminance/Candela.java
new file mode 100644
index 00000000..bc2ae7b9
--- /dev/null
+++ b/unit-api-core/src/main/java/com/raynigon/unit/api/core/units/si/luminance/Candela.java
@@ -0,0 +1,23 @@
+package com.raynigon.unit.api.core.units.si.luminance;
+
+import com.raynigon.unit.api.core.units.general.AlternateUnit;
+import com.raynigon.unit.api.core.units.general.BaseUnit;
+import com.raynigon.unit.api.core.units.general.UnitDimension;
+import com.raynigon.unit.api.core.units.si.SISystem;
+import com.raynigon.unit.api.core.units.si.area.SquareMetre;
+
+import javax.measure.quantity.Illuminance;
+import javax.measure.quantity.LuminousIntensity;
+
+public class Candela extends BaseUnit {
+
+ public Candela() {
+ super(
+ SISystem.ID,
+ "cd",
+ "Candela",
+ LuminousIntensity.class,
+ UnitDimension.LUMINOUS_INTENSITY
+ );
+ }
+}
diff --git a/unit-api-core/src/main/java/com/raynigon/unit/api/core/units/si/luminance/CandelaPerSquareMetre.java b/unit-api-core/src/main/java/com/raynigon/unit/api/core/units/si/luminance/CandelaPerSquareMetre.java
new file mode 100644
index 00000000..d18f0d69
--- /dev/null
+++ b/unit-api-core/src/main/java/com/raynigon/unit/api/core/units/si/luminance/CandelaPerSquareMetre.java
@@ -0,0 +1,24 @@
+package com.raynigon.unit.api.core.units.si.luminance;
+
+import com.raynigon.unit.api.core.quantities.Luminance;
+import com.raynigon.unit.api.core.units.general.AlternateUnit;
+import com.raynigon.unit.api.core.units.general.TransformedUnit;
+import com.raynigon.unit.api.core.units.si.SISystem;
+import com.raynigon.unit.api.core.units.si.area.SquareMetre;
+
+import javax.measure.Unit;
+import javax.measure.quantity.Illuminance;
+
+public class CandelaPerSquareMetre extends AlternateUnit {
+
+ @SuppressWarnings("unchecked")
+ public CandelaPerSquareMetre() {
+ super(
+ SISystem.ID,
+ "lx",
+ "Lux",
+ (Unit) (new Candela().divide(new SquareMetre())),
+ Luminance.class
+ );
+ }
+}
diff --git a/unit-api-core/src/main/java/com/raynigon/unit/api/core/units/si/luminance/Lumen.java b/unit-api-core/src/main/java/com/raynigon/unit/api/core/units/si/luminance/Lumen.java
new file mode 100644
index 00000000..67e872b3
--- /dev/null
+++ b/unit-api-core/src/main/java/com/raynigon/unit/api/core/units/si/luminance/Lumen.java
@@ -0,0 +1,25 @@
+package com.raynigon.unit.api.core.units.si.luminance;
+
+import com.raynigon.unit.api.core.units.general.AlternateUnit;
+import com.raynigon.unit.api.core.units.general.BaseUnit;
+import com.raynigon.unit.api.core.units.general.UnitDimension;
+import com.raynigon.unit.api.core.units.si.SISystem;
+import com.raynigon.unit.api.core.units.si.angle.Steradian;
+
+import javax.measure.Unit;
+import javax.measure.quantity.Illuminance;
+import javax.measure.quantity.LuminousFlux;
+
+public class Lumen extends AlternateUnit {
+
+ @SuppressWarnings("unchecked")
+ public Lumen() {
+ super(
+ SISystem.ID,
+ "lm",
+ "Lumen",
+ (Unit) new Candela().multiply(new Steradian()),
+ LuminousFlux.class
+ );
+ }
+}
diff --git a/unit-api-core/src/main/java/com/raynigon/unit/api/core/units/si/luminance/Lux.java b/unit-api-core/src/main/java/com/raynigon/unit/api/core/units/si/luminance/Lux.java
new file mode 100644
index 00000000..832b65f3
--- /dev/null
+++ b/unit-api-core/src/main/java/com/raynigon/unit/api/core/units/si/luminance/Lux.java
@@ -0,0 +1,22 @@
+package com.raynigon.unit.api.core.units.si.luminance;
+
+import com.raynigon.unit.api.core.units.general.AlternateUnit;
+import com.raynigon.unit.api.core.units.si.SISystem;
+import com.raynigon.unit.api.core.units.si.area.SquareMetre;
+
+import javax.measure.Unit;
+import javax.measure.quantity.Illuminance;
+
+public class Lux extends AlternateUnit {
+
+ @SuppressWarnings("unchecked")
+ public Lux() {
+ super(
+ SISystem.ID,
+ "lx",
+ "Lux",
+ (Unit) new Lumen().divide(new SquareMetre()),
+ Illuminance.class
+ );
+ }
+}