diff --git a/control b/control
index 3011a09dd..df5d64bc4 100644
--- a/control
+++ b/control
@@ -14,6 +14,7 @@ Build-Depends: autoconf,
                binutils (>= 2.37-9) [ppc64],
                bison,
                bzip2,
+               cargo [!alpha !hppa !ia64 !kfreebsd-amd64 !kfreebsd-i386 !m68k !mips !mipsel !mips64 !powerpcspe !riscv64 !sparc],
                clang [i386],
                debhelper-compat (= 12),
                default-jdk (>= 2:1.9) [!hppa !hurd-amd64 !hurd-i386 !kfreebsd-amd64 !kfreebsd-i386 !powerpcspe !s390 !sparc !ppc64el !s390x !armhf !armel] <!nojava>,
@@ -157,8 +160,10 @@ Build-Depends: autoconf,
                pkgconf,
                po-debconf,
                python3,
+               python3 [!alpha !hppa !ia64 !kfreebsd-amd64 !kfreebsd-i386 !m68k !mips !mipsel !mips64 !powerpcspe !riscv64 !sparc],
                python3-dev <!nopython>,
                python3-setuptools <!nopython>,
+               rustc [!alpha !hppa !ia64 !kfreebsd-amd64 !kfreebsd-i386 !m68k !mips !mipsel !mips64 !powerpcspe !riscv64 !sparc],
                unixodbc-dev,
                unzip,
                x11proto-render-dev,
