diff --git a/diozero-core/diozero-core-1.3.2_compare.jar b/diozero-core/diozero-core-1.3.2_compare.jar
new file mode 100644
index 000000000..108e546f7
Binary files /dev/null and b/diozero-core/diozero-core-1.3.2_compare.jar differ
diff --git a/diozero-core/pom.xml b/diozero-core/pom.xml
index 8bc711b01..dcab4df50 100644
--- a/diozero-core/pom.xml
+++ b/diozero-core/pom.xml
@@ -35,23 +35,64 @@
+
+ biz.aQute.bnd
+ bnd-maven-plugin
+ 5.3.0
+
+
+
+
+ bnd-process
+
+
+
+
org.apache.maven.plugins
maven-jar-plugin
- true
-
- diozero.core
-
-
- true
-
+ ${project.build.outputDirectory}/META-INF/MANIFEST.MF
+
+
+
+
+
+
+
+
+
+ org.osgi
+ osgi.annotation
+ 8.0.0
+ provided
+
+
+ biz.aQute.bnd
+ biz.aQute.bndlib
+ 5.3.0
+ provided
+
+
diff --git a/diozero-core/src/main/java/com/diozero/animation/easing/package-info.java b/diozero-core/src/main/java/com/diozero/animation/easing/package-info.java
new file mode 100644
index 000000000..46306d97b
--- /dev/null
+++ b/diozero-core/src/main/java/com/diozero/animation/easing/package-info.java
@@ -0,0 +1,4 @@
+
+@org.osgi.annotation.bundle.Export
+package com.diozero.animation;
+
diff --git a/diozero-core/src/main/java/com/diozero/animation/package-info.java b/diozero-core/src/main/java/com/diozero/animation/package-info.java
new file mode 100644
index 000000000..46306d97b
--- /dev/null
+++ b/diozero-core/src/main/java/com/diozero/animation/package-info.java
@@ -0,0 +1,4 @@
+
+@org.osgi.annotation.bundle.Export
+package com.diozero.animation;
+
diff --git a/diozero-core/src/main/java/com/diozero/api/function/package-info.java b/diozero-core/src/main/java/com/diozero/api/function/package-info.java
new file mode 100644
index 000000000..46306d97b
--- /dev/null
+++ b/diozero-core/src/main/java/com/diozero/api/function/package-info.java
@@ -0,0 +1,4 @@
+
+@org.osgi.annotation.bundle.Export
+package com.diozero.animation;
+
diff --git a/diozero-core/src/main/java/com/diozero/api/package-info.java b/diozero-core/src/main/java/com/diozero/api/package-info.java
index 9370a84e2..349436fa0 100644
--- a/diozero-core/src/main/java/com/diozero/api/package-info.java
+++ b/diozero-core/src/main/java/com/diozero/api/package-info.java
@@ -1,6 +1,9 @@
/**
* Core APIs for interfacing with devices.
*/
+@org.osgi.annotation.bundle.Export
+@aQute.bnd.annotation.licenses.MIT
+@org.osgi.annotation.bundle.Header(name = "Automatic-Module-Name",value = "diozero.core")
package com.diozero.api;
/*-
diff --git a/diozero-core/src/main/java/com/diozero/devices/mcp23xxx/package-info.java b/diozero-core/src/main/java/com/diozero/devices/mcp23xxx/package-info.java
new file mode 100644
index 000000000..46306d97b
--- /dev/null
+++ b/diozero-core/src/main/java/com/diozero/devices/mcp23xxx/package-info.java
@@ -0,0 +1,4 @@
+
+@org.osgi.annotation.bundle.Export
+package com.diozero.animation;
+
diff --git a/diozero-core/src/main/java/com/diozero/devices/motor/package-info.java b/diozero-core/src/main/java/com/diozero/devices/motor/package-info.java
new file mode 100644
index 000000000..46306d97b
--- /dev/null
+++ b/diozero-core/src/main/java/com/diozero/devices/motor/package-info.java
@@ -0,0 +1,4 @@
+
+@org.osgi.annotation.bundle.Export
+package com.diozero.animation;
+
diff --git a/diozero-core/src/main/java/com/diozero/devices/oled/package-info.java b/diozero-core/src/main/java/com/diozero/devices/oled/package-info.java
new file mode 100644
index 000000000..46306d97b
--- /dev/null
+++ b/diozero-core/src/main/java/com/diozero/devices/oled/package-info.java
@@ -0,0 +1,4 @@
+
+@org.osgi.annotation.bundle.Export
+package com.diozero.animation;
+
diff --git a/diozero-core/src/main/java/com/diozero/devices/package-info.java b/diozero-core/src/main/java/com/diozero/devices/package-info.java
index 792372315..9ea77d6ce 100644
--- a/diozero-core/src/main/java/com/diozero/devices/package-info.java
+++ b/diozero-core/src/main/java/com/diozero/devices/package-info.java
@@ -2,6 +2,7 @@
* Classes representing actual devices such as LEDs, Buttons as well as GPIO,
* devices that are connected via I2C, SPI and Serial interfaces.
*/
+@org.osgi.annotation.bundle.Export
package com.diozero.devices;
/*-
diff --git a/diozero-core/src/main/java/com/diozero/devices/sandpit/package-info.java b/diozero-core/src/main/java/com/diozero/devices/sandpit/package-info.java
new file mode 100644
index 000000000..46306d97b
--- /dev/null
+++ b/diozero-core/src/main/java/com/diozero/devices/sandpit/package-info.java
@@ -0,0 +1,4 @@
+
+@org.osgi.annotation.bundle.Export
+package com.diozero.animation;
+
diff --git a/diozero-core/src/main/java/com/diozero/internal/board/allwinner/AllwinnerH5BoardInfoProvider.java b/diozero-core/src/main/java/com/diozero/internal/board/allwinner/AllwinnerH5BoardInfoProvider.java
index 441e7994e..c4d6a219c 100644
--- a/diozero-core/src/main/java/com/diozero/internal/board/allwinner/AllwinnerH5BoardInfoProvider.java
+++ b/diozero-core/src/main/java/com/diozero/internal/board/allwinner/AllwinnerH5BoardInfoProvider.java
@@ -37,11 +37,14 @@
import com.diozero.sbc.BoardInfo;
import com.diozero.sbc.LocalSystemInfo;
+import aQute.bnd.annotation.spi.ServiceProvider;
+
/**
* https://linux-sunxi.org/Xunlong_Orange_Pi_Zero_Plus
* https://linux-sunxi.org/GPIO
* https://github.com/friendlyarm/WiringNP/blob/master/wiringPi/boardtype_friendlyelec.c#L66
*/
+@ServiceProvider(value = BoardInfoProvider.class)
public class AllwinnerH5BoardInfoProvider implements BoardInfoProvider {
// Not reliable
// public static final String ORANGEPI_ZEROPLUS_HARDWARE = "sun50iw1p1";
diff --git a/diozero-core/src/main/java/com/diozero/internal/board/allwinner/AllwinnerH6BoardInfoProvider.java b/diozero-core/src/main/java/com/diozero/internal/board/allwinner/AllwinnerH6BoardInfoProvider.java
index 89f0da4d9..ff3652f04 100644
--- a/diozero-core/src/main/java/com/diozero/internal/board/allwinner/AllwinnerH6BoardInfoProvider.java
+++ b/diozero-core/src/main/java/com/diozero/internal/board/allwinner/AllwinnerH6BoardInfoProvider.java
@@ -37,10 +37,13 @@
import com.diozero.sbc.BoardInfo;
import com.diozero.sbc.LocalSystemInfo;
+import aQute.bnd.annotation.spi.ServiceProvider;
+
/**
* https://linux-sunxi.org/Xunlong_Orange_Pi_One_Plus
* https://linux-sunxi.org/GPIO
*/
+@ServiceProvider(value = BoardInfoProvider.class)
public class AllwinnerH6BoardInfoProvider implements BoardInfoProvider {
// Not reliable
// public static final String ORANGEPI_ONEPLUS_HARDWARE = "sun50iw1p1";
diff --git a/diozero-core/src/main/java/com/diozero/internal/board/allwinner/AllwinnerSun8iBoardInfoProvider.java b/diozero-core/src/main/java/com/diozero/internal/board/allwinner/AllwinnerSun8iBoardInfoProvider.java
index 57526b0aa..df1fd6ab0 100644
--- a/diozero-core/src/main/java/com/diozero/internal/board/allwinner/AllwinnerSun8iBoardInfoProvider.java
+++ b/diozero-core/src/main/java/com/diozero/internal/board/allwinner/AllwinnerSun8iBoardInfoProvider.java
@@ -30,13 +30,14 @@
* THE SOFTWARE.
* #L%
*/
-
import com.diozero.internal.board.GenericLinuxArmBoardInfo;
import com.diozero.internal.spi.BoardInfoProvider;
import com.diozero.internal.spi.MmapGpioInterface;
import com.diozero.sbc.BoardInfo;
import com.diozero.sbc.LocalSystemInfo;
+import aQute.bnd.annotation.spi.ServiceProvider;
+@ServiceProvider(value = BoardInfoProvider.class)
public class AllwinnerSun8iBoardInfoProvider implements BoardInfoProvider {
// E.g. CONFIG_ORANGEPI_H3, CONFIG_ORANGEPI_ZEROPLUS2_H3
public static final String MAKE = "Allwinner sun8i";
diff --git a/diozero-core/src/main/java/com/diozero/internal/board/beaglebone/BeagleBoneBoardInfoProvider.java b/diozero-core/src/main/java/com/diozero/internal/board/beaglebone/BeagleBoneBoardInfoProvider.java
index 46939be51..be55ea8b2 100644
--- a/diozero-core/src/main/java/com/diozero/internal/board/beaglebone/BeagleBoneBoardInfoProvider.java
+++ b/diozero-core/src/main/java/com/diozero/internal/board/beaglebone/BeagleBoneBoardInfoProvider.java
@@ -48,10 +48,13 @@
import com.diozero.sbc.BoardInfo;
import com.diozero.sbc.LocalSystemInfo;
+import aQute.bnd.annotation.spi.ServiceProvider;
+
/*-
* https://github.com/derekmolloy/boneDeviceTree/raw/master/docs/BeagleboneBlackP8HeaderTable.pdf
* https://github.com/derekmolloy/boneDeviceTree/raw/master/docs/BeagleboneBlackP9HeaderTable.pdf
*/
+@ServiceProvider(value = BoardInfoProvider.class)
public class BeagleBoneBoardInfoProvider implements BoardInfoProvider {
public static final String MAKE = "BeagleBone";
diff --git a/diozero-core/src/main/java/com/diozero/internal/board/beaglebone/package-info.java b/diozero-core/src/main/java/com/diozero/internal/board/beaglebone/package-info.java
new file mode 100644
index 000000000..582114803
--- /dev/null
+++ b/diozero-core/src/main/java/com/diozero/internal/board/beaglebone/package-info.java
@@ -0,0 +1,4 @@
+
+@aQute.bnd.annotation.jpms.ExportTo({"com.diozero.provider.bbbiolib"})
+package com.diozero.internal.provider.builtin;
+
diff --git a/diozero-core/src/main/java/com/diozero/internal/board/chip/ChipBoardInfoProvider.java b/diozero-core/src/main/java/com/diozero/internal/board/chip/ChipBoardInfoProvider.java
index 6e297dd86..9920ae3ca 100644
--- a/diozero-core/src/main/java/com/diozero/internal/board/chip/ChipBoardInfoProvider.java
+++ b/diozero-core/src/main/java/com/diozero/internal/board/chip/ChipBoardInfoProvider.java
@@ -46,6 +46,8 @@
import com.diozero.sbc.BoardInfo;
import com.diozero.sbc.LocalSystemInfo;
+import aQute.bnd.annotation.spi.ServiceProvider;
+@ServiceProvider(value = BoardInfoProvider.class)
public class ChipBoardInfoProvider implements BoardInfoProvider {
public static final String MAKE = "Next Thing Company";
public static final String MODEL_CHIP = "CHIP";
diff --git a/diozero-core/src/main/java/com/diozero/internal/board/odroid/OdroidBoardInfoProvider.java b/diozero-core/src/main/java/com/diozero/internal/board/odroid/OdroidBoardInfoProvider.java
index 0e0d887f5..b592dc507 100644
--- a/diozero-core/src/main/java/com/diozero/internal/board/odroid/OdroidBoardInfoProvider.java
+++ b/diozero-core/src/main/java/com/diozero/internal/board/odroid/OdroidBoardInfoProvider.java
@@ -37,6 +37,8 @@
import com.diozero.sbc.BoardInfo;
import com.diozero.sbc.LocalSystemInfo;
+import aQute.bnd.annotation.spi.ServiceProvider;
+@ServiceProvider(value = BoardInfoProvider.class)
public class OdroidBoardInfoProvider implements BoardInfoProvider {
public static final String MAKE = "Odroid";
public static final String C1_HARDWARE_ID = "ODROID-C1";
diff --git a/diozero-core/src/main/java/com/diozero/internal/board/raspberrypi/RaspberryPiBoardInfoProvider.java b/diozero-core/src/main/java/com/diozero/internal/board/raspberrypi/RaspberryPiBoardInfoProvider.java
index 594a48c96..b3725c270 100644
--- a/diozero-core/src/main/java/com/diozero/internal/board/raspberrypi/RaspberryPiBoardInfoProvider.java
+++ b/diozero-core/src/main/java/com/diozero/internal/board/raspberrypi/RaspberryPiBoardInfoProvider.java
@@ -49,12 +49,15 @@
import com.diozero.sbc.BoardInfo;
import com.diozero.sbc.LocalSystemInfo;
+import aQute.bnd.annotation.spi.ServiceProvider;
+
/**
* See
* this c
* library. See also this
* table of revisions.
*/
+@ServiceProvider(value = BoardInfoProvider.class)
public class RaspberryPiBoardInfoProvider implements BoardInfoProvider {
public static final String MAKE = "Raspberry Pi";
private static final String BCM_HARDWARE_PREFIX = "BCM";
diff --git a/diozero-core/src/main/java/com/diozero/internal/board/raspberrypi/package-info.java b/diozero-core/src/main/java/com/diozero/internal/board/raspberrypi/package-info.java
new file mode 100644
index 000000000..1f2f0dc24
--- /dev/null
+++ b/diozero-core/src/main/java/com/diozero/internal/board/raspberrypi/package-info.java
@@ -0,0 +1,4 @@
+
+@aQute.bnd.annotation.jpms.ExportTo({"com.diozero.provider.pigpio"})
+package com.diozero.internal.provider.builtin;
+
diff --git a/diozero-core/src/main/java/com/diozero/internal/board/tinkerboard/TinkerBoardBoardInfoProvider.java b/diozero-core/src/main/java/com/diozero/internal/board/tinkerboard/TinkerBoardBoardInfoProvider.java
index 1cfe8a365..403c651b9 100644
--- a/diozero-core/src/main/java/com/diozero/internal/board/tinkerboard/TinkerBoardBoardInfoProvider.java
+++ b/diozero-core/src/main/java/com/diozero/internal/board/tinkerboard/TinkerBoardBoardInfoProvider.java
@@ -37,6 +37,9 @@
import com.diozero.sbc.BoardInfo;
import com.diozero.sbc.LocalSystemInfo;
+import aQute.bnd.annotation.spi.ServiceProvider;
+
+@ServiceProvider(value = BoardInfoProvider.class)
public class TinkerBoardBoardInfoProvider implements BoardInfoProvider {
public static final String MAKE = "Asus";
private static final String TINKER_BOARD_HARDWARE_ID = "Rockchip (Device Tree)";
diff --git a/diozero-core/src/main/java/com/diozero/internal/provider/builtin/gpio/package-info.java b/diozero-core/src/main/java/com/diozero/internal/provider/builtin/gpio/package-info.java
new file mode 100644
index 000000000..c05844a32
--- /dev/null
+++ b/diozero-core/src/main/java/com/diozero/internal/provider/builtin/gpio/package-info.java
@@ -0,0 +1,4 @@
+
+@aQute.bnd.annotation.jpms.ExportTo({"com.diozero.sampleapps"})
+package com.diozero.internal.provider.builtin;
+
diff --git a/diozero-core/src/main/java/com/diozero/internal/provider/builtin/i2c/package-info.java b/diozero-core/src/main/java/com/diozero/internal/provider/builtin/i2c/package-info.java
new file mode 100644
index 000000000..582114803
--- /dev/null
+++ b/diozero-core/src/main/java/com/diozero/internal/provider/builtin/i2c/package-info.java
@@ -0,0 +1,4 @@
+
+@aQute.bnd.annotation.jpms.ExportTo({"com.diozero.provider.bbbiolib"})
+package com.diozero.internal.provider.builtin;
+
diff --git a/diozero-core/src/main/java/com/diozero/internal/provider/builtin/package-info.java b/diozero-core/src/main/java/com/diozero/internal/provider/builtin/package-info.java
index fb597eb3d..0bd343676 100644
--- a/diozero-core/src/main/java/com/diozero/internal/provider/builtin/package-info.java
+++ b/diozero-core/src/main/java/com/diozero/internal/provider/builtin/package-info.java
@@ -2,6 +2,7 @@
* The built-in default provider supporting GPIO, I2C, SPI and Serial device
* communication.
*/
+@aQute.bnd.annotation.jpms.ExportTo({"com.diozero.provider.bbbiolib", "com.diozero.provider.mmap", "com.diozero.provider.remote"})
package com.diozero.internal.provider.builtin;
/*-
diff --git a/diozero-core/src/main/java/com/diozero/internal/provider/builtin/serial/package-info.java b/diozero-core/src/main/java/com/diozero/internal/provider/builtin/serial/package-info.java
new file mode 100644
index 000000000..425571a02
--- /dev/null
+++ b/diozero-core/src/main/java/com/diozero/internal/provider/builtin/serial/package-info.java
@@ -0,0 +1,4 @@
+
+@aQute.bnd.annotation.jpms.ExportTo({"com.diozero.provider.remote"})
+package com.diozero.internal.provider.builtin;
+
diff --git a/diozero-core/src/main/java/com/diozero/internal/spi/BoardInfoProvider.java b/diozero-core/src/main/java/com/diozero/internal/spi/BoardInfoProvider.java
index aa08d8698..e352fdb06 100644
--- a/diozero-core/src/main/java/com/diozero/internal/spi/BoardInfoProvider.java
+++ b/diozero-core/src/main/java/com/diozero/internal/spi/BoardInfoProvider.java
@@ -37,6 +37,10 @@
import com.diozero.sbc.LocalSystemInfo;
import com.diozero.util.ServiceLoaderUtil;
+import aQute.bnd.annotation.Resolution;
+import aQute.bnd.annotation.spi.ServiceConsumer;
+
+@ServiceConsumer(value = BoardInfoProvider.class,resolution = Resolution.OPTIONAL)
public interface BoardInfoProvider {
BoardInfo lookup(LocalSystemInfo sysInfo);
diff --git a/diozero-core/src/main/java/com/diozero/internal/spi/NativeDeviceFactoryInterface.java b/diozero-core/src/main/java/com/diozero/internal/spi/NativeDeviceFactoryInterface.java
index f46c8606d..31ea151e7 100644
--- a/diozero-core/src/main/java/com/diozero/internal/spi/NativeDeviceFactoryInterface.java
+++ b/diozero-core/src/main/java/com/diozero/internal/spi/NativeDeviceFactoryInterface.java
@@ -37,6 +37,10 @@
import com.diozero.sbc.BoardInfo;
import com.diozero.util.ServiceLoaderUtil;
+import aQute.bnd.annotation.Resolution;
+import aQute.bnd.annotation.spi.ServiceConsumer;
+
+@ServiceConsumer(value = NativeDeviceFactoryInterface.class,resolution = Resolution.OPTIONAL)
public interface NativeDeviceFactoryInterface extends GpioDeviceFactoryInterface, SpiDeviceFactoryInterface,
I2CDeviceFactoryInterface, PwmOutputDeviceFactoryInterface, ServoDeviceFactoryInterface,
AnalogInputDeviceFactoryInterface, AnalogOutputDeviceFactoryInterface, SerialDeviceFactoryInterface {
diff --git a/diozero-core/src/main/java/com/diozero/sbc/package-info.java b/diozero-core/src/main/java/com/diozero/sbc/package-info.java
index a55f71b28..ab2785772 100644
--- a/diozero-core/src/main/java/com/diozero/sbc/package-info.java
+++ b/diozero-core/src/main/java/com/diozero/sbc/package-info.java
@@ -1,6 +1,7 @@
/**
* APIs for interfacing with the host board.
*/
+@org.osgi.annotation.bundle.Export
package com.diozero.sbc;
/*-
diff --git a/diozero-core/src/main/java/com/diozero/util/package-info.java b/diozero-core/src/main/java/com/diozero/util/package-info.java
new file mode 100644
index 000000000..46306d97b
--- /dev/null
+++ b/diozero-core/src/main/java/com/diozero/util/package-info.java
@@ -0,0 +1,4 @@
+
+@org.osgi.annotation.bundle.Export
+package com.diozero.animation;
+
diff --git a/diozero-core/src/main/resources/META-INF/services/com.diozero.internal.spi.BoardInfoProvider b/diozero-core/src/main/resources/META-INF/services/com.diozero.internal.spi.BoardInfoProvider
deleted file mode 100644
index 9da894101..000000000
--- a/diozero-core/src/main/resources/META-INF/services/com.diozero.internal.spi.BoardInfoProvider
+++ /dev/null
@@ -1,8 +0,0 @@
-com.diozero.internal.board.allwinner.AllwinnerH5BoardInfoProvider
-com.diozero.internal.board.allwinner.AllwinnerH6BoardInfoProvider
-com.diozero.internal.board.allwinner.AllwinnerSun8iBoardInfoProvider
-com.diozero.internal.board.beaglebone.BeagleBoneBoardInfoProvider
-com.diozero.internal.board.chip.ChipBoardInfoProvider
-com.diozero.internal.board.odroid.OdroidBoardInfoProvider
-com.diozero.internal.board.raspberrypi.RaspberryPiBoardInfoProvider
-com.diozero.internal.board.tinkerboard.TinkerBoardBoardInfoProvider
\ No newline at end of file