@@ -171,7 +176,9 @@ Build-Depends-Arch: at-spi2-core [!alpha !armel !armhf !hppa !i386 !ia64 !kfreeb
                     coinor-libcoinutils-dev,
                     culmus [amd64 arm64 armel i386 ppc64el s390x riscv64] <!nocheck>,
                     dbus-x11 [!alpha !armel !armhf !hppa !i386 !ia64 !kfreebsd-amd64 !kfreebsd-i386 !loong64 !m68k !mips !mipsel !mips64 !mips64el !powerpc !powerpcspe !ppc64 !ppc64el !riscv64 !s390x !sparc !sparc64] <!nocheck>,
-                    firebird-dev [!m68k],
+                    dh-cargo [!alpha !hppa !ia64 !kfreebsd-amd64 !kfreebsd-i386 !m68k !mips !mipsel !mips64 !powerpcspe !riscv64 !sparc],
+                    firebird-dev (<< 5.0~) [!m68k],
+                    firebird-dev (>= 4.0) [!m68k],
                     firebird4.0-server-core [!m68k] <!nocheck>,
                     fontconfig [amd64 arm64 armel i386 ppc64el s390x riscv64] <!nocheck>,
                     fonts-crosextra-caladea [amd64 arm64 armel i386 ppc64el s390x riscv64] <!nocheck>,
@@ -463,6 +469,8 @@ Description: office productivity suite -- Indic language packages
 
 Package: libreoffice-core
 Architecture: alpha amd64 arm64 armel armhf hppa i386 ia64 kfreebsd-amd64 kfreebsd-i386 loong64 m68k mips mipsel mips64 mips64el powerpc powerpcspe ppc64 ppc64el riscv64 s390x sparc sparc64
+Built-Using: ${cargo:Built-Using}
+Static-Built-Using: ${cargo:Static-Built-Using}
 Depends: fontconfig,
          fonts-opensymbol (>= 2:102.12),
          libreoffice-common (>> ${base-version}),
@@ -517,6 +525,8 @@ Description: office productivity suite -- arch-dependent files
 
 Package: libreoffice-core-nogui
 Architecture: amd64 arm64 armhf i386 ppc64 ppc64el s390x
+Built-Using: ${cargo:Built-Using}
+Static-Built-Using: ${cargo:Static-Built-Using}
 Depends: fontconfig,
          fonts-opensymbol (>= 2:102.12),
          libreoffice-common (>> ${base-version}),
@@ -1398,7 +1408,6 @@ Description: UI data ("config") for LibreOffice Writer
  You will usually not need to install this package manually but it should
  just be pulled in by other packages.
 
-
 Package: libreoffice-l10n-af
 Section: localization
 Architecture: all
@@ -5294,6 +5303,36 @@ Description: LibreOfficeKit -- headers
  .
  This package contains the headers needed for using LibreOfficeKit.
 
+Package: librust-rust-uno-dev
+Section: rust
+Architecture: amd64 arm64 armel armhf i386 loong64 mips64el powerpc ppc64 ppc64el s390x sparc64
+Depends: libreoffice-core, libreoffice-dev
+Built-Using: ${cargo:Built-Using}
+Static-Built-Using: ${cargo:Static-Built-Using}
+Suggests: libreoffice-rust-uno-example
+Description: Rust FFI binding for LibreOffice UNO API - Rust source code
+ Source code for Debianized Rust crate "rust_uno"
+ .
+ (packaged from LibreOffice source package)
+
+Package: libreoffice-rust-uno-example
+Section: rust
+Priority: extra
+Architecture: amd64 arm64 armel armhf i386 loong64 mips64el powerpc ppc64 ppc64el s390x sparc64
+Depends: libreoffice-writer (>= 4:26.2.0~alpha0~) | libreoffice-writer-nogui (>= 4:26.2.0~alpha0~),
+         ${shlibs:Depends}
+Suggests: librust-rust-uno-dev
+Built-Using: ${cargo:Built-Using}
+Static-Built-Using: ${cargo:Static-Built-Using}
+Build-Profiles: <!noinsttest>
+Description: Example extension for LibreOffices Rust-UNO binding
+ This package contains a example extension testing the Libreoffice
+ Rust-UNO binding.
+ .
+ You normally don't need it unless you want to look at it since it doesn't
+ contain anything useful except a test; but it  is used for testing in
+ autopkgtest
+
 Package: libreoffice-gtk3
 Architecture: alpha amd64 arm64 armel armhf hppa i386 ia64 kfreebsd-amd64 kfreebsd-i386 loong64 m68k mips mipsel mips64 mips64el powerpc powerpcspe ppc64 ppc64el riscv64 s390x sparc sparc64
 Depends: libreoffice-core (= ${binary:Version}),
diff --git a/control.in b/control.in
index b6b46558a..1226c4f21 100644
--- a/control.in
+++ b/control.in
@@ -210,6 +210,8 @@ Description: office productivity suite -- Indic language packages
 
 Package: libreoffice-core
 Architecture: %OOO_ARCHS%
+Built-Using: ${cargo:Built-Using}
+Static-Built-Using: ${cargo:Static-Built-Using}
 Depends: fontconfig,
          fonts-opensymbol (>= 2:102.12),
          libreoffice-common (>> ${base-version}),
@@ -258,6 +260,8 @@ Description: office productivity suite -- arch-dependent files
 
 Package: libreoffice-core-nogui
 Architecture: %OOO_NOGUI_ARCHS%
+Built-Using: ${cargo:Built-Using}
+Static-Built-Using: ${cargo:Static-Built-Using}
 Depends: fontconfig,
          fonts-opensymbol (>= 2:102.12),
          libreoffice-common (>> ${base-version}),
@@ -1059,4 +1063,3 @@ Description: UI data ("config") for LibreOffice Writer
  You will usually not need to install this package manually but it should
  just be pulled in by other packages.
 
-
diff --git a/control.rust.in b/control.rust.in
new file mode 100644
index 000000000..bb846a807
--- /dev/null
+++ b/control.rust.in
@@ -0,0 +1,29 @@
+Package: librust-rust-uno-dev
+Section: rust
+Architecture: %OOO_RUST_ARCHS%
+Depends: libreoffice-dev, libreoffice-core
+Built-Using: ${cargo:Built-Using}
+Static-Built-Using: ${cargo:Static-Built-Using}
+Suggests: libreoffice-rust-uno-example
+Description: Rust FFI binding for LibreOffice UNO API - Rust source code
+ Source code for Debianized Rust crate "rust_uno"
+ .
+ (packaged from LibreOffice source package)
+
+Package: libreoffice-rust-uno-example
+Section: rust
+Priority: extra
+Architecture: %OOO_RUST_ARCHS%
+Depends: ${shlibs:Depends}, libreoffice-writer (>= 4:26.2.0~alpha0~) | libreoffice-writer-nogui (>= 4:26.2.0~alpha0~)
+Suggests: librust-rust-uno-dev
+Built-Using: ${cargo:Built-Using}
+Static-Built-Using: ${cargo:Static-Built-Using}
+Build-Profiles: <!noinsttest>
+Description: Example extension for LibreOffices Rust-UNO binding
+ This package contains a example extension testing the Libreoffice
+ Rust-UNO binding.
+ .
+ You normally don't need it unless you want to look at it since it doesn't
+ contain anything useful except a test; but it  is used for testing in
+ autopkgtest
+
--- /dev/null
+++ b/libreoffice-rust-uno-example.install.in
@@ -0,0 +1 @@
+../../workdir/Extension/rust_uno-example/root/* usr/lib/libreoffice/share/extensions/rust_uno-example
diff --git a/librust-rust-uno-dev.install.in b/librust-rust-uno-dev.install.in
new file mode 100644
index 000000000..19190a268
--- /dev/null
+++ b/librust-rust-uno-dev.install.in
@@ -0,0 +1 @@
+../../rust_uno/* /usr/share/cargo/registry/rust-uno-@RUST_UNO_VERSION@
diff --git a/patches/cargo-build-flag.diff b/patches/cargo-build-flag.diff
new file mode 100644
index 000000000..8c0ca3533
--- /dev/null
+++ b/patches/cargo-build-flag.diff
@@ -0,0 +1,12 @@
+diff --git a/rust_uno/CustomTarget_cargo.mk b/rust_uno/CustomTarget_cargo.mk
+index d27ec0b0797a..01829d8dca54 100644
+--- a/rust_uno/CustomTarget_cargo.mk
++++ b/rust_uno/CustomTarget_cargo.mk
+@@ -13,6 +13,6 @@ $(eval $(call gb_CustomTarget_CustomTarget,rust_uno/cargo))
+ $(call gb_CustomTarget_get_target,rust_uno/cargo): \
+         $(call gb_Library_get_target,rust_uno-cpp) \
+         $(gb_CustomTarget_workdir)/rust_uno/rustmaker/cpp
+-	cd $(SRCDIR)/rust_uno && export DEB_CARGO_CRATE=rust-uno_$(shell grep version rust_uno/Cargo.toml | awk '{ print $$3 }' | sed -e s/\"//g); cargo build $(if $(verbose),--verbose,) --release
++	cd $(SRCDIR)/rust_uno && export DEB_CARGO_CRATE=rust-uno_$(shell grep version rust_uno/Cargo.toml | awk '{ print $$3 }' | sed -e s/\"//g); cargo build $(if $(verbose),--verbose,) $(CARGO_FLAGS)
+ 
+ # vim: set noet sw=4 ts=4:
diff --git a/patches/fix-rust_uno-example-link.diff b/patches/fix-rust_uno-example-link.diff
new file mode 100644
index 000000000..602e863d6
--- /dev/null
+++ b/patches/fix-rust_uno-example-link.diff
@@ -0,0 +1,45 @@
+From 976fc1d51675edb1439a58cd56d8afc404f237a4 Mon Sep 17 00:00:00 2001
+From: Mohamed Ali <mohmedali1462005@gmail.com>
+Date: Sun, 2 Nov 2025 02:12:33 +0200
+Subject: [PATCH] Rust Bindings: Improve library linking for rust_uno-example
+
+- Add -rpath linker flag with $ORIGIN to enable runtime library path resolution
+- Replace absolute library path with -L and -l flags for more flexible linking
+- Ensures rust_uno library can be found at runtime without LD_LIBRARY_PATH
+
+Change-Id: I135aa7beb69c69c4d9386eb9d7a6fc3e4d00ba3d
+---
+ rust_uno/Library_rust_uno-example.mk | 18 +++++++++++++++---
+ 1 file changed, 15 insertions(+), 3 deletions(-)
+
+diff --git a/rust_uno/Library_rust_uno-example.mk b/rust_uno/Library_rust_uno-example.mk
+index 4f55a5b28296..8c4b5972575b 100644
+--- a/rust_uno/Library_rust_uno-example.mk
++++ b/rust_uno/Library_rust_uno-example.mk
+@@ -30,8 +30,20 @@ $(eval $(call gb_Library_use_libraries,rust_uno-example, \
+ $(eval $(call gb_Library_use_sdk_api,rust_uno-example))
+ 
+ $(call gb_Library_get_target,rust_uno-example): $(call gb_CustomTarget_get_target,rust_uno/cargo)
+-$(eval $(call gb_Library_add_libs,rust_uno-example,\
+-    $(SRCDIR)/rust_uno/target/release/$(if $(filter WNT,$(OS_FOR_BUILD)),rust_uno.dll.lib,librust_uno.so) \
+-))
++
++ifneq ($(filter WNT,$(OS_FOR_BUILD)),)
++    # Windows-specific flags
++    $(eval $(call gb_Library_add_libs,rust_uno-example,\
++        $(SRCDIR)/rust_uno/target/release/rust_uno.lib \
++    ))
++else
++    # Unix/Linux with RPATH
++    $(eval $(call gb_Library_add_ldflags,rust_uno-example,\
++        -Wl$(COMMA)-rpath$(COMMA)\$$$$ORIGIN \
++    ))
++    $(eval $(call gb_Library_add_libs,rust_uno-example,\
++        -L$(SRCDIR)/rust_uno/target/release -lrust_uno \
++    ))
++endif
+ 
+ # vim: set noet sw=4 ts=4:
+-- 
+2.47.3
+
diff --git a/patches/fix-rust_uno-path-for-cargo-wrapper.diff b/patches/fix-rust_uno-path-for-cargo-wrapper.diff
new file mode 100644
index 000000000..73eab76bb
--- /dev/null
+++ b/patches/fix-rust_uno-path-for-cargo-wrapper.diff
@@ -0,0 +1,31 @@
+--- a/rust_uno/Library_rust_uno-example.mk-old	2025-11-02 16:57:53.000000000 +0100
++++ b/rust_uno/Library_rust_uno-example.mk	2025-11-02 16:59:02.777844541 +0100
+@@ -42,7 +42,7 @@
+         -Wl$(COMMA)-rpath$(COMMA)\$$$$ORIGIN \
+     ))
+     $(eval $(call gb_Library_add_libs,rust_uno-example,\
+-        -L$(SRCDIR)/rust_uno/target/release -lrust_uno \
++        -L$(SRCDIR)/rust_uno/target/$(DEB_HOST_RUST_TYPE)/$(CARGO_CHANNEL) -lrust_uno \
+     ))
+ endif
+ 
+diff --git a/rust_uno/Extension_rust_uno-example.mk b/rust_uno/Extension_rust_uno-example.mk
+index d0ee22a657d7..140a3e1c41ef 100644
+--- a/rust_uno/Extension_rust_uno-example.mk
++++ b/rust_uno/Extension_rust_uno-example.mk
+@@ -14,13 +14,13 @@ $(eval $(call gb_Extension_add_file,rust_uno-example,platform.components,$(call
+ $(eval $(call gb_Extension_add_files,rust_uno-example,, \
+     $(SRCDIR)/rust_uno/example/Addons.xcu \
+     $(SRCDIR)/rust_uno/example/ProtocolHandler.xcu \
+-    $(SRCDIR)/rust_uno/target/release/$(if $(filter WNT,$(OS_FOR_BUILD)),rust_uno.dll,librust_uno.so) \
++    $(SRCDIR)/rust_uno/target/$(DEB_HOST_RUST_TYPE)/$(CARGO_CHANNEL)/$(if $(filter WNT,$(OS_FOR_BUILD)),rust_uno.dll,librust_uno.so) \
+ ))
+ 
+ $(eval $(call gb_Extension_add_libraries,rust_uno-example, \
+     rust_uno-example \
+ ))
+ 
+-$(SRCDIR)/rust_uno/target/release/$(if $(filter WNT,$(OS_FOR_BUILD)),rust_uno.dll,librust_uno.so): $(call gb_CustomTarget_get_target,rust_uno/cargo)
++$(SRCDIR)/rust_uno/target/$(DEB_HOST_RUST_TYPE)/$(CARGO_CHANNEL)/$(if $(filter WNT,$(OS_FOR_BUILD)),rust_uno.dll,librust_uno.so): $(call gb_CustomTarget_get_target,rust_uno/cargo)
+ 
+ # vim: set noet sw=4 ts=4:
diff --git a/patches/fix-rust_uno-test.diff b/patches/fix-rust_uno-test.diff
new file mode 100644
index 000000000..b0950483a
--- /dev/null
+++ b/patches/fix-rust_uno-test.diff
@@ -0,0 +1,916 @@
+From ceca0500681cceee32207972a6c39c030abd9311 Mon Sep 17 00:00:00 2001
+From: Rene Engelhard <rene@rene-engelhard.de>
+Date: Fri, 31 Oct 2025 22:19:28 +0100
+Subject: [PATCH] fix cargo test in rust_uno
+
+explicitely complains about e.g.
+= note: /usr/bin/ld: /home/rene/LibreOffice/git/master/rust_uno/target/release/deps/rust_uno-bb2da24176c83c31.rust_uno.bbe73856b61efdea-cgu.1.rcgu.o: undefined reference to symbol 'typelib_typedescriptionreference_new@@UDK_3_0_0'
+          /usr/bin/ld: /home/rene/LibreOffice/git/master/rust_uno/../instdir/program/libuno_cppu.so.3: error adding symbols: DSO missing from command line
+          collect2: error: ld returned 1 exit status
+
+integration_tests.rs is obsolete
+
+see
+https://lists.freedesktop.org/archives/libreoffice/2025-October/093925.html
+ff.
+
+Also go sure and add sdk/lib also to the fallback for cargo test without
+INSTDIR set
+
+Change-Id: Ia71bdc96560eca5f83cad8f99f751f412febb496
+---
+ rust_uno/build.rs                           |  10 +-
+ rust_uno/src/ffi/mod.rs                     |   6 -
+ rust_uno/src/ffi/tests/integration_tests.rs | 828 --------------------
+ 3 files changed, 8 insertions(+), 836 deletions(-)
+ delete mode 100644 rust_uno/src/ffi/tests/integration_tests.rs
+
+diff --git a/rust_uno/build.rs b/rust_uno/build.rs
+index a5c819986b80..a28497cb3e57 100644
+--- a/rust_uno/build.rs
++++ b/rust_uno/build.rs
+@@ -14,17 +14,22 @@
+ fn main() {
+     // Tell cargo to link against the rust_uno-cpp library
+     // This library contains the generated C++ bridge functions
+-    // It requires linking against sal3.dll on Windows
+     if cfg!(windows) {
+         println!("cargo:rustc-link-lib=irust_uno-cpp");
++        // It requires linking against sal3.dll on Windows
+         println!("cargo:rustc-link-lib=isal");
+     } else {
+         println!("cargo:rustc-link-lib=rust_uno-cpplo");
++        // requires sal & co to link
++        println!("cargo:rustc-link-lib=uno_cppu");
++        println!("cargo:rustc-link-lib=uno_sal");
++        println!("cargo:rustc-link-lib=uno_salhelpergcc3");
++
+     }
+ 
+     // Add the LibreOffice instdir/program directory to the library search path
+     // This is where librust_uno-cpplo.so is located
+-    // sal3.dll's .lib is under sdk/lib
++    // the UREs dll's .libs/.so symlinks are under sdk/lib
+     if let Ok(instdir) = std::env::var("INSTDIR") {
+         println!("cargo:rustc-link-search=native={}/program", instdir);
+         println!("cargo:rustc-link-search=native={}/sdk/lib", instdir);
+@@ -40,6 +45,7 @@ fn main() {
+ 
+     // Fallback: try relative paths from the rust_uno directory
+     println!("cargo:rustc-link-search=native=../instdir/program");
++    println!("cargo:rustc-link-search=native=../instdir/sdk/lib");
+     println!("cargo:rustc-link-search=native=../workdir/LinkTarget/Library");
+ }
+ 
+diff --git a/rust_uno/src/ffi/mod.rs b/rust_uno/src/ffi/mod.rs
+index 6f2518283076..217352385517 100644
+--- a/rust_uno/src/ffi/mod.rs
++++ b/rust_uno/src/ffi/mod.rs
+@@ -18,10 +18,4 @@ pub mod rtl_string;
+ pub mod sal_types;
+ pub mod type_ffi;
+ 
+-// Include unit tests
+-#[cfg(test)]
+-mod tests {
+-    mod integration_tests;
+-}
+-
+ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
+diff --git a/rust_uno/src/ffi/tests/integration_tests.rs b/rust_uno/src/ffi/tests/integration_tests.rs
+deleted file mode 100644
+index 4b89c229e052..000000000000
+--- a/rust_uno/src/ffi/tests/integration_tests.rs
++++ /dev/null
+@@ -1,828 +0,0 @@
+-/* -*- Mode: rust; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+-/*
+- * This file is part of the LibreOffice project.
+- *
+- * This Source Code Form is subject to the terms of the Mozilla Public
+- * License, v. 2.0. If a copy of the MPL was not distributed with this
+- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+- */
+-
+-//! Integration tests for Rust UNO Language Binding
+-//!
+-//! These tests verify that the UNO binding works correctly with the
+-//! actual LibreOffice UNO components through FFI/C interop.
+-//!
+-//! **Note**: Rust-side unit tests (traits, constructors, etc.) are located
+-//! in separate test files like `string_tests.rs`.
+-//!
+-//! # Test Coverage
+-//!
+-//! ## Core FFI Functionality Tests
+-//! - `test_xtest_interface_creation()` - Basic interface instantiation
+-//! - `test_boolean_operations()` - Boolean data type FFI handling (both true/false)
+-//! - `test_integer_operations()` - Signed integer types FFI with wrong values
+-//! - `test_unsigned_integer_operations()` - Unsigned integer types FFI with wrong values
+-//! - `test_64bit_operations()` - 64-bit integer types FFI with wrong values
+-//! - `test_floating_point_operations()` - Float and double types FFI with wrong values
+-//! - `test_char_operations()` - Unicode character FFI handling with wrong values
+-//! - `test_string_operations()` - OUString FFI handling with UNO components
+-//! - `test_type_operations()` - UNO Type FFI interop with C++ components
+-//! - `test_rust_type_creation()` - Rust Type wrapper construction and basic operations
+-//! - `test_type_assignment_compatibility()` - Type assignment compatibility testing
+-//! - `test_type_cloning_and_memory()` - Type cloning and memory management validation
+-//!
+-//! ## Comprehensive UNO Component Validation Tests
+-//! - `test_wrong_values_comprehensive()` - Extensive wrong value testing for all data types
+-//! - `test_edge_cases_and_boundary_values()` - Boundary conditions and special values
+-//! - `test_consistency_across_multiple_calls()` - Stability and consistency verification
+-//! - `test_all_operations_comprehensive()` - Cross-functional integration testing
+-//!
+-//! ## Test Strategy
+-//! Each FFI function is tested with:
+-//! - Correct expected values (should return true)
+-//! - Multiple wrong values (should return false)
+-//! - Boundary values and edge cases
+-//! - Consistency across multiple calls
+-//!
+-//! This ensures robust validation of the UNO binding's FFI data type handling
+-//! and error detection capabilities with actual UNO components.
+-
+-use crate::ffi::rtl_string::rtl_uString;
+-use crate::ffi::sal_types::*;
+-use crate::ffi::type_ffi::typelib_TypeDescriptionReference;
+-use crate::core::{OUString, Type, typelib_TypeClass};
+-
+-// === FFI Declarations for Test Functions ===
+-#[allow(unused)]
+-unsafe extern "C" {
+-    /// Print a greeting message from the UNO test component
+-    pub fn xtest_hello();
+-
+-    /// Get a boolean value from UNO test component (always returns true)
+-    pub fn xtest_getBoolean() -> sal_Bool;
+-
+-    /// Test if a boolean value matches the expected UNO boolean
+-    pub fn xtest_isBoolean(value: sal_Bool) -> sal_Bool;
+-
+-    /// Get a byte value from UNO test component (always returns -12)
+-    pub fn xtest_getByte() -> sal_Int8;
+-
+-    /// Test if a byte value matches the expected UNO byte (-12)
+-    pub fn xtest_isByte(value: sal_Int8) -> sal_Bool;
+-
+-    /// Get a short value from UNO test component (always returns -1234)
+-    pub fn xtest_getShort() -> sal_Int16;
+-
+-    /// Test if a short value matches the expected UNO short (-1234)
+-    pub fn xtest_isShort(value: sal_Int16) -> sal_Bool;
+-
+-    /// Get a long value from UNO test component (always returns -123456)
+-    pub fn xtest_getLong() -> sal_Int32;
+-
+-    /// Test if a long value matches the expected UNO long (-123456)
+-    pub fn xtest_isLong(value: sal_Int32) -> sal_Bool;
+-
+-    /// Get an unsigned short value from UNO test component (always returns 54321)
+-    pub fn xtest_getUnsignedShort() -> sal_uInt16;
+-
+-    /// Test if an unsigned short value matches the expected UNO unsigned short (54321)
+-    pub fn xtest_isUnsignedShort(value: sal_uInt16) -> sal_Bool;
+-
+-    /// Get an unsigned long value from UNO test component (always returns 3456789012)
+-    pub fn xtest_getUnsignedLong() -> sal_uInt32;
+-
+-    /// Test if an unsigned long value matches the expected UNO unsigned long (3456789012)
+-    pub fn xtest_isUnsignedLong(value: sal_uInt32) -> sal_Bool;
+-
+-    /// Get a hyper (64-bit) value from UNO test component (always returns -123456789)
+-    pub fn xtest_getHyper() -> sal_Int64;
+-
+-    /// Test if a hyper value matches the expected UNO hyper (-123456789)
+-    pub fn xtest_isHyper(value: sal_Int64) -> sal_Bool;
+-
+-    /// Get an unsigned hyper (64-bit) value from UNO test component (always returns 9876543210)
+-    pub fn xtest_getUnsignedHyper() -> sal_uInt64;
+-
+-    /// Test if an unsigned hyper value matches the expected UNO unsigned hyper (9876543210)
+-    pub fn xtest_isUnsignedHyper(value: sal_uInt64) -> sal_Bool;
+-
+-    /// Get a float value from UNO test component (always returns -10.25)
+-    pub fn xtest_getFloat() -> f32;
+-
+-    /// Test if a float value matches the expected UNO float (-10.25)
+-    pub fn xtest_isFloat(value: f32) -> sal_Bool;
+-
+-    /// Get a double value from UNO test component (always returns 100.5)
+-    pub fn xtest_getDouble() -> f64;
+-
+-    /// Test if a double value matches the expected UNO double (100.5)
+-    pub fn xtest_isDouble(value: f64) -> sal_Bool;
+-
+-    /// Test if a character value matches the expected UNO character ('Ö')
+-    pub fn xtest_isChar(value: sal_Unicode) -> sal_Bool;
+-
+-    /// Get a character value from UNO test component (always returns 'Ö')
+-    pub fn xtest_getChar() -> sal_Unicode;
+-
+-    /// Get a string value from UNO test component - returns pointer to rtl_uString
+-    pub fn xtest_getString() -> *mut rtl_uString;
+-
+-    /// Test if a string value matches the expected string ("hä") - takes pointer to rtl_uString
+-    pub fn xtest_isString(value: *mut rtl_uString) -> sal_Bool;
+-
+-    /// Get a Type value from UNO test component - returns pointer to typelib_TypeDescriptionReference
+-    pub fn xtest_getType() -> *mut typelib_TypeDescriptionReference;
+-
+-    /// Test if a Type value matches the expected Type (cppu::UnoType<sal_Int32>) - takes pointer to typelib_TypeDescriptionReference
+-    pub fn xtest_isType(value: *mut typelib_TypeDescriptionReference) -> sal_Bool;
+-}
+-
+-// === Test Interface Wrapper ===
+-
+-/// Rust wrapper for the XTest UNO interface (TEST ONLY)
+-///
+-/// This interface provides methods for testing basic UNO data types
+-/// and serves as a demonstration of the Rust UNO binding functionality.
+-///
+-/// **Note**: This is a test interface, not part of the core UNO API.
+-pub struct XTest;
+-
+-#[allow(unused)]
+-impl XTest {
+-    /// Create a new XTest interface instance
+-    pub fn new() -> Self {
+-        XTest
+-    }
+-
+-    /// Print a greeting message from the UNO component
+-    pub fn hello(&self) {
+-        unsafe {
+-            xtest_hello();
+-        }
+-    }
+-
+-    /// Get a boolean value from UNO
+-    pub fn get_boolean(&self) -> bool {
+-        unsafe {
+-            let result = xtest_getBoolean();
+-            result != 0
+-        }
+-    }
+-
+-    /// Test if a boolean value matches the expected UNO boolean
+-    pub fn is_boolean(&self, value: bool) -> bool {
+-        unsafe {
+-            let sal_value = if value { 1 } else { 0 };
+-            let result = xtest_isBoolean(sal_value);
+-            result != 0
+-        }
+-    }
+-
+-    /// Get a byte value from UNO
+-    pub fn get_byte(&self) -> i8 {
+-        unsafe { xtest_getByte() }
+-    }
+-
+-    /// Test if a byte value matches the expected UNO byte
+-    pub fn is_byte(&self, value: i8) -> bool {
+-        unsafe {
+-            let result = xtest_isByte(value);
+-            result != 0
+-        }
+-    }
+-
+-    /// Get a short value from UNO
+-    pub fn get_short(&self) -> i16 {
+-        unsafe { xtest_getShort() }
+-    }
+-
+-    /// Test if a short value matches the expected UNO short
+-    pub fn is_short(&self, value: i16) -> bool {
+-        unsafe {
+-            let result = xtest_isShort(value);
+-            result != 0
+-        }
+-    }
+-
+-    /// Get a long value from UNO
+-    pub fn get_long(&self) -> i32 {
+-        unsafe { xtest_getLong() }
+-    }
+-
+-    /// Test if a long value matches the expected UNO long
+-    pub fn is_long(&self, value: i32) -> bool {
+-        unsafe {
+-            let result = xtest_isLong(value);
+-            result != 0
+-        }
+-    }
+-
+-    /// Get an unsigned short value from UNO
+-    pub fn get_unsigned_short(&self) -> u16 {
+-        unsafe { xtest_getUnsignedShort() }
+-    }
+-
+-    /// Test if an unsigned short value matches the expected UNO unsigned short
+-    pub fn is_unsigned_short(&self, value: u16) -> bool {
+-        unsafe {
+-            let result = xtest_isUnsignedShort(value);
+-            result != 0
+-        }
+-    }
+-
+-    /// Get an unsigned long value from UNO
+-    pub fn get_unsigned_long(&self) -> u32 {
+-        unsafe { xtest_getUnsignedLong() }
+-    }
+-
+-    /// Test if an unsigned long value matches the expected UNO unsigned long
+-    pub fn is_unsigned_long(&self, value: u32) -> bool {
+-        unsafe {
+-            let result = xtest_isUnsignedLong(value);
+-            result != 0
+-        }
+-    }
+-
+-    /// Get a hyper (64-bit) value from UNO
+-    pub fn get_hyper(&self) -> i64 {
+-        unsafe { xtest_getHyper() }
+-    }
+-
+-    /// Test if a hyper value matches the expected UNO hyper
+-    pub fn is_hyper(&self, value: i64) -> bool {
+-        unsafe {
+-            let result = xtest_isHyper(value);
+-            result != 0
+-        }
+-    }
+-
+-    /// Get an unsigned hyper (64-bit) value from UNO
+-    pub fn get_unsigned_hyper(&self) -> u64 {
+-        unsafe { xtest_getUnsignedHyper() }
+-    }
+-
+-    /// Test if an unsigned hyper value matches the expected UNO unsigned hyper
+-    pub fn is_unsigned_hyper(&self, value: u64) -> bool {
+-        unsafe {
+-            let result = xtest_isUnsignedHyper(value);
+-            result != 0
+-        }
+-    }
+-
+-    /// Get a float value from UNO
+-    pub fn get_float(&self) -> f32 {
+-        unsafe { xtest_getFloat() }
+-    }
+-
+-    /// Test if a float value matches the expected UNO float
+-    pub fn is_float(&self, value: f32) -> bool {
+-        unsafe {
+-            let result = xtest_isFloat(value);
+-            result != 0
+-        }
+-    }
+-
+-    /// Get a double value from UNO
+-    pub fn get_double(&self) -> f64 {
+-        unsafe { xtest_getDouble() }
+-    }
+-
+-    /// Test if a double value matches the expected UNO double
+-    pub fn is_double(&self, value: f64) -> bool {
+-        unsafe {
+-            let result = xtest_isDouble(value);
+-            result != 0
+-        }
+-    }
+-    /// Get a char value from UNO
+-    pub fn get_char(&self) -> sal_Unicode {
+-        unsafe { xtest_getChar() }
+-    }
+-
+-    /// Test if a char value matches the expected UNO char
+-    pub fn is_char(&self, value: sal_Unicode) -> bool {
+-        unsafe {
+-            let result = xtest_isChar(value);
+-            result != 0
+-        }
+-    }
+-
+-    /// Get a string value from UNO
+-    pub fn get_string(&self) -> OUString {
+-        unsafe {
+-            let result = xtest_getString();
+-            OUString::from_raw(result)
+-        }
+-    }
+-
+-    /// Test if a string value matches the expected UNO string
+-    pub fn is_string(&self, value: OUString) -> bool {
+-        unsafe {
+-            let result = xtest_isString(value.into_raw());
+-            result != 0
+-        }
+-    }
+-
+-    /// Get a Type value from UNO (returns cppu::UnoType<sal_Int32>)
+-    pub fn get_type(&self) -> Type {
+-        unsafe { Type::from_typelib_ref_no_acquire(xtest_getType()) }
+-    }
+-
+-    /// Test if a Type value matches the expected UNO Type
+-    ///
+-    /// Note: This test uses raw pointers for C++ Type interop.
+-    /// For Rust Type instances, use direct comparison methods.
+-    pub fn is_type(&self, cpp_type: Type) -> bool {
+-        unsafe {
+-            let result = xtest_isType(cpp_type.into_raw());
+-            result != 0
+-        }
+-    }
+-}
+-
+-impl Default for XTest {
+-    fn default() -> Self {
+-        Self::new()
+-    }
+-}
+-
+-// === Integration Tests ===
+-
+-#[test]
+-fn test_xtest_interface_creation() {
+-    let xtest = XTest::new();
+-    // Test that we can create the interface without panicking
+-    xtest.hello(); // This should print a message
+-}
+-
+-#[test]
+-fn test_boolean_operations() {
+-    let xtest = XTest::new();
+-
+-    // Test getBoolean
+-    let result = xtest.get_boolean();
+-    assert!(result, "getBoolean should return true");
+-
+-    // Test isBoolean with true
+-    let is_true = xtest.is_boolean(true);
+-    assert!(is_true, "isBoolean(true) should return true");
+-
+-    // Test isBoolean with false
+-    let is_false = xtest.is_boolean(false);
+-    assert!(!is_false, "isBoolean(false) should return false");
+-}
+-
+-#[test]
+-fn test_integer_operations() {
+-    let xtest = XTest::new();
+-
+-    // Test byte operations
+-    let byte_val = xtest.get_byte();
+-    assert_eq!(byte_val, -12, "getByte should return -12");
+-
+-    let is_byte = xtest.is_byte(-12);
+-    assert!(is_byte, "isByte(-12) should return true");
+-
+-    let is_wrong_byte = xtest.is_byte(0);
+-    assert!(!is_wrong_byte, "isByte(0) should return false");
+-
+-    // Test short operations
+-    let short_val = xtest.get_short();
+-    assert_eq!(short_val, -1234, "getShort should return -1234");
+-
+-    let is_short = xtest.is_short(-1234);
+-    assert!(is_short, "isShort(-1234) should return true");
+-
+-    let is_wrong_short = xtest.is_short(0);
+-    assert!(!is_wrong_short, "isShort(0) should return false");
+-
+-    // Test long operations
+-    let long_val = xtest.get_long();
+-    assert_eq!(long_val, -123456, "getLong should return -123456");
+-
+-    let is_long = xtest.is_long(-123456);
+-    assert!(is_long, "isLong(-123456) should return true");
+-
+-    let is_wrong_long = xtest.is_long(0);
+-    assert!(!is_wrong_long, "isLong(0) should return false");
+-}
+-
+-#[test]
+-fn test_unsigned_integer_operations() {
+-    let xtest = XTest::new();
+-
+-    // Test unsigned short operations
+-    let ushort_val = xtest.get_unsigned_short();
+-    assert_eq!(ushort_val, 54321, "getUnsignedShort should return 54321");
+-
+-    let is_ushort = xtest.is_unsigned_short(54321);
+-    assert!(is_ushort, "isUnsignedShort(54321) should return true");
+-
+-    let is_wrong_ushort = xtest.is_unsigned_short(0);
+-    assert!(!is_wrong_ushort, "isUnsignedShort(0) should return false");
+-
+-    // Test unsigned long operations
+-    let ulong_val = xtest.get_unsigned_long();
+-    assert_eq!(
+-        ulong_val, 3456789012,
+-        "getUnsignedLong should return 3456789012"
+-    );
+-
+-    let is_ulong = xtest.is_unsigned_long(3456789012);
+-    assert!(is_ulong, "isUnsignedLong(3456789012) should return true");
+-
+-    let is_wrong_ulong = xtest.is_unsigned_long(0);
+-    assert!(!is_wrong_ulong, "isUnsignedLong(0) should return false");
+-}
+-
+-#[test]
+-fn test_64bit_operations() {
+-    let xtest = XTest::new();
+-
+-    // Test hyper operations
+-    let hyper_val = xtest.get_hyper();
+-    assert_eq!(hyper_val, -123456789, "getHyper should return -123456789");
+-
+-    let is_hyper = xtest.is_hyper(-123456789);
+-    assert!(is_hyper, "isHyper(-123456789) should return true");
+-
+-    let is_wrong_hyper = xtest.is_hyper(0);
+-    assert!(!is_wrong_hyper, "isHyper(0) should return false");
+-
+-    // Test unsigned hyper operations
+-    let uhyper_val = xtest.get_unsigned_hyper();
+-    assert_eq!(
+-        uhyper_val, 9876543210,
+-        "getUnsignedHyper should return 9876543210"
+-    );
+-
+-    let is_uhyper = xtest.is_unsigned_hyper(9876543210);
+-    assert!(is_uhyper, "isUnsignedHyper(9876543210) should return true");
+-
+-    let is_wrong_uhyper = xtest.is_unsigned_hyper(0);
+-    assert!(!is_wrong_uhyper, "isUnsignedHyper(0) should return false");
+-}
+-
+-#[test]
+-fn test_floating_point_operations() {
+-    let xtest = XTest::new();
+-
+-    // Test float operations
+-    let float_val = xtest.get_float();
+-    assert_eq!(float_val, -10.25, "getFloat should return -10.25");
+-
+-    let is_float = xtest.is_float(-10.25);
+-    assert!(is_float, "isFloat(-10.25) should return true");
+-
+-    let is_wrong_float = xtest.is_float(0.0);
+-    assert!(!is_wrong_float, "isFloat(0.0) should return false");
+-
+-    // Test double operations
+-    let double_val = xtest.get_double();
+-    assert_eq!(double_val, 100.5, "getDouble should return 100.5");
+-
+-    let is_double = xtest.is_double(100.5);
+-    assert!(is_double, "isDouble(100.5) should return true");
+-
+-    let is_wrong_double = xtest.is_double(0.0);
+-    assert!(!is_wrong_double, "isDouble(0.0) should return false");
+-}
+-
+-#[test]
+-fn test_char_operations() {
+-    let xtest = XTest::new();
+-
+-    // Test char operations - 'Ö' is Unicode codepoint U+00D6 (214)
+-    let char_val = xtest.get_char();
+-    assert_eq!(
+-        char_val, 214u16,
+-        "getChar should return 214 (Unicode for 'Ö')"
+-    );
+-
+-    let is_char = xtest.is_char(214u16);
+-    assert!(is_char, "isChar(214) should return true");
+-
+-    let is_wrong_char = xtest.is_char(65u16); // 'A'
+-    assert!(!is_wrong_char, "isChar(65) should return false");
+-}
+-
+-#[test]
+-fn test_string_operations() {
+-    let xtest = XTest::new();
+-
+-    // Test string operations - expected value is "hä"
+-    let string_val = xtest.get_string();
+-    assert_eq!(string_val.to_string(), "hä", "getString should return 'hä'");
+-
+-    // Test string validation with correct value
+-    let test_string = OUString::from_utf8("hä");
+-    let is_string = xtest.is_string(test_string);
+-    assert!(is_string, "isString('hä') should return true");
+-
+-    // Test string validation with wrong value
+-    let wrong_string = OUString::from_utf8("wrong");
+-    let is_wrong_string = xtest.is_string(wrong_string);
+-    assert!(!is_wrong_string, "isString('wrong') should return false");
+-}
+-
+-#[test]
+-fn test_type_operations() {
+-    let xtest = XTest::new();
+-
+-    // Test getting a Type value from C++ component
+-    let cpp_type = xtest.get_type();
+-    // Test that we got a valid Type (non-void type in this case)
+-    assert_ne!(
+-        cpp_type.get_type_class(),
+-        typelib_TypeClass::typelib_TypeClass_VOID,
+-        "C++ Type should not be void type"
+-    );
+-    println!("Got C++ Type: {:?}", cpp_type);
+-
+-    // Test that the returned Type matches the expected Type (cppu::UnoType<sal_Int32>)
+-    let is_correct = xtest.is_type(cpp_type);
+-    assert!(is_correct, "C++ Type should match expected sal_Int32 type");
+-}
+-
+-#[test]
+-fn test_wrong_values_comprehensive() {
+-    let xtest = XTest::new();
+-
+-    // Test multiple wrong values for each function to ensure robust validation
+-
+-    // Test multiple wrong byte values
+-    let is_wrong_byte1 = xtest.is_byte(100);
+-    assert!(!is_wrong_byte1, "isByte(100) should return false");
+-
+-    let is_wrong_byte2 = xtest.is_byte(-100);
+-    assert!(!is_wrong_byte2, "isByte(-100) should return false");
+-
+-    // Test multiple wrong short values
+-    let is_wrong_short1 = xtest.is_short(1000);
+-    assert!(!is_wrong_short1, "isShort(1000) should return false");
+-
+-    let is_wrong_short2 = xtest.is_short(-5000);
+-    assert!(!is_wrong_short2, "isShort(-5000) should return false");
+-
+-    // Test multiple wrong long values
+-    let is_wrong_long1 = xtest.is_long(999999);
+-    assert!(!is_wrong_long1, "isLong(999999) should return false");
+-
+-    let is_wrong_long2 = xtest.is_long(-999999);
+-    assert!(!is_wrong_long2, "isLong(-999999) should return false");
+-
+-    // Test multiple wrong unsigned short values
+-    let is_wrong_ushort1 = xtest.is_unsigned_short(12345);
+-    assert!(
+-        !is_wrong_ushort1,
+-        "isUnsignedShort(12345) should return false"
+-    );
+-
+-    let is_wrong_ushort2 = xtest.is_unsigned_short(65535);
+-    assert!(
+-        !is_wrong_ushort2,
+-        "isUnsignedShort(65535) should return false"
+-    );
+-
+-    // Test multiple wrong unsigned long values
+-    let is_wrong_ulong1 = xtest.is_unsigned_long(1234567890);
+-    assert!(
+-        !is_wrong_ulong1,
+-        "isUnsignedLong(1234567890) should return false"
+-    );
+-
+-    let is_wrong_ulong2 = xtest.is_unsigned_long(4294967295);
+-    assert!(
+-        !is_wrong_ulong2,
+-        "isUnsignedLong(4294967295) should return false"
+-    );
+-
+-    // Test multiple wrong hyper values
+-    let is_wrong_hyper1 = xtest.is_hyper(987654321);
+-    assert!(!is_wrong_hyper1, "isHyper(987654321) should return false");
+-
+-    let is_wrong_hyper2 = xtest.is_hyper(-987654321);
+-    assert!(!is_wrong_hyper2, "isHyper(-987654321) should return false");
+-
+-    // Test multiple wrong unsigned hyper values
+-    let is_wrong_uhyper1 = xtest.is_unsigned_hyper(1234567890);
+-    assert!(
+-        !is_wrong_uhyper1,
+-        "isUnsignedHyper(1234567890) should return false"
+-    );
+-
+-    let is_wrong_uhyper2 = xtest.is_unsigned_hyper(18446744073709551615);
+-    assert!(
+-        !is_wrong_uhyper2,
+-        "isUnsignedHyper(18446744073709551615) should return false"
+-    );
+-
+-    // Test multiple wrong float values
+-    let is_wrong_float1 = xtest.is_float(std::f32::consts::PI);
+-    assert!(!is_wrong_float1, "isFloat(3.14159) should return false");
+-
+-    let is_wrong_float2 = xtest.is_float(-99.99);
+-    assert!(!is_wrong_float2, "isFloat(-99.99) should return false");
+-
+-    // Test multiple wrong double values
+-    let is_wrong_double1 = xtest.is_double(std::f64::consts::E);
+-    assert!(!is_wrong_double1, "isDouble(2.71828) should return false");
+-
+-    let is_wrong_double2 = xtest.is_double(-200.75);
+-    assert!(!is_wrong_double2, "isDouble(-200.75) should return false");
+-
+-    // Test multiple wrong char values
+-    let is_wrong_char1 = xtest.is_char(72u16); // 'H'
+-    assert!(!is_wrong_char1, "isChar(72) should return false");
+-
+-    let is_wrong_char2 = xtest.is_char(8364u16); // Euro symbol '€'
+-    assert!(!is_wrong_char2, "isChar(8364) should return false");
+-}
+-
+-#[test]
+-fn test_all_operations_comprehensive() {
+-    let xtest = XTest::new();
+-
+-    // This test verifies that all methods work together
+-    // and the component maintains state correctly
+-
+-    // Test multiple calls to the same method
+-    let bool1 = xtest.get_boolean();
+-    let bool2 = xtest.get_boolean();
+-    assert_eq!(
+-        bool1, bool2,
+-        "Multiple calls to getBoolean should return same value"
+-    );
+-
+-    // Test that different data types work independently
+-    let _byte_val = xtest.get_byte();
+-    let _short_val = xtest.get_short();
+-    let _long_val = xtest.get_long();
+-    let _float_val = xtest.get_float();
+-    let _double_val = xtest.get_double();
+-
+-    // Verify boolean still works after other operations
+-    let bool3 = xtest.get_boolean();
+-    assert_eq!(bool1, bool3, "Boolean operations should be consistent");
+-}
+-
+-#[test]
+-fn test_edge_cases_and_boundary_values() {
+-    let xtest = XTest::new();
+-
+-    // Test edge cases for each data type to ensure robust handling
+-
+-    // Test maximum and minimum values for signed integers
+-    let is_max_byte = xtest.is_byte(i8::MAX);
+-    assert!(!is_max_byte, "isByte(i8::MAX) should return false");
+-
+-    let is_min_byte = xtest.is_byte(i8::MIN);
+-    assert!(!is_min_byte, "isByte(i8::MIN) should return false");
+-
+-    let is_max_short = xtest.is_short(i16::MAX);
+-    assert!(!is_max_short, "isShort(i16::MAX) should return false");
+-
+-    let is_min_short = xtest.is_short(i16::MIN);
+-    assert!(!is_min_short, "isShort(i16::MIN) should return false");
+-
+-    let is_max_long = xtest.is_long(i32::MAX);
+-    assert!(!is_max_long, "isLong(i32::MAX) should return false");
+-
+-    let is_min_long = xtest.is_long(i32::MIN);
+-    assert!(!is_min_long, "isLong(i32::MIN) should return false");
+-
+-    // Test maximum values for unsigned integers
+-    let is_max_ushort = xtest.is_unsigned_short(u16::MAX);
+-    assert!(
+-        !is_max_ushort,
+-        "isUnsignedShort(u16::MAX) should return false"
+-    );
+-
+-    let is_max_ulong = xtest.is_unsigned_long(u32::MAX);
+-    assert!(
+-        !is_max_ulong,
+-        "isUnsignedLong(u32::MAX) should return false"
+-    );
+-
+-    // Test edge cases for 64-bit integers
+-    let is_max_hyper = xtest.is_hyper(i64::MAX);
+-    assert!(!is_max_hyper, "isHyper(i64::MAX) should return false");
+-
+-    let is_min_hyper = xtest.is_hyper(i64::MIN);
+-    assert!(!is_min_hyper, "isHyper(i64::MIN) should return false");
+-
+-    let is_max_uhyper = xtest.is_unsigned_hyper(u64::MAX);
+-    assert!(
+-        !is_max_uhyper,
+-        "isUnsignedHyper(u64::MAX) should return false"
+-    );
+-
+-    // Test floating point edge cases
+-    let is_infinity = xtest.is_float(f32::INFINITY);
+-    assert!(!is_infinity, "isFloat(INFINITY) should return false");
+-
+-    let is_neg_infinity = xtest.is_float(f32::NEG_INFINITY);
+-    assert!(
+-        !is_neg_infinity,
+-        "isFloat(NEG_INFINITY) should return false"
+-    );
+-
+-    let is_double_infinity = xtest.is_double(f64::INFINITY);
+-    assert!(
+-        !is_double_infinity,
+-        "isDouble(INFINITY) should return false"
+-    );
+-
+-    let is_double_neg_infinity = xtest.is_double(f64::NEG_INFINITY);
+-    assert!(
+-        !is_double_neg_infinity,
+-        "isDouble(NEG_INFINITY) should return false"
+-    );
+-
+-    // Test special Unicode characters
+-    let is_null_char = xtest.is_char(0u16); // Null character
+-    assert!(!is_null_char, "isChar(0) should return false");
+-
+-    let is_high_unicode = xtest.is_char(0xFFFF); // Maximum Unicode BMP
+-    assert!(!is_high_unicode, "isChar(0xFFFF) should return false");
+-
+-    // Test empty and special strings
+-    let empty_string = OUString::from_utf8("");
+-    let is_empty_string = xtest.is_string(empty_string);
+-    assert!(!is_empty_string, "isString(\"\") should return false");
+-
+-    let unicode_string = OUString::from_utf8("🦀"); // Rust crab emoji
+-    let is_unicode_string = xtest.is_string(unicode_string);
+-    assert!(!is_unicode_string, "isString(\"🦀\") should return false");
+-}
+-
+-#[test]
+-fn test_consistency_across_multiple_calls() {
+-    let xtest = XTest::new();
+-
+-    // Test that all getter functions return consistent values across multiple calls
+-
+-    // Test consistency for all data types
+-    for _ in 0..5 {
+-        // Boolean consistency
+-        let bool_val = xtest.get_boolean();
+-        assert!(bool_val, "getBoolean should always return true");
+-
+-        // Integer consistency
+-        let byte_val = xtest.get_byte();
+-        assert_eq!(byte_val, -12, "getByte should always return -12");
+-
+-        let short_val = xtest.get_short();
+-        assert_eq!(short_val, -1234, "getShort should always return -1234");
+-
+-        let long_val = xtest.get_long();
+-        assert_eq!(long_val, -123456, "getLong should always return -123456");
+-
+-        // Unsigned integer consistency
+-        let ushort_val = xtest.get_unsigned_short();
+-        assert_eq!(
+-            ushort_val, 54321,
+-            "getUnsignedShort should always return 54321"
+-        );
+-
+-        let ulong_val = xtest.get_unsigned_long();
+-        assert_eq!(
+-            ulong_val, 3456789012,
+-            "getUnsignedLong should always return 3456789012"
+-        );
+-
+-        // 64-bit consistency
+-        let hyper_val = xtest.get_hyper();
+-        assert_eq!(
+-            hyper_val, -123456789,
+-            "getHyper should always return -123456789"
+-        );
+-
+-        let uhyper_val = xtest.get_unsigned_hyper();
+-        assert_eq!(
+-            uhyper_val, 9876543210,
+-            "getUnsignedHyper should always return 9876543210"
+-        );
+-
+-        // Floating point consistency
+-        let float_val = xtest.get_float();
+-        assert_eq!(float_val, -10.25, "getFloat should always return -10.25");
+-
+-        let double_val = xtest.get_double();
+-        assert_eq!(double_val, 100.5, "getDouble should always return 100.5");
+-
+-        // Character consistency
+-        let char_val = xtest.get_char();
+-        assert_eq!(char_val, 214u16, "getChar should always return 214");
+-
+-        // String consistency
+-        let string_val = xtest.get_string();
+-        assert_eq!(
+-            string_val.to_string(),
+-            "hä",
+-            "getString should always return 'hä'"
+-        );
+-    }
+-}
+-
+-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
+-- 
+2.47.3
+
diff --git a/patches/rust-uno-DEB_CARGO_CRATE.diff b/patches/rust-uno-DEB_CARGO_CRATE.diff
new file mode 100644
index 000000000..1204ba709
--- /dev/null
+++ b/patches/rust-uno-DEB_CARGO_CRATE.diff
@@ -0,0 +1,12 @@
+diff --git a/rust_uno/CustomTarget_cargo.mk b/rust_uno/CustomTarget_cargo.mk
+index d27ec0b0797a..6a313c75beba 100644
+--- a/rust_uno/CustomTarget_cargo.mk
++++ b/rust_uno/CustomTarget_cargo.mk
+@@ -13,6 +13,6 @@ $(eval $(call gb_CustomTarget_CustomTarget,rust_uno/cargo))
+ $(call gb_CustomTarget_get_target,rust_uno/cargo): \
+         $(call gb_Library_get_target,rust_uno-cpp) \
+         $(gb_CustomTarget_workdir)/rust_uno/rustmaker/cpp
+-	cd $(SRCDIR)/rust_uno && cargo build $(if $(verbose),--verbose,) --release
++	cd $(SRCDIR)/rust_uno && export DEB_CARGO_CRATE=rust-uno_$(shell grep version rust_uno/Cargo.toml | awk '{ print $$3 }' | sed -e s/\"//g); cargo build $(if $(verbose),--verbose,) --release
+ 
+ # vim: set noet sw=4 ts=4:
diff --git a/patches/series b/patches/series
index 0c05c96c1..87222238c 100644
--- a/patches/series
+++ b/patches/series
@@ -49,6 +42,11 @@ pdfium-ports.diff
 jdk-minimal-and-zero-paths.diff
 #fix-32bits-test-build.diff
 disable-uitest-xmlsecurity-gpg.diff
-apparmor-allow-local-override.diff
-apparmor-thunderbird.diff
-poppler-25.10.diff
+system-crates.diff
+we-rely-on-dicts-as-non-extensions-in-checks.diff
+fix-rust_uno-example-link.diff
+fix-rust_uno-path-for-cargo-wrapper.diff
+rust-uno-DEB_CARGO_CRATE.diff
+cargo-build-flag.diff
+#strict-firebird-api-version-check.diff
+fix-rust_uno-test.diff
diff --git a/patches/system-crates.diff b/patches/system-crates.diff
new file mode 100644
index 000000000..a3b590c5b
--- /dev/null
+++ b/patches/system-crates.diff
@@ -0,0 +1,89 @@
+--- a/configure.ac-old	2025-09-13 12:16:00.149332314 +0200
++++ b/configure.ac	2025-09-13 12:18:08.454597162 +0200
+@@ -2909,10 +2909,28 @@
+         [Enables very experimental experiments.]),[
+     WITH_YRS=$withval
+     if test "x$withval" != "xno"; then
+-        BUILD_TYPE="${BUILD_TYPE} YRS"
++        if test "$with_system_yrs" = "yes"; then
++            SYSTEM_YRS=TRUE
++        else
++            BUILD_TYPE="${BUILD_TYPE} YRS"
++        fi
+         AC_DEFINE(ENABLE_YRS)
+     fi])
+ AC_SUBST(WITH_YRS)
++AC_SUBST(SYSTEM_YRS)
++
++# call it yrs even though the crate is built is yffi. But it's clearer
++# that way that it belongs to the above --with-yrs
++AC_ARG_WITH(system-yrs,
++    AS_HELP_STRING([--with-system-yrs],
++        [Use yrs/yffi crates already on system]),,
++    [with_system_yrs="$with_system_crates"])
++
++AC_ARG_WITH(system-crates,
++    AS_HELP_STRING([--without-system-crates],
++        [When building with --with-system-libs, also the needed crates are expected
++         on the system. Use this to disable that]),,
++    [with_system_crates="$with_system_libs"])
+ 
+ AC_ARG_WITH(perl-home,
+     AS_HELP_STRING([--with-perl-home=<abs. path to Perl 5 home>],
+diff --git a/config_host.mk.in b/config_host.mk.in
+index 9b7a7a747e2d..4e1fc5d128cc 100644
+--- a/config_host.mk.in
++++ b/config_host.mk.in
+@@ -732,6 +741,7 @@ SYSTEM_WPD=@SYSTEM_WPD@
+ SYSTEM_WPG=@SYSTEM_WPG@
+ SYSTEM_WPS=@SYSTEM_WPS@
+ SYSTEM_XMLSEC=@SYSTEM_XMLSEC@
++SYSTEM_YRS=@SYSTEM_YRS@
+ SYSTEM_ZLIB=@SYSTEM_ZLIB@
+ SYSTEM_ZSTD=@SYSTEM_ZSTD@
+ SYSTEM_ZMF=@SYSTEM_ZMF@
+diff --git a/Makefile.fetch b/Makefile.fetch
+index 239fcc01753f..1175e65cee70 100644
+--- a/Makefile.fetch
++++ b/Makefile.fetch
+@@ -252,8 +252,10 @@ $(WORKDIR)/download: $(BUILDDIR)/config_$(gb_Side).mk $(SRCDIR)/download.lst $(S
+ 		$(call fetch_Optional,OFFICEOTRON,OFFICEOTRON_JAR) \
+ 	,$(call fetch_Download_item,https://dev-www.libreoffice.org/extern,$(item)))
+ 	-@mkdir -p $(TARFILE_LOCATION)/cargo
++	$(if $(filter TRUE,$(SYSTEM_YRS)), \
+ 	$(if $(call fetch_Optional,YRS,1),\
+-		CARGO_HOME=$(TARFILE_LOCATION)/cargo cargo fetch $(if $(verbose),--verbose,) --locked --manifest-path $(SRCDIR)/external/y-crdt/Cargo.toml)
++		CARGO_HOME=$(TARFILE_LOCATION)/cargo cargo fetch $(if $(verbose),--verbose,) --locked --manifest-path $(SRCDIR)/external/y-crdt/Cargo.toml) \
++	)
+ 	@mkdir -p $(dir $@) && touch $@
+ 	@mkdir -p $(dir $@)/Executable
+ 
+diff --git a/RepositoryExternal.mk b/RepositoryExternal.mk
+index dce2138d1df2..a45fbea93f4a 100644
+--- a/RepositoryExternal.mk
++++ b/RepositoryExternal.mk
+@@ -4465,6 +4466,7 @@ endif
+ 
+ ifneq ($(WITH_YRS),)
+ 
++ifeq ($(SYSTEM_YRS),)
+ define gb_LinkTarget__use_yrs
+ $(call gb_LinkTarget_use_external_project,$(1),y-crdt)
+ $(call gb_LinkTarget_set_include,$(1),\
+@@ -4476,6 +4478,16 @@ endef
+ 
+ else
+ 
++define gb_LinkTarget__use_yrs
++$(call gb_LinkTarget_set_include,$(1),\
++	$$(INCLUDE) \
++)
++$(call gb_LinkTarget_add_libs,$(1),$(SRC_ROOT)/debian/cargo_registry/yffi/target/$(DEB_HOST_RUST_TYPE)/$(CARGO_CHANNEL)/libyrs.a)
++endef
++endif
++
++else
++
+ gb_LinkTarget__use_yrs :=
+ 
+ endif
diff --git a/rules b/rules
index 28c694bb6..9f644265e 100755
--- a/rules
+++ b/rules
@@ -243,6 +243,27 @@ endif
 endif
 SYSTEM_STUFF += xmlsec
 SYSTEM_STUFF += zxcvbn
+SYSTEM_STUFF += md4c
+SYSTEM_STUFF += fast-float
+
+ENABLE_EMBINDTEST_UNO=y
+
+ifeq (,$(filter $(DEB_HOST_ARCH),$(OOO_RUST_ARCHS)))
+  ENABLE_RUST=y
+  ifeq "$(ENABLE_RUST)" "y"
+    ENABLE_RUST_UNO=y
+    ifeq "$(ENABLE_RUST_UNO)" "y"
+	CONFIGURE_FLAGS += --enable-rust-uno
+	RUST_UNO_VERSION=$(shell grep version rust_uno/Cargo.toml | awk '{ print $$3 }' | sed -e s/\"//g)
+    endif
+    ENABLE_YRS=n
+  ifeq ($(filter upstream-cargo,$(DEB_BUILD_PROFILES)),)
+    SYSTEM_STUFF += yrs
+  endif
+  # FIXME: if not using yffi from the system yet maybe it might make sense to use that one internally
+  # and use the other libs from the system?
+  endif
+endif
 
 ifeq ($(filter noinsttest,$(DEB_BUILD_PROFILES)),)
  # this changes the packages built/contents of packages (-subsequentcheckbase)
@@ -522,6 +558,7 @@ ENABLE_LDAP=n
 ENABLE_PDFIUM=n
 USE_DBUS=n
 ENABLE_AVAHI=n
+ENABLE_RUST=n
 endif
 
 # Default flags to pass to configure
@@ -607,6 +644,7 @@ endif
 
 ifneq (terse,$(findstring terse,$(DEB_BUILD_OPTIONS)))
 export verbose=t
+CARGO_FLAGS += --verbose
 endif
 
 #############
@@ -732,6 +770,12 @@ $(eval $(call gen_no_archs,OOO_JAVA_ARCHS))
 OOO_CLI_ARCHS := amd64 arm64
 $(eval $(call gen_no_archs,OOO_CLI_ARCHS))
 
+# Rust
+# no riscv64, talks far too long to build the big file in /link the UNO bindings... Tried only
+# on ricci but probably  that would also happen on the buildds
+OOO_RUST_ARCHS := amd64 arm64 armel armhf i386 loong64 mips64el powerpc ppc64 ppc64el s390x sparc64
+$(eval $(call gen_no_archs,OOO_RUST_ARCHS))
+
 OOO_ARCH_DEP_EXTENSIONS_ARCHS := $(OOO_ARCHS)
 OOO_EXTENSIONS_ARCHS := $(OOO_ARCH_DEP_EXTENSIONS_ARCHS)
 
@@ -777,7 +821,7 @@ ifeq (,$(filter $(DEB_HOST_ARCH),$(OOO_JAVA_ARCHS)))
 endif
 
 ifneq "$(BUILD_TEST_PACKAGES)" "y"
-	DEBHELPER_OPTIONS += -Nlibreoffice-subsequentcheckbase -Nlibreoffice-smoketest-data
+	DEBHELPER_OPTIONS += -Nlibreoffice-subsequentcheckbase -Nlibreoffice-smoketest-data -Nlibreoffice-rust-uno-example
 else
 	BUILD_DEPS_INDEP += , junit4 $(JUNIT_MIN_VER) <!nojava>
 endif
@@ -815,6 +859,10 @@ endif
 ifeq "$(DEB_DISTRIBUTION)" "trixie-backports"
   BUGS=mailto:debian-backports@lists.debian.org
   TRIXIE_BACKPORT=y
+  # dependencies not there and no sense to backport getrandom/fastrand changes *and*
+  # completely new rust packages. Internal is no senseful alternative here (320M
+  # cargo dir...)
+  ENABLE_YRS=n
 endif
 
 # for t64
@@ -1178,7 +1226,11 @@ export DPKG_EXPORT_BUILDFLAGS=y
 include /usr/share/dpkg/buildflags.mk
 ifeq (debug,$(findstring debug,$(DEB_BUILD_OPTIONS)))
 	CONFIGURE_FLAGS += --enable-debug
+	export CARGO_CHANNEL := debug
+else
+	export CARGO_CHANNEL := release
 endif
+export CARGO_FLAGS = --$(CARGO_CHANNEL)
 ifeq (noopt,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
 	CONFIGURE_FLAGS += --disable-optimized
 endif
@@ -1593,11 +1652,45 @@ endif
 ifeq "$(BUILD_CAIROCANVAS)" "y"
   ifneq (,$(filter cairo, $(SYSTEM_STUFF)))
 	BUILD_DEPS+= , libcairo2-dev
+  else
+	BUILD_DEPS += , meson, ninja-build
   endif
 else
 	CONFIGURE_FLAGS+= --disable-cairo
 endif
 
+ifeq "$(ENABLE_EMBINDTEST_UNO)" "y"
+	CONFIGURE_FLAGS += --enable-embindtest-uno
+endif
+
+ifeq "$(ENABLE_RUST)" "y"
+	# for the include below this is explicit, otherwise cargo would get us this anyway
+	BUILD_DEPS += , rustc $(OOO_NO_RUST_ARCHS)
+include /usr/share/rustc/architecture.mk
+export DEB_HOST_RUST_TYPE DEB_HOST_GNU_TYPE
+	BUILD_DEPS += , cargo $(OOO_NO_RUST_ARCHS)
+# /usr/share/cargo/bin/cargo says: 
+# Make sure you add "Build-Depends: python3:native" if you use this directly.
+# If using this only indirectly via dh-cargo, then you only need "Build-Depends:
+# dh-cargo"; this is a general principle when declaring dependencies.
+	BUILD_DEPS += , python3 $(OOO_NO_RUST_ARCHS)
+    ifeq ($(filter upstream-cargo,$(DEB_BUILD_PROFILES)),)
+export PATH := /usr/share/cargo/bin:$(PATH)
+export CARGO=/usr/share/cargo/bin/cargo
+export CARGO_HOME=$(CURDIR)/debian/cargo_home
+   endif
+	BUILD_DEPS_ARCH += , dh-cargo $(OOO_NO_RUST_ARCHS)
+  ifeq "$(ENABLE_YRS)" "y"
+	CONFIGURE_FLAGS += --with-yrs
+    ifeq ($(filter upstream-cargo,$(DEB_BUILD_PROFILES)),)
+	CONFIGURE_FLAGS += --with-system-yrs
+	BUILD_DEPS_ARCH += , cbindgen $(OOO_NO_RUST_ARCHS) <!upstream-cargo>
+	BUILD_DEPS_ARCH += , librust-yffi-dev $(OOO_NO_RUST_ARCHS) <!upstream-cargo>
+	CARGO_PREPARE_DEBIAN_FLAGS += --link-from-system
+    endif
+  endif
+endif
+
 ifeq "$(ENABLE_KF5)" "y"
 	CONFIGURE_FLAGS += --enable-kf5
 	BUILD_DEPS_ARCH += , libkf5coreaddons-dev, libkf5i18n-dev, libkf5config-dev, libkf5windowsystem-dev, libkf5kio-dev
@@ -2081,6 +2176,11 @@ clean-debdir:
 
 	rm -rf $(CURDIR)/debian/locales
 
+ifeq "$(ENABLE_RUST)" "y"
+	rm -rf debian/cargo_home
+	rm -rf debian/cargo_registry
+endif
+
 	dh_clean
 
 clean:
@@ -2115,6 +2215,17 @@ endif
 		rm -f prism.js && \
 		rm -f prism.css
 
+ifeq "$(ENABLE_RUST)" "y"
+  ifeq "$(ENABLE_YRS)" "y"
+    ifneq (,$(filter yrs, $(SYSTEM_STUFF)))
+	rm -f $(CURDIR)/include/libyrs.h
+    endif
+  endif
+  ifeq "$(ENABLE_RUST_UNO)" "y"
+	rm -rf rust_uno/target
+  endif
+endif
+
 	# remove only if we linked it over. otherwise we remove the one
 	# intentionally added there if so
 	cd $(SOURCE_TREE)/tarballs && \
@@ -2245,6 +2356,9 @@ endif
 ifeq "$(PACKAGE_LOKIT)" "y"
 	cat debian/control.lokit.in >> debian/control.new
 endif
+ifeq "$(ENABLE_RUST_UNO)" "y"
+	cat debian/control.rust.in >> debian/control.new
+endif
 ifeq "$(BUILD_GTK3)" "y"
 	cat debian/control.gtk3.in >> debian/control.new
   ifneq "$(ENABLE_INTROSPECTION)" "y"
@@ -2304,6 +2418,7 @@ endif
 	perl -pi -e "s,%OOO_NO_BASE_ARCHS%,$(OOO_NO_BASE_ARCHS),"g debian/control.new
 	perl -pi -e "s,%OOO_JAVA_ARCHS%,$(OOO_JAVA_ARCHS),g" debian/control.new
 	perl -pi -e "s,%OOO_CLI_ARCHS%,$(OOO_CLI_ARCHS),g" debian/control.new
+	perl -pi -e "s,%OOO_RUST_ARCHS%,$(OOO_RUST_ARCHS),g" debian/control.new
 	perl -pi -e "s,%OOO_ARCH_DEP_EXTENSIONS_ARCHS%,$(OOO_ARCH_DEP_EXTENSIONS_ARCHS),g" debian/control.new
 	perl -pi -e "s,%OOO_REPORTBUILDER_ARCHS%,$(OOO_REPORTBUILDER_ARCHS),g" debian/control.new
 	perl -pi -e "s,%OOO_NO_REPORTBUILDER_ARCHS%,$(OOO_NO_REPORTBUILDER_ARCHS),g" debian/control.new
@@ -2387,6 +2502,10 @@ ifneq (,$(OOO_JUNIT_ARCHS))
 	sed -e "s|%OOO_JUNIT_ARCHS%|$(OOO_JUNIT_ARCHS)|g" \
 		>> debian/tests/control.new < debian/tests/control.junit.in
 endif	    
+ifeq "$(ENABLE_RUST_UNO)" "y"
+	sed -e "s|%OOO_RUST_ARCHS%|$(OOO_RUST_ARCHS)|g" \
+		>> debian/tests/control.new < debian/tests/control.rust.in
+endif
 	# make sure it's the last one
 ifeq (y,$(ENABLE_MARIADB))
 	cat debian/tests/control.mysql.in >> debian/tests/control.new
@@ -2467,6 +2586,36 @@ ifeq ($(filter pkg.libreoffice.opensymbolbuild,$(DEB_BUILD_PROFILES)),)
 			f543e6e2d7275557a839a164941c0a86e5f2c3f2a0042bfc434c88c6dde9e140-opens___.ttf
 endif
 
+ifeq "$(ENABLE_RUST)" "y"
+  ifeq ($(filter upstream-cargo,$(DEB_BUILD_PROFILES)),)
+# 20:26 < f_g> debcargo is only really for translating a single crate's Cargo.toml in debian/ . if all you want to do is call cargo to build Rust code in a 
+#             Debian context, than the cargo wrapper (/usr/share/cargo/bin/cargo) is probably what you want. it requires a bit of setup and then a call to its 
+#             prepare-debian in dh_auto_configure, after that all cargo invocations going through it should DTRT
+        # use fake DEB_CARGO_CRATE and adapt later...
+	DEB_CARGO_CRATE=libreoffice_$(DEB_VERSION_UPSTREAM) $(CARGO) prepare-debian debian/cargo_registry $(CARGO_PREPARE_DEBIAN_FLAGS)
+    ifeq "$(ENABLE_YRS)" "y"
+      ifneq (,$(filter yrs, $(SYSTEM_STUFF)))
+	# Copy over since cargo wants to write inside there which it of course can't if it's in /usr/share
+	rm -rf debian/cargo_registry/yffi-*
+	cd debian/cargo_registry && \
+		cp -r /usr/share/cargo/registry/yffi-* .
+	# create version-agnostic dir so we don't need to update all the places where this is referenced
+	# here (and system-crates.diff) if the version changes...
+	cd debian/cargo_registry && \
+		ln -s yffi-* yffi
+      endif
+    endif
+  else
+	patch -p1 -R < $(SRCDIR)/debian/patches/fix-rust_uno-path-for-cargo-wrapper.diff
+	if [ -d .pc/fix-rust_uno-path-for-cargo-wrapper.diff ]; then \
+		patch -p1 -R < debian/patches/fix-rust_uno-path-for-cargo-wrapper.diff; \
+		TMP=`mktemp -q`; grep -v fix-rust_uno-path-for-cargo-wrapper .pc/applied-patches \
+			> $$TMP && mv $$TMP .pc/applied-patches; \
+		rm -rf .pc/fix-rust_uno-path-for-cargo-wrapper.diff; \
+	fi
+  endif
+endif
+
 	touch $@
 
 .PHONY: config_host.mk
@@ -2486,6 +2635,32 @@ $(STAMP_DIR)/build-arch:
 #build-arch: ENABLE_HELP = n PACKAGE_SDK_DOCS = n ENABLE_MEDIAWIKI = n ENABLE_SCRIPT_PROVIDER_BSH = n ENABLE_SCRIPT_PROVIDER_JS = n
 	dh_testdir
 
+ifeq "$(ENABLE_RUST)" "y"
+  ifeq "$(ENABLE_YRS)" "y"
+    ifneq (,$(filter yrs, $(SYSTEM_STUFF)))
+	# build yffi (to be used by "standard" make) and generate needed header manually.
+	# Done upstream in external (and used directly from there) but we disable that via system-crates.diff,
+	# which now hardcodes debian/cargo_registry/yffi instead :-) and relies on the standard include path
+	# fix cargo_home
+	if grep -q libreoffice-$(DEB_VERSION_UPSTREAM) $(CARGO_HOME)/config.toml; then \
+		sed -i s,libreoffice-$(DEB_VERSION_UPSTREAM),yffi-$(shell grep ^version /usr/share/cargo/registry/yffi-*/Cargo.toml | head -n 1 | awk '{ print $$3 }' | sed -e s/\"//g),g $(CARGO_HOME)/config.toml; \
+	fi
+	cd $(CURDIR)/debian/cargo_registry/yffi && export DEB_CARGO_CRATE=yffi_$(shell grep ^version /usr/share/cargo/registry/yffi-*/Cargo.toml | head -n 1 | awk '{ print $$3 }' | sed -e s/\"//g); $(CARGO) build $(CARGO_FLAGS) --offline -p yffi
+	cd $(CURDIR)/debian/cargo_registry/yffi && cbindgen -o $(CURDIR)/include/libyrs.h
+    endif
+  endif
+endif
+
+ifeq "$(ENABLE_RUST_UNO)" "y"
+	# fix cargo_home
+	if grep -q libreoffice-$(DEB_VERSION_UPSTREAM) $(CARGO_HOME)/config.toml; then \
+		sed -i s,libreoffice-$(DEB_VERSION_UPSTREAM),rust-uno-$(RUST_UNO_VERSION),g $(CARGO_HOME)/config.toml; \
+	fi
+	if grep -q yffi-$(shell grep ^version /usr/share/cargo/registry/yffi-*/Cargo.toml | head -n 1 | awk '{ print $$3 }' | sed -e s/\"//g) $(CARGO_HOME)/config.toml; then \
+		sed -i s,yffi-$(shell grep ^version /usr/share/cargo/registry/yffi-*/Cargo.toml | head -n 1 | awk '{ print $$3 }' | sed -e s/\"//g),rust-uno-$(RUST_UNO_VERSION),g $(CARGO_HOME)/config.toml; \
+	fi
+endif
+
 ifeq "$(BUILD_NOGUI_PACKAGES)" "y"
 	# build with --disable-gui first
 	PATH=$(BUILD_PATH) LD_LIBRARY_PATH=$(BUILD_LD_LIBRARY_PATH) \
@@ -2696,6 +2871,15 @@ else
   endif
 endif
 
+ifeq "$(ENABLE_RUST_UNO)" "y"
+	cd $(SOURCE_TREE)/rust_uno && export DEB_CARGO_CRATE=rust-uno_$(RUST_UNO_VERSION); $(CARGO) check $(CARGO_FLAGS)
+	cd $(SOURCE_TREE)/rust_uno && \
+		export DEB_CARGO_CRATE=rust-uno_$(RUST_UNO_VERSION); \
+		export INSTDIR=$(CURDIR)/$(SOURCE_TREE)/instdir; \
+		export LD_LIBRARY_PATH=$(CURDIR)/$(SOURCE_TREE)/instdir/program; \
+		$(CARGO) test $(CARGO_FLAGS)
+endif
+
 ifeq "$(BUILD_TESTS)" "y"
   ifneq (,$(filter $(DEB_HOST_ARCH),$(OOO_NO_BASE_ARCHS)))
 	patch -p1 -R < $(CURDIR)/debian/tests/patches/disable-db-tests.diff
@@ -2994,9 +3178,33 @@ ifneq "$(ENABLE_GUI)" "y"
 	rm -rf debian/tmp/pkg/libreofficekit-data
 endif
 
+ifeq "$(ENABLE_RUST_UNO)" "y"
+  ifeq "$(BUILD_TEST_PACKAGES)" "y"
+	cp debian/libreoffice-rust-uno-example.install.in \
+		debian/libreoffice-rust-uno-example.install
+  endif
+	cat debian/librust-rust-uno-dev.install.in \
+		| sed -e "s/@RUST_UNO_VERSION@/$(RUST_UNO_VERSION)/" \
+		> debian/librust-rust-uno-dev.install
+endif
+
 	dh_installdirs -A
 	dh_install -A --sourcedir=debian/tmp/pkg && dh_missing -A --sourcedir=debian/tmp/pkg --fail-missing
 
+ifeq "$(ENABLE_RUST_UNO)" "y"
+	# cleanup
+	rm -rf debian/librust-rust-uno-dev/usr/share/cargo/registry/rust-uno-$(RUST_UNO_VERSION)/target 
+	rm -f debian/librust-rust-uno-dev/usr/share/cargo/registry/rust-uno-$(RUST_UNO_VERSION)/Cargo.lock
+	# needed by cargo, otherwise it breaks (see https://github.com/rust-lang/cargo/issues/11063)
+	if [ ! -e debian/librust-rust-uno-dev/usr/share/cargo/registry/rust-uno-$(RUST_UNO_VERSION)/.cargo-checksum.json ]; then \
+	  echo '{"package":"Could not get crate checksum","files":{}}' > debian/librust-rust-uno-dev/usr/share/cargo/registry/rust-uno-$(RUST_UNO_VERSION)/.cargo-checksum.json; \
+	fi
+	# make a cargo build work with the installed crate without needing to manually
+	# set INSTDIR before doing a cargo build
+	perl -pi -e 's/fn main\(\) \{/fn main() \{\n    unsafe \{ std::env::set_var\(\"INSTDIR\",\"\/usr\/lib\/libreoffice\"\); \}\n/' \
+		debian/librust-rust-uno-dev/usr/share/cargo/registry/rust-uno-$(RUST_UNO_VERSION)/build.rs
+endif
+
 	# somehow this isn't installed anymore on -B builds...
 	if [ ! -f debian/libreoffice-report-builder/$(OODIR)/program/librptlo.so ]; then \
 		mkdir -p debian/libreoffice-report-builder/$(OODIR)/program/; \
@@ -4470,6 +4678,42 @@ endif
 		>> debian/libuno-sal3t64.substvars
 	echo "salhelper-private-abi:Provides=libreoffice-salhelper-private-abi (= $(shell grep UREPACKAGEVERSION $(SOURCE_TREE)/instsetoo_native/util/openoffice.lst | awk '{ print $$2 }' | cut -d. -f1-3))" \
 		>> debian/libuno-salhelpergcc3-3t64.substvars
+	# Generate (Static-)Built-Using
+ifeq "$(ENABLE_RUST_UNO)" "y"
+	# dh-cargo-built-using creates the substvars in debian/. Fake one so we don't need to
+	# do the fake target dir as below (and then throw it away again for the next one...)
+	# but can just run it in rust_uno
+	mkdir -p $(CURDIR)/rust_uno/debian
+	cd $(CURDIR)/rust_uno && \
+		/usr/share/cargo/bin/dh-cargo-built-using libreoffice-core
+  ifeq "$(BUILD_NOGUI_PACKAGES)" "y"
+	cd $(CURDIR)/rust_uno && \
+		/usr/share/cargo/bin/dh-cargo-built-using libreoffice-core-nogui
+  endif
+	# and add the stuff to the real file
+	cat $(CURDIR)/rust_uno/debian/libreoffice-core.substvars \
+		>> $(CURDIR)/debian/libreoffice-core.substvars
+  ifeq "$(BUILD_NOGUI_PACKAGES)" "y"
+	cat $(CURDIR)/rust_uno/debian/libreoffice-core-nogui.substvars \
+		>> $(CURDIR)/debian/libreoffice-core-nogui.substvars
+  endif
+  ifeq "$(BUILD_TEST_PACKAGES)" "y"
+	grep Built-Using $(CURDIR)/debian/libreoffice-core.substvars \
+		>> $(CURDIR)/debian/libreoffice-rust-uno-example.substvars
+  endif
+	rm -rf $(CURDIR)/rust_uno/debian
+endif
+ifeq "$(ENABLE_YRS)" "y"
+	# Symlink the build target dir to target/$(DEB_HOST_RUST_TYPE)/release
+	# since dh-cargo-built-using expects it there
+	mkdir -p $(CURDIR)/target/$(DEB_HOST_RUST_TYPE)/
+	ln -s $(CURDIR)/debian/cargo_registry/yffi/target/$(DEB_HOST_RUST_TYPE)/$(CARGO_CHANNEL) target/$(DEB_HOST_RUST_TYPE)/
+	/usr/share/cargo/bin/dh-cargo-built-using libreoffice-core
+  ifeq "$(BUILD_NOGUI_PACKAGES)" "y"
+	/usr/share/cargo/bin/dh-cargo-built-using libreoffice-core-nogui
+  endif
+	rm -rf $(CURDIR)/target
+endif
 	dh_gencontrol -a $(DEBHELPER_OPTIONS) \
 		-- \
 		-V'base-version=$(BASE_VERSION)' \
@@ -4519,6 +4763,10 @@ ifeq "$(ENABLE_DOTNET)" "y"
 	dh_gencontrol -plibreoffice-dev-dotnet -- \
 		-v$(shell echo `basename instdir/sdk/dotnet/LibreOffice.Bindings*.nupkg .nupkg` | sed -e "s/LibreOffice.Bindings.//")+LibO`echo $(BINARY_VERSION) | cut -d: -f2` 
 endif
+ifeq "$(ENABLE_RUST_UNO)" "y"
+	dh_gencontrol -plibrust-rust-uno-dev -- \
+		-v$(RUST_UNO_VERSION)+LibO`echo $(BINARY_VERSION) | cut -d: -f2`
+endif
 
 	dh_md5sums -a
 	dh_builddeb -a $(DEBHELPER_OPTIONS)
diff --git a/tests/Test.fodt b/tests/Test.fodt
new file mode 100644
index 000000000..ed826b8c0
--- /dev/null
+++ b/tests/Test.fodt
@@ -0,0 +1,339 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<office:document xmlns:css3t="http://www.w3.org/TR/css3-text/" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:rpt="http://openoffice.org/2005/report" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:officeooo="http://openoffice.org/2009/office" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" office:version="1.4" office:mimetype="application/vnd.oasis.opendocument.text">
+ <office:meta><meta:creation-date>2025-10-20T07:15:16.847321724</meta:creation-date><dc:date>2025-10-20T19:09:22.001471926</dc:date><meta:editing-duration>PT11H21M35S</meta:editing-duration><meta:editing-cycles>6</meta:editing-cycles><meta:generator>LibreOfficeDev/26.2.0.0.alpha0$Linux_X86_64 LibreOffice_project/59b496f0d9e0c15d41795c1233f576476dc81ab2</meta:generator><meta:document-statistic meta:table-count="0" meta:image-count="0" meta:object-count="0" meta:page-count="1" meta:paragraph-count="0" meta:word-count="0" meta:character-count="0" meta:non-whitespace-character-count="0"/></office:meta>
+ <office:settings>
+  <config:config-item-set config:name="ooo:view-settings">
+   <config:config-item config:name="ViewAreaTop" config:type="long">0</config:config-item>
+   <config:config-item config:name="ViewAreaLeft" config:type="long">0</config:config-item>
+   <config:config-item config:name="ViewAreaWidth" config:type="long">31911</config:config-item>
+   <config:config-item config:name="ViewAreaHeight" config:type="long">15215</config:config-item>
+   <config:config-item config:name="ShowRedlineChanges" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="InBrowseMode" config:type="boolean">false</config:config-item>
+   <config:config-item-map-indexed config:name="Views">
+    <config:config-item-map-entry>
+     <config:config-item config:name="ViewId" config:type="string">view2</config:config-item>
+     <config:config-item config:name="ViewLeft" config:type="long">7454</config:config-item>
+     <config:config-item config:name="ViewTop" config:type="long">2501</config:config-item>
+     <config:config-item config:name="VisibleLeft" config:type="long">0</config:config-item>
+     <config:config-item config:name="VisibleTop" config:type="long">0</config:config-item>
+     <config:config-item config:name="VisibleRight" config:type="long">31909</config:config-item>
+     <config:config-item config:name="VisibleBottom" config:type="long">15214</config:config-item>
+     <config:config-item config:name="ZoomType" config:type="short">0</config:config-item>
+     <config:config-item config:name="ViewLayoutColumns" config:type="short">1</config:config-item>
+     <config:config-item config:name="ViewLayoutBookMode" config:type="boolean">false</config:config-item>
+     <config:config-item config:name="ZoomFactor" config:type="short">100</config:config-item>
+     <config:config-item config:name="IsSelectedFrame" config:type="boolean">false</config:config-item>
+     <config:config-item config:name="KeepRatio" config:type="boolean">false</config:config-item>
+     <config:config-item config:name="WindowState" config:type="string">0,0,1166,701;5;0,0,1281,732;</config:config-item>
+     <config:config-item config:name="AnchoredTextOverflowLegacy" config:type="boolean">false</config:config-item>
+     <config:config-item config:name="LegacySingleLineFontwork" config:type="boolean">false</config:config-item>
+     <config:config-item config:name="ConnectorUseSnapRect" config:type="boolean">false</config:config-item>
+     <config:config-item config:name="IgnoreBreakAfterMultilineField" config:type="boolean">false</config:config-item>
+     <config:config-item config:name="UseTrailingEmptyLinesInLayout" config:type="boolean">false</config:config-item>
+    </config:config-item-map-entry>
+   </config:config-item-map-indexed>
+  </config:config-item-set>
+  <config:config-item-set config:name="ooo:configuration-settings">
+   <config:config-item config:name="PrintProspectRTL" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="PrintPageBackground" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="PrintDrawings" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="PrintFaxName" config:type="string"/>
+   <config:config-item config:name="PrintReversed" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="PrintAnnotationMode" config:type="short">0</config:config-item>
+   <config:config-item config:name="PrintHiddenText" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="PrintEmptyPages" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="AdjustTableLineHeightsToGridHeight" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="BalanceSpacesAndIdeographicSpaces" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="MsWordCompGridMetrics" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="PaintHellOverHeaderFooter" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="ApplyParagraphMarkFormatToEmptyLineAtEndOfParagraph" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="PrintGraphics" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="NoNumberingShowFollowBy" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="MinRowHeightInclBorder" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="HyphenateURLs" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="ImagePreferredDPI" config:type="int">0</config:config-item>
+   <config:config-item config:name="FootnoteInColumnToPageEnd" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="GutterAtTop" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="ContinuousEndnotes" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="MsWordUlTrailSpace" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="FrameAutowidthWithMorePara" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="SubtractFlysAnchoredAtFlys" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="SurroundTextWrapSmall" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="PrintControls" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="TreatSingleColumnBreakAsPageBreak" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="TabOverSpacing" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="AutoFirstLineIndentDisregardLineSpace" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="TabOverMargin" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="EmbedComplexScriptFonts" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="EmbedAsianScriptFonts" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="PrintTextPlaceholder" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="ApplyTextAttrToEmptyLineAtEndOfParagraph" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="EmbedSystemFonts" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="EmbedFonts" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="NoClippingWithWrapPolygon" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="DisableOffPagePositioning" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="BackgroundParaOverDrawings" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="TabOverflow" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="SmallCapsPercentage66" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="AllowPrintJobCancel" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="AddVerticalFrameOffsets" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="ProtectBookmarks" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="AddFrameOffsets" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="PrintBlackFonts" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="TableRowKeep" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="ApplyParagraphMarkFormatToNumbering" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="PrinterIndependentLayout" config:type="string">high-resolution</config:config-item>
+   <config:config-item config:name="JustifyLinesWithShrinking" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="RsidRoot" config:type="int">524200</config:config-item>
+   <config:config-item config:name="PrintProspect" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="CollapseEmptyCellPara" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="PrintPaperFromSetup" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="CurrentDatabaseCommand" config:type="string"/>
+   <config:config-item config:name="CurrentDatabaseDataSource" config:type="string"/>
+   <config:config-item config:name="SaveThumbnail" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="EmbeddedDatabaseName" config:type="string"/>
+   <config:config-item config:name="UnbreakableNumberings" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="SaveGlobalDocumentLinks" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="MsWordCompTrailingBlanks" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="PrintTables" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="PrintLeftPages" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="AddParaTableSpacing" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="PrinterPaperFromSetup" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="CurrentDatabaseCommandType" config:type="int">0</config:config-item>
+   <config:config-item config:name="ChartAutoUpdate" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="OutlineLevelYieldsNumbering" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="ForceTopAlignmentInCellWithFloatingAnchor" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="UseOldNumbering" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="AddParaSpacingToTableCells" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="FieldAutoUpdate" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="PropLineSpacingShrinksFirstLine" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="TabAtLeftIndentForParagraphsInList" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="PrintRightPages" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="DoNotCaptureDrawObjsOnPage" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="LoadReadonly" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="HeaderSpacingBelowLastPara" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="SaveVersionOnClose" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="UseFormerLineSpacing" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="PrinterName" config:type="string"/>
+   <config:config-item config:name="AddParaLineSpacingToTableCells" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="IsKernAsianPunctuation" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="DoNotJustifyLinesWithManualBreak" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="CharacterCompressionType" config:type="short">0</config:config-item>
+   <config:config-item config:name="IsLabelDocument" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="EmbedLatinScriptFonts" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="PrinterSetup" config:type="base64Binary"/>
+   <config:config-item config:name="UseVariableWidthNBSP" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="EmbedOnlyUsedFonts" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="ApplyUserData" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="AddParaTableSpacingAtStart" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="InvertBorderSpacing" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="ProtectFields" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="AddExternalLeading" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="LinkUpdateMode" config:type="short">1</config:config-item>
+   <config:config-item config:name="UseFormerObjectPositioning" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="UnxForceZeroExtLeading" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="UseFormerTextWrapping" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="ConsiderTextWrapOnObjPos" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="StylesNoDefault" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="IgnoreFirstLineIndentInNumbering" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="NoGapAfterNoteNumber" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="EmptyDbFieldHidesPara" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="DoNotResetParaAttrsForNumFont" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="HiddenParagraphMarkPerLineProperties" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="IgnoreTabsAndBlanksForLineCalculation" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="ClippedPictures" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="MathBaselineAlignment" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="AlignTabStopPosition" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="IgnoreHiddenCharsForLineCalculation" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="ClipAsCharacterAnchoredWriterFlyFrames" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="DropCapPunctuation" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="UseOldPrinterMetrics" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="RedlineProtectionKey" config:type="base64Binary"/>
+   <config:config-item config:name="TabsRelativeToIndent" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="Rsid" config:type="int">953399</config:config-item>
+   <config:config-item config:name="UpdateFromTemplate" config:type="boolean">true</config:config-item>
+   <config:config-item config:name="ProtectForm" config:type="boolean">false</config:config-item>
+   <config:config-item config:name="MsWordCompMinLineHeightByFly" config:type="boolean">false</config:config-item>
+  </config:config-item-set>
+ </office:settings>
+ <office:scripts>
+  <office:script script:language="ooo:Basic">
+   <ooo:libraries xmlns:ooo="http://openoffice.org/2004/office" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <ooo:library-embedded ooo:name="Standard">
+     <ooo:module ooo:name="Test">
+      <ooo:source-code>REM  *****  BASIC  *****
+
+
+sub TestRustUNOExample
+rem ----------------------------------------------------------------------
+rem define variables
+dim document   as object
+dim dispatcher as object
+rem ----------------------------------------------------------------------
+rem get access to the document
+document   = ThisComponent.CurrentController.Frame
+dispatcher = createUnoService(&quot;com.sun.star.frame.DispatchHelper&quot;)
+
+rem ----------------------------------------------------------------------
+doc = ThisComponent
+rem Open Rust UNO -> Example as defined by the extension
+dispatcher.executeDispatch(document, &quot;vnd.org.libreoffice.rust_uno.example:&quot;, &quot;&quot;, 0, Array())
+doc.close(true)
+rem FIXME. How to close the soffice, ignoring all open documents? Even if we close the initial (writer) document
+rem then the document created by the extension remains open, is handled as &quot;changed&quot;, and gives the question whether to save...
+rem For now worked around by calling libreoffice with the &quot;timeout&quot; command and getting it killed after the timeout
+
+end sub
+
+      </ooo:source-code>
+     </ooo:module>
+    </ooo:library-embedded>
+   </ooo:libraries>
+  </office:script>
+ </office:scripts>
+ <office:font-face-decls>
+  <style:font-face style:name="FreeSans" svg:font-family="FreeSans" style:font-family-generic="swiss"/>
+  <style:font-face style:name="FreeSans1" svg:font-family="FreeSans" style:font-family-generic="system" style:font-pitch="variable"/>
+  <style:font-face style:name="Liberation Sans" svg:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="swiss" style:font-pitch="variable"/>
+  <style:font-face style:name="Liberation Serif" svg:font-family="&apos;Liberation Serif&apos;" style:font-family-generic="roman" style:font-pitch="variable"/>
+  <style:font-face style:name="Noto Sans CJK SC" svg:font-family="&apos;Noto Sans CJK SC&apos;" style:font-family-generic="system" style:font-pitch="variable"/>
+  <style:font-face style:name="Noto Serif CJK SC" svg:font-family="&apos;Noto Serif CJK SC&apos;" style:font-family-generic="system" style:font-pitch="variable"/>
+ </office:font-face-decls>
+ <office:styles>
+  <style:default-style style:family="graphic">
+   <style:graphic-properties svg:stroke-color="#3465a4" draw:fill-color="#729fcf" fo:wrap-option="no-wrap" draw:shadow-offset-x="0.3cm" draw:shadow-offset-y="0.3cm" draw:start-line-spacing-horizontal="0.283cm" draw:start-line-spacing-vertical="0.283cm" draw:end-line-spacing-horizontal="0.283cm" draw:end-line-spacing-vertical="0.283cm" style:writing-mode="lr-tb" style:flow-with-text="false"/>
+   <style:paragraph-properties style:text-autospace="ideograph-alpha" style:line-break="strict" loext:tab-stop-distance="0cm" style:font-independent-line-spacing="false">
+    <style:tab-stops/>
+   </style:paragraph-properties>
+   <style:text-properties style:use-window-font-color="true" loext:opacity="0%" style:font-name="Liberation Serif" fo:font-size="12pt" fo:language="de" fo:country="DE" style:letter-kerning="true" style:font-name-asian="Noto Serif CJK SC" style:font-size-asian="10.5pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="FreeSans1" style:font-size-complex="12pt" style:language-complex="hi" style:country-complex="IN"/>
+  </style:default-style>
+  <style:default-style style:family="paragraph">
+   <style:paragraph-properties fo:orphans="2" fo:widows="2" fo:hyphenation-ladder-count="no-limit" fo:hyphenation-keep="auto" loext:hyphenation-keep-type="column" loext:hyphenation-keep-line="false" style:text-autospace="ideograph-alpha" style:punctuation-wrap="hanging" style:line-break="strict" style:tab-stop-distance="1.251cm" style:writing-mode="page"/>
+   <style:text-properties style:use-window-font-color="true" loext:opacity="0%" style:font-name="Liberation Serif" fo:font-size="12pt" fo:language="de" fo:country="DE" style:letter-kerning="true" style:font-name-asian="Noto Serif CJK SC" style:font-size-asian="10.5pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="FreeSans1" style:font-size-complex="12pt" style:language-complex="hi" style:country-complex="IN" fo:hyphenate="false" fo:hyphenation-remain-char-count="2" fo:hyphenation-push-char-count="2" loext:hyphenation-no-caps="false" loext:hyphenation-no-last-word="false" loext:hyphenation-word-char-count="5" loext:hyphenation-zone="no-limit"/>
+  </style:default-style>
+  <style:default-style style:family="table">
+   <style:table-properties table:border-model="collapsing"/>
+  </style:default-style>
+  <style:default-style style:family="table-row">
+   <style:table-row-properties fo:keep-together="auto"/>
+  </style:default-style>
+  <style:style style:name="Standard" style:family="paragraph" style:class="text"/>
+  <style:style style:name="Heading" style:family="paragraph" style:parent-style-name="Standard" style:next-style-name="Text_20_body" style:class="chapter">
+   <style:paragraph-properties fo:margin-top="0.423cm" fo:margin-bottom="0.212cm" style:contextual-spacing="false" fo:keep-with-next="always"/>
+   <style:text-properties style:font-name="Liberation Sans" fo:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="swiss" style:font-pitch="variable" fo:font-size="14pt" style:font-name-asian="Noto Sans CJK SC" style:font-family-asian="&apos;Noto Sans CJK SC&apos;" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="14pt" style:font-name-complex="FreeSans1" style:font-family-complex="FreeSans" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="14pt"/>
+  </style:style>
+  <style:style style:name="Text_20_body" style:display-name="Text body" style:family="paragraph" style:parent-style-name="Standard" style:class="text">
+   <style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0.247cm" style:contextual-spacing="false" fo:line-height="115%"/>
+  </style:style>
+  <style:style style:name="List" style:family="paragraph" style:parent-style-name="Text_20_body" style:class="list">
+   <style:text-properties style:font-size-asian="12pt" style:font-name-complex="FreeSans" style:font-family-complex="FreeSans" style:font-family-generic-complex="swiss"/>
+  </style:style>
+  <style:style style:name="Caption" style:family="paragraph" style:parent-style-name="Standard" style:class="extra">
+   <style:paragraph-properties fo:margin-top="0.212cm" fo:margin-bottom="0.212cm" style:contextual-spacing="false" text:number-lines="false" text:line-number="0"/>
+   <style:text-properties fo:font-size="12pt" fo:font-style="italic" style:font-size-asian="12pt" style:font-style-asian="italic" style:font-name-complex="FreeSans" style:font-family-complex="FreeSans" style:font-family-generic-complex="swiss" style:font-size-complex="12pt" style:font-style-complex="italic"/>
+  </style:style>
+  <style:style style:name="Index" style:family="paragraph" style:parent-style-name="Standard" style:class="index">
+   <style:paragraph-properties text:number-lines="false" text:line-number="0"/>
+   <style:text-properties style:font-size-asian="12pt" style:font-name-complex="FreeSans" style:font-family-complex="FreeSans" style:font-family-generic-complex="swiss"/>
+  </style:style>
+  <text:outline-style style:name="Outline">
+   <text:outline-level-style text:level="1" loext:num-list-format="%1%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="2" loext:num-list-format="%2%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="3" loext:num-list-format="%3%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="4" loext:num-list-format="%4%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="5" loext:num-list-format="%5%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="6" loext:num-list-format="%6%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="7" loext:num-list-format="%7%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="8" loext:num-list-format="%8%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="9" loext:num-list-format="%9%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="10" loext:num-list-format="%10%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+  </text:outline-style>
+  <text:notes-configuration text:note-class="footnote" style:num-format="1" text:start-value="0" text:footnotes-position="page" text:start-numbering-at="document"/>
+  <text:notes-configuration text:note-class="endnote" style:num-format="i" text:start-value="0"/>
+  <text:linenumbering-configuration text:number-lines="false" text:offset="0.499cm" style:num-format="1" text:number-position="left" text:increment="5"/>
+  <loext:theme loext:name="Office">
+   <loext:theme-colors loext:name="LibreOffice">
+    <loext:color loext:name="dark1" loext:color="#000000"/>
+    <loext:color loext:name="light1" loext:color="#ffffff"/>
+    <loext:color loext:name="dark2" loext:color="#000000"/>
+    <loext:color loext:name="light2" loext:color="#ffffff"/>
+    <loext:color loext:name="accent1" loext:color="#18a303"/>
+    <loext:color loext:name="accent2" loext:color="#0369a3"/>
+    <loext:color loext:name="accent3" loext:color="#a33e03"/>
+    <loext:color loext:name="accent4" loext:color="#8e03a3"/>
+    <loext:color loext:name="accent5" loext:color="#c99c00"/>
+    <loext:color loext:name="accent6" loext:color="#c9211e"/>
+    <loext:color loext:name="hyperlink" loext:color="#0000ee"/>
+    <loext:color loext:name="followed-hyperlink" loext:color="#551a8b"/>
+   </loext:theme-colors>
+  </loext:theme>
+ </office:styles>
+ <office:automatic-styles>
+  <style:page-layout style:name="pm1">
+   <style:page-layout-properties fo:page-width="21.001cm" fo:page-height="29.7cm" style:num-format="1" style:print-orientation="portrait" fo:margin-top="2cm" fo:margin-bottom="2cm" fo:margin-left="2cm" fo:margin-right="2cm" style:writing-mode="lr-tb" style:layout-grid-color="#c0c0c0" style:layout-grid-lines="20" style:layout-grid-base-height="0.706cm" style:layout-grid-ruby-height="0.353cm" style:layout-grid-mode="none" style:layout-grid-ruby-below="false" style:layout-grid-print="false" style:layout-grid-display="false" style:footnote-max-height="0cm" loext:margin-gutter="0cm">
+    <style:footnote-sep style:width="0.018cm" style:distance-before-sep="0.101cm" style:distance-after-sep="0.101cm" style:line-style="solid" style:adjustment="left" style:rel-width="25%" style:color="#000000"/>
+   </style:page-layout-properties>
+   <style:header-style/>
+   <style:footer-style/>
+  </style:page-layout>
+  <style:style style:name="dp1" style:family="drawing-page">
+   <style:drawing-page-properties draw:background-size="full"/>
+  </style:style>
+ </office:automatic-styles>
+ <office:master-styles>
+  <style:master-page style:name="Standard" style:page-layout-name="pm1" draw:style-name="dp1"/>
+ </office:master-styles>
+ <office:body>
+  <office:text>
+   <text:sequence-decls>
+    <text:sequence-decl text:display-outline-level="0" text:name="Illustration"/>
+    <text:sequence-decl text:display-outline-level="0" text:name="Table"/>
+    <text:sequence-decl text:display-outline-level="0" text:name="Text"/>
+    <text:sequence-decl text:display-outline-level="0" text:name="Drawing"/>
+    <text:sequence-decl text:display-outline-level="0" text:name="Figure"/>
+   </text:sequence-decls>
+   <text:p text:style-name="Standard"/>
+  </office:text>
+ </office:body>
+</office:document>
diff --git a/tests/cargo-rust-uno-check b/tests/cargo-rust-uno-check
new file mode 100755
index 000000000..9bcd1c9c5
--- /dev/null
+++ b/tests/cargo-rust-uno-check
@@ -0,0 +1,14 @@
+#!/bin/bash
+# autopkgtest check: Run cargo test on the rust_uno crate
+# (c) 2025 Software in the Public Interest, Inc.
+# Authors: Rene Engelhard <rene@debian.org>
+
+set -e
+set -E
+
+SRCDIR=`pwd`
+CHECK_PARALLELISM=1
+
+cd  /usr/share/cargo/registry/rust-uno-* 
+/usr/share/cargo/bin/cargo --verbose check
+
diff --git a/tests/cargo-rust-uno-test b/tests/cargo-rust-uno-test
new file mode 100755
index 000000000..33daeb9fd
--- /dev/null
+++ b/tests/cargo-rust-uno-test
@@ -0,0 +1,20 @@
+#!/bin/bash
+# autopkgtest check: Run cargo test on the rust_uno crate
+# (c) 2025 Software in the Public Interest, Inc.
+# Authors: Rene Engelhard <rene@debian.org>
+
+set -e
+set -E
+
+SRCDIR=`pwd`
+CHECK_PARALLELISM=1
+
+echo
+echo "====== Starting cargo test of rust_uno with ${CHECK_PARALLELISM} job against /usr/lib/libreoffice/program and /usr/lib/libreoffice/sdk ======"
+
+export INSTDIR=/usr/lib/libreoffice
+export LD_LIBRARY_PATH=/usr/lib/libreoffice/program
+/usr/share/cargo/bin/cargo-auto-test rust-uno `grep version /usr/share/cargo/registry/rust-uno-*/Cargo.toml | awk '{ print $3 }' | sed -e s/\"//g`
+
+#unapply
+
diff --git a/tests/control b/tests/control
index ef5db49be..d3b26d5c5 100644
--- a/tests/control
+++ b/tests/control
@@ -121,12 +121,12 @@ Restrictions: allow-stderr, superficial
 ## build-needed builds with nocheck and thus they are not built.
 #Tests: fake-build-tests
 #Architecture: amd64
-#Depends: @builddeps@, libreoffice,libreoffice-core,libreoffice-common,libreoffice-java-common,libreoffice-writer,libreoffice-calc,libreoffice-impress,libreoffice-draw,libreoffice-math,libreoffice-base-core,libreoffice-base,libreoffice-style-breeze,libreoffice-style-colibre,libreoffice-style-sifr,libreoffice-style-elementary,libreoffice-style-karasa-jaga,libreoffice-style-sukapura,libreoffice-gnome,python3-uno,libreoffice-script-provider-python,libreoffice-script-provider-bsh,libreoffice-script-provider-js,libreoffice-sdbc-hsqldb,libreoffice-sdbc-mysql,libreoffice-base-drivers,python3-access2base,python3-scriptforge,libofficebean-java,libreoffice-uiconfig-common,libreoffice-uiconfig-base,libreoffice-uiconfig-calc,libreoffice-uiconfig-draw,libreoffice-uiconfig-impress,libreoffice-uiconfig-math,libreoffice-uiconfig-writer,uno-libs-private,libuno-sal3t64,libuno-cppu3t64,ure,ure-java,libunoloader-java,liblibreoffice-java,libreoffice-wiki-publisher,libreoffice-report-builder,libreoffice-report-builder-bin,libreoffice-uiconfig-report-builder,libreoffice-nlpsolver,fonts-opensymbol,libreoffice-dev,libreoffice-dev-gui,libreoffice-dev-common,libreofficekit-dev,libreoffice-gtk3,gir1.2-lokdocview-0.1,libreofficekit-dev-gtk,liblibreofficekitgtk,libreofficekit-data,libreoffice-gtk4,libreoffice-kf6,libreoffice-qt6,libreoffice-plasma,libreoffice-sdbc-postgresql,libreoffice-evolution,libreoffice-subsequentcheckbase,libreoffice-smoketest-data,libreoffice-librelogo,libreoffice-sdbc-firebird
+#Depends: @builddeps@, libreoffice,libreoffice-core,libreoffice-common,libreoffice-java-common,libreoffice-writer,libreoffice-calc,libreoffice-impress,libreoffice-draw,libreoffice-math,libreoffice-base-core,libreoffice-base,libreoffice-style-breeze,libreoffice-style-colibre,libreoffice-style-sifr,libreoffice-style-elementary,libreoffice-style-karasa-jaga,libreoffice-style-sukapura,libreoffice-gnome,python3-uno,libreoffice-script-provider-python,libreoffice-script-provider-bsh,libreoffice-script-provider-js,libreoffice-sdbc-hsqldb,libreoffice-sdbc-mysql,libreoffice-base-drivers,python3-access2base,python3-scriptforge,libofficebean-java,libreoffice-uiconfig-common,libreoffice-uiconfig-base,libreoffice-uiconfig-calc,libreoffice-uiconfig-draw,libreoffice-uiconfig-impress,libreoffice-uiconfig-math,libreoffice-uiconfig-writer,uno-libs-private,libuno-sal3t64,libuno-cppu3t64,ure,ure-java,libunoloader-java,liblibreoffice-java,libreoffice-wiki-publisher,libreoffice-report-builder,libreoffice-report-builder-bin,libreoffice-uiconfig-report-builder,libreoffice-nlpsolver,fonts-opensymbol,libreoffice-dev,libreoffice-dev-gui,libreoffice-dev-common,libreofficekit-dev,librust-rust-uno-dev,libreoffice-rust-uno-example,libreoffice-gtk3,gir1.2-lokdocview-0.1,libreofficekit-dev-gtk,liblibreofficekitgtk,libreofficekit-data,libreoffice-gtk4,libreoffice-kf6,libreoffice-qt6,libreoffice-plasma,libreoffice-sdbc-postgresql,libreoffice-evolution,libreoffice-subsequentcheckbase,libreoffice-smoketest-data,libreoffice-librelogo,libreoffice-sdbc-firebird
 #Restrictions: build-needed, rw-build-tree, allow-stderr, superficial, skippable
 #
 #Tests: cppunit-subsequentcheck
 #Architecture: amd64
-#Depends: @builddeps@, libreoffice,libreoffice-core,libreoffice-common,libreoffice-java-common,libreoffice-writer,libreoffice-calc,libreoffice-impress,libreoffice-draw,libreoffice-math,libreoffice-base-core,libreoffice-base,libreoffice-style-breeze,libreoffice-style-colibre,libreoffice-style-sifr,libreoffice-style-elementary,libreoffice-style-karasa-jaga,libreoffice-style-sukapura,libreoffice-gnome,python3-uno,libreoffice-script-provider-python,libreoffice-script-provider-bsh,libreoffice-script-provider-js,libreoffice-sdbc-hsqldb,libreoffice-sdbc-mysql,libreoffice-base-drivers,python3-access2base,python3-scriptforge,libofficebean-java,libreoffice-uiconfig-common,libreoffice-uiconfig-base,libreoffice-uiconfig-calc,libreoffice-uiconfig-draw,libreoffice-uiconfig-impress,libreoffice-uiconfig-math,libreoffice-uiconfig-writer,uno-libs-private,libuno-sal3t64,libuno-cppu3t64,ure,ure-java,libunoloader-java,liblibreoffice-java,libreoffice-wiki-publisher,libreoffice-report-builder,libreoffice-report-builder-bin,libreoffice-uiconfig-report-builder,libreoffice-nlpsolver,fonts-opensymbol,libreoffice-dev,libreoffice-dev-gui,libreoffice-dev-common,libreofficekit-dev,libreoffice-gtk3,gir1.2-lokdocview-0.1,libreofficekit-dev-gtk,liblibreofficekitgtk,libreofficekit-data,libreoffice-gtk4,libreoffice-kf6,libreoffice-qt6,libreoffice-plasma,libreoffice-sdbc-postgresql,libreoffice-evolution,libreoffice-subsequentcheckbase,libreoffice-smoketest-data,libreoffice-librelogo,libreoffice-sdbc-firebird
+#Depends: @builddeps@, libreoffice,libreoffice-core,libreoffice-common,libreoffice-java-common,libreoffice-writer,libreoffice-calc,libreoffice-impress,libreoffice-draw,libreoffice-math,libreoffice-base-core,libreoffice-base,libreoffice-style-breeze,libreoffice-style-colibre,libreoffice-style-sifr,libreoffice-style-elementary,libreoffice-style-karasa-jaga,libreoffice-style-sukapura,libreoffice-gnome,python3-uno,libreoffice-script-provider-python,libreoffice-script-provider-bsh,libreoffice-script-provider-js,libreoffice-sdbc-hsqldb,libreoffice-sdbc-mysql,libreoffice-base-drivers,python3-access2base,python3-scriptforge,libofficebean-java,libreoffice-uiconfig-common,libreoffice-uiconfig-base,libreoffice-uiconfig-calc,libreoffice-uiconfig-draw,libreoffice-uiconfig-impress,libreoffice-uiconfig-math,libreoffice-uiconfig-writer,uno-libs-private,libuno-sal3t64,libuno-cppu3t64,ure,ure-java,libunoloader-java,liblibreoffice-java,libreoffice-wiki-publisher,libreoffice-report-builder,libreoffice-report-builder-bin,libreoffice-uiconfig-report-builder,libreoffice-nlpsolver,fonts-opensymbol,libreoffice-dev,libreoffice-dev-gui,libreoffice-dev-common,libreofficekit-dev,librust-rust-uno-dev,libreoffice-rust-uno-example,libreoffice-gtk3,gir1.2-lokdocview-0.1,libreofficekit-dev-gtk,liblibreofficekitgtk,libreofficekit-data,libreoffice-gtk4,libreoffice-kf6,libreoffice-qt6,libreoffice-plasma,libreoffice-sdbc-postgresql,libreoffice-evolution,libreoffice-subsequentcheckbase,libreoffice-smoketest-data,libreoffice-librelogo,libreoffice-sdbc-firebird
 #Restrictions: build-needed, rw-build-tree, allow-stderr, skippable
 #
 ## Those tests even work when there is no /usr/lib/libreoffice there in any way. @builddeps@ is enough.
@@ -134,12 +134,12 @@ Restrictions: allow-stderr, superficial
 ## or whatever update broke it we should know
 #Tests: slowcheck
 #Architecture: amd64
-#Depends: @builddeps@, libreoffice,libreoffice-core,libreoffice-common,libreoffice-java-common,libreoffice-writer,libreoffice-calc,libreoffice-impress,libreoffice-draw,libreoffice-math,libreoffice-base-core,libreoffice-base,libreoffice-style-breeze,libreoffice-style-colibre,libreoffice-style-sifr,libreoffice-style-elementary,libreoffice-style-karasa-jaga,libreoffice-style-sukapura,libreoffice-gnome,python3-uno,libreoffice-script-provider-python,libreoffice-script-provider-bsh,libreoffice-script-provider-js,libreoffice-sdbc-hsqldb,libreoffice-sdbc-mysql,libreoffice-base-drivers,python3-access2base,python3-scriptforge,libofficebean-java,libreoffice-uiconfig-common,libreoffice-uiconfig-base,libreoffice-uiconfig-calc,libreoffice-uiconfig-draw,libreoffice-uiconfig-impress,libreoffice-uiconfig-math,libreoffice-uiconfig-writer,uno-libs-private,libuno-sal3t64,libuno-cppu3t64,ure,ure-java,libunoloader-java,liblibreoffice-java,libreoffice-wiki-publisher,libreoffice-report-builder,libreoffice-report-builder-bin,libreoffice-uiconfig-report-builder,libreoffice-nlpsolver,fonts-opensymbol,libreoffice-dev,libreoffice-dev-gui,libreoffice-dev-common,libreofficekit-dev,libreoffice-gtk3,gir1.2-lokdocview-0.1,libreofficekit-dev-gtk,liblibreofficekitgtk,libreofficekit-data,libreoffice-gtk4,libreoffice-kf6,libreoffice-qt6,libreoffice-plasma,libreoffice-sdbc-postgresql,libreoffice-evolution,libreoffice-subsequentcheckbase,libreoffice-smoketest-data,libreoffice-librelogo,libreoffice-sdbc-firebird
+#Depends: @builddeps@, libreoffice,libreoffice-core,libreoffice-common,libreoffice-java-common,libreoffice-writer,libreoffice-calc,libreoffice-impress,libreoffice-draw,libreoffice-math,libreoffice-base-core,libreoffice-base,libreoffice-style-breeze,libreoffice-style-colibre,libreoffice-style-sifr,libreoffice-style-elementary,libreoffice-style-karasa-jaga,libreoffice-style-sukapura,libreoffice-gnome,python3-uno,libreoffice-script-provider-python,libreoffice-script-provider-bsh,libreoffice-script-provider-js,libreoffice-sdbc-hsqldb,libreoffice-sdbc-mysql,libreoffice-base-drivers,python3-access2base,python3-scriptforge,libofficebean-java,libreoffice-uiconfig-common,libreoffice-uiconfig-base,libreoffice-uiconfig-calc,libreoffice-uiconfig-draw,libreoffice-uiconfig-impress,libreoffice-uiconfig-math,libreoffice-uiconfig-writer,uno-libs-private,libuno-sal3t64,libuno-cppu3t64,ure,ure-java,libunoloader-java,liblibreoffice-java,libreoffice-wiki-publisher,libreoffice-report-builder,libreoffice-report-builder-bin,libreoffice-uiconfig-report-builder,libreoffice-nlpsolver,fonts-opensymbol,libreoffice-dev,libreoffice-dev-gui,libreoffice-dev-common,libreofficekit-dev,librust-rust-uno-dev,libreoffice-rust-uno-example,libreoffice-gtk3,gir1.2-lokdocview-0.1,libreofficekit-dev-gtk,liblibreofficekitgtk,libreofficekit-data,libreoffice-gtk4,libreoffice-kf6,libreoffice-qt6,libreoffice-plasma,libreoffice-sdbc-postgresql,libreoffice-evolution,libreoffice-subsequentcheckbase,libreoffice-smoketest-data,libreoffice-librelogo,libreoffice-sdbc-firebird
 #Restrictions: build-needed, rw-build-tree, allow-stderr, superficial, skippable
 #
 #Tests: unitcheck
 #Architecture: amd64
-#Depends: @builddeps@, libreoffice,libreoffice-core,libreoffice-common,libreoffice-java-common,libreoffice-writer,libreoffice-calc,libreoffice-impress,libreoffice-draw,libreoffice-math,libreoffice-base-core,libreoffice-base,libreoffice-style-breeze,libreoffice-style-colibre,libreoffice-style-sifr,libreoffice-style-elementary,libreoffice-style-karasa-jaga,libreoffice-style-sukapura,libreoffice-gnome,python3-uno,libreoffice-script-provider-python,libreoffice-script-provider-bsh,libreoffice-script-provider-js,libreoffice-sdbc-hsqldb,libreoffice-sdbc-mysql,libreoffice-base-drivers,python3-access2base,python3-scriptforge,libofficebean-java,libreoffice-uiconfig-common,libreoffice-uiconfig-base,libreoffice-uiconfig-calc,libreoffice-uiconfig-draw,libreoffice-uiconfig-impress,libreoffice-uiconfig-math,libreoffice-uiconfig-writer,uno-libs-private,libuno-sal3t64,libuno-cppu3t64,ure,ure-java,libunoloader-java,liblibreoffice-java,libreoffice-wiki-publisher,libreoffice-report-builder,libreoffice-report-builder-bin,libreoffice-uiconfig-report-builder,libreoffice-nlpsolver,fonts-opensymbol,libreoffice-dev,libreoffice-dev-gui,libreoffice-dev-common,libreofficekit-dev,libreoffice-gtk3,gir1.2-lokdocview-0.1,libreofficekit-dev-gtk,liblibreofficekitgtk,libreofficekit-data,libreoffice-gtk4,libreoffice-kf6,libreoffice-qt6,libreoffice-plasma,libreoffice-sdbc-postgresql,libreoffice-evolution,libreoffice-subsequentcheckbase,libreoffice-smoketest-data,libreoffice-librelogo,libreoffice-sdbc-firebird
+#Depends: @builddeps@, libreoffice,libreoffice-core,libreoffice-common,libreoffice-java-common,libreoffice-writer,libreoffice-calc,libreoffice-impress,libreoffice-draw,libreoffice-math,libreoffice-base-core,libreoffice-base,libreoffice-style-breeze,libreoffice-style-colibre,libreoffice-style-sifr,libreoffice-style-elementary,libreoffice-style-karasa-jaga,libreoffice-style-sukapura,libreoffice-gnome,python3-uno,libreoffice-script-provider-python,libreoffice-script-provider-bsh,libreoffice-script-provider-js,libreoffice-sdbc-hsqldb,libreoffice-sdbc-mysql,libreoffice-base-drivers,python3-access2base,python3-scriptforge,libofficebean-java,libreoffice-uiconfig-common,libreoffice-uiconfig-base,libreoffice-uiconfig-calc,libreoffice-uiconfig-draw,libreoffice-uiconfig-impress,libreoffice-uiconfig-math,libreoffice-uiconfig-writer,uno-libs-private,libuno-sal3t64,libuno-cppu3t64,ure,ure-java,libunoloader-java,liblibreoffice-java,libreoffice-wiki-publisher,libreoffice-report-builder,libreoffice-report-builder-bin,libreoffice-uiconfig-report-builder,libreoffice-nlpsolver,fonts-opensymbol,libreoffice-dev,libreoffice-dev-gui,libreoffice-dev-common,libreofficekit-dev,librust-rust-uno-dev,libreoffice-rust-uno-example,libreoffice-gtk3,gir1.2-lokdocview-0.1,libreofficekit-dev-gtk,liblibreofficekitgtk,libreofficekit-data,libreoffice-gtk4,libreoffice-kf6,libreoffice-qt6,libreoffice-plasma,libreoffice-sdbc-postgresql,libreoffice-evolution,libreoffice-subsequentcheckbase,libreoffice-smoketest-data,libreoffice-librelogo,libreoffice-sdbc-firebird
 #Restrictions: build-needed, rw-build-tree, allow-stderr, superficial, skippable
 
 Tests: junit-subsequentcheck
@@ -147,6 +147,23 @@ Architecture: amd64 arm64
 Depends: @builddeps@, libreoffice-core, libreoffice-writer, libreoffice-calc, libreoffice-impress, libreoffice-math, libreoffice-base, libreoffice-subsequentcheckbase, libreoffice-sdbc-hsqldb, libreoffice-sdbc-firebird
 Restrictions: allow-stderr, skippable
 
+Tests: cargo-rust-uno-check
+Architecture: amd64 arm64 armel armhf i386 loong64 mips64el powerpc ppc64 ppc64el s390x sparc64
+# mostly taken from the autogenerated stuff debcargo would do
+Depends: dh-cargo (>= 31), rustc, librust-rust-uno-dev
+Restrictions: allow-stderr, skip-not-installable, superficial, needs-root
+
+Tests: cargo-rust-uno-test
+Architecture: amd64 arm64 armel armhf i386 loong64 mips64el powerpc ppc64 ppc64el s390x sparc64
+# mostly taken from the autogenerated stuff debcargo would do
+Depends: dh-cargo (>= 31), rustc, librust-rust-uno-dev
+Restrictions: allow-stderr, skip-not-installable, superficial
+
+Tests: test-rust_uno-example
+Achitecture: amd64 arm64 armel armhf i386 loong64 mips64el powerpc ppc64 ppc64el s390x sparc64
+Depends: libreoffice-writer-nogui, libreoffice-rust-uno-example
+Restrictions: allow-stderr, superficial, skippable, breaks-testbed
+
 ## This one tests real connection to a MySQL and works by symlinking that one
 ## specific library to the one in libreoffice-sdbc-mysql
 ## Should probably always be last due to breaks-testbed?
diff --git a/tests/control.rust.in b/tests/control.rust.in
new file mode 100644
index 000000000..805e77199
--- /dev/null
+++ b/tests/control.rust.in
@@ -0,0 +1,17 @@
+Tests: cargo-rust-uno-check
+Architecture: %OOO_RUST_ARCHS%
+# mostly taken from the autogenerated stuff debcargo would do
+Depends: dh-cargo (>= 31), rustc, librust-rust-uno-dev
+Restrictions: allow-stderr, skip-not-installable, superficial, needs-root
+
+Tests: cargo-rust-uno-test
+Architecture: %OOO_RUST_ARCHS%
+# mostly taken from the autogenerated stuff debcargo would do
+Depends: dh-cargo (>= 31), rustc, librust-rust-uno-dev
+Restrictions: allow-stderr, skip-not-installable, superficial
+
+Tests: test-rust_uno-example
+Achitecture: %OOO_RUST_ARCHS%
+Depends: libreoffice-writer-nogui, libreoffice-rust-uno-example
+Restrictions: allow-stderr, superficial, skippable, breaks-testbed
+
diff --git a/tests/test-rust_uno-example b/tests/test-rust_uno-example
new file mode 100755
index 000000000..f696b6dec
--- /dev/null
+++ b/tests/test-rust_uno-example
@@ -0,0 +1,50 @@
+#!/bin/bash
+# autopkgtest check: Install the rust_uno-example extension
+# and test its functionality, which tests the Rust-UNO bridge, too
+# (c) 2025 Software in the Public Interest, Inc.
+# Authors: Rene Engelhard <rene@debian.org>
+
+set -e
+set -E
+
+if [ -n "$AUTOPKGTEST_TMP" ]; then
+        TMP=`mktemp -q -p $AUTOPKGTEST_TMP`
+else
+        TMP=`mktemp -q`
+fi
+
+# skip if building as root:
+# unopkg errors out with "ERROR: Cannot run unopkg as root without --shared or --bundled option."
+# if ran as root
+if [ `id -u` = "0" ]; then
+	exit 77
+fi
+
+# allow macro execution.
+# The profile dir should be there since the test-extension check. if not, run a unopkg list, which should create it...
+userinst=`grep UserInstallation /usr/lib/libreoffice/program/bootstraprc | cut -d= -f2 | sed -e 's,$SYSUSERCONFIG,,'`
+if [ ! -d "$HOME/.config/$userinst" ]; then
+	unopkg list 2>&1 >/dev/null
+fi
+if ! grep -q Security\/Scripting.*SecureURL $HOME/.config/$userinst/user/registrymodifications.xcu; then
+	head -n-1 $HOME/.config/$userinst/user/registrymodifications.xcu > $TMP
+	echo "<item oor:path=\"/org.openoffice.Office.Common/Security/Scripting\"><prop oor:name=\"SecureURL\" oor:op=\"fuse\"><value><it>file://`pwd`</it><it>file://`pwd`/debian/tests</it></value></prop></item>" >> $TMP
+	echo "</oor:items>" >> $TMP
+	mv $TMP $HOME/.config/$userinst/user/registrymodifications.xcu
+else
+	if ! grep -q file://`pwd` $HOME/.config/$userinst/user/registrymodifications.xcu; then
+		sed -i "s,</it></value>,</it><it>file://`pwd`</it><it>file://`pwd`/debian/tests</it></value>," $HOME/.config/$userinst/user/registrymodifications.xcu
+	fi
+fi
+
+echo "====== Call Rust UNO -> Example menu entry provided by the extension ======"
+timeout -f -p 10 libreoffice --invisible --nologo --norestore \
+        Test.fodt macro://./Standard.Test.TestRustUNOExample | tee $TMP
+
+if grep -q "example completed successfully" $TMP; then
+        exit 0
+else
+        exit 1
+fi
+rm $TMP
+
