diff --git a/.github/workflows/c26-build-container.yml b/.github/workflows/c26-build-container.yml
new file mode 100644
index 0000000..c250ad1
--- /dev/null
+++ b/.github/workflows/c26-build-container.yml
@@ -0,0 +1,28 @@
+name: C++26 Build and Test
+
+on:
+  push:
+    branches:
+      - main
+  pull_request:
+    branches:
+      - main
+
+jobs:
+  build:
+    runs-on: ubuntu-latest
+
+    steps:
+      - name: Checkout repository
+        uses: actions/checkout@v3
+
+      - name: Set up Docker Buildx
+        uses: docker/setup-buildx-action@v2
+
+      - name: Build Docker image
+        run: |
+          docker build -t cpp26-app .
+
+      - name: Run tests in Docker container
+        run: |
+          docker run --rm cpp26-app /bin/bash -c "cd /workspace && cmake -B build"
\ No newline at end of file
diff --git a/benchmarks/simpleparser/from_json.hpp b/benchmarks/simpleparser/from_json.hpp
index 1a8fdb5..a5e6e6d 100644
--- a/benchmarks/simpleparser/from_json.hpp
+++ b/benchmarks/simpleparser/from_json.hpp
@@ -45,7 +45,7 @@ void from_json(const JsonValue& j, T& obj) requires(simdjson::json_builder::User
     }
 
     // Using reflection to iterate over data members
-    [:simdjson::json_builder::expand(std::meta::nonstatic_data_members_of(^T)):] >> [&]<auto dm> {
+    [:simdjson::json_builder::expand(std::meta::nonstatic_data_members_of(^^T)):] >> [&]<auto dm> {
         constexpr auto name = std::meta::identifier_of(dm);
         auto it = j.object_value.find(std::string(reinterpret_cast<const char*>(name.data()), name.size()));
         if (it != j.object_value.end()) {
diff --git a/include/simdjson/json_builder/json_builder.h b/include/simdjson/json_builder/json_builder.h
index 4f6a435..cfb87ed 100644
--- a/include/simdjson/json_builder/json_builder.h
+++ b/include/simdjson/json_builder/json_builder.h
@@ -48,7 +48,7 @@ template <typename R> consteval auto expand(R range) {
   for (auto r : range) {
     args.push_back(std::meta::reflect_value(r));
   }
-  return substitute(^__impl::replicator, args);
+  return substitute(^^__impl::replicator, args);
 }
 // end of workaround
 
@@ -88,7 +88,7 @@ template <class T>
 constexpr void atom(string_builder &b, const T &t) {
   int i = 0;
   b.append('{');
-  [:expand(std::meta::nonstatic_data_members_of(^T)):] >> [&]<auto dm> {
+  [:expand(std::meta::nonstatic_data_members_of(^^T)):] >> [&]<auto dm> {
     if (i != 0)
       b.append(',');
     constexpr auto v =
@@ -106,7 +106,7 @@ constexpr void atom(string_builder &b, const T &t) {
 template <class Z> void fast_to_json_string(string_builder &b, const Z &z) {
   int i = 0;
   b.append('{');
-  [:expand(std::meta::nonstatic_data_members_of(^Z)):] >> [&]<auto dm> {
+  [:expand(std::meta::nonstatic_data_members_of(^^Z)):] >> [&]<auto dm> {
     if (i != 0)
       b.append(',');
     constexpr auto v =
diff --git a/include/simdjson/json_builder/string_builder.h b/include/simdjson/json_builder/string_builder.h
index 45e2c3d..9ec278c 100644
--- a/include/simdjson/json_builder/string_builder.h
+++ b/include/simdjson/json_builder/string_builder.h
@@ -6,6 +6,7 @@
 #include <string>
 #include <string_view>
 #include <vector>
+#include <memory>
 
 namespace simdjson {
 
diff --git a/include/simdjson/json_builder/universal_formatter.h b/include/simdjson/json_builder/universal_formatter.h
index e32a745..c6e08a7 100644
--- a/include/simdjson/json_builder/universal_formatter.h
+++ b/include/simdjson/json_builder/universal_formatter.h
@@ -1,6 +1,7 @@
 #ifndef SIMDJSON_SERIALIZATION_UNIVERSAL_FORMATTER_HPP
 #define SIMDJSON_SERIALIZATION_UNIVERSAL_FORMATTER_HPP
-#include "simdjson/json_builder/string_builder.hpp"
+#include "simdjson/json_builder/string_builder.h"
+#include "simdjson/json_builder/json_builder.h"
 #include <experimental/meta>
 #include <format>
 #include <print>
@@ -22,16 +23,16 @@ struct universal_formatter {
       first = false;
     };
 
-    [:expand(bases_of(^T)):] >> [&]<auto base> {
+    [:expand(bases_of(^^T)):] >> [&]<auto base> {
       delim();
       sb.append(std::format("{}", (typename[:type_of(base):] const &)(t)));
     };
 
-    [:expand(nonstatic_data_members_of(^T)):] >> [&]<auto mem> {
-      delim();
-      sb.append(std::format("\"{}\":{}", name_of(mem),
-                            json_builder::atom(sb, t.[:mem:])));
-    };
+//    [:expand(nonstatic_data_members_of(^^T)):] >> [&]<auto mem> {
+//      delim();
+//      sb.append(std::format("\"{}\":{}", identifier_of(mem),
+//                            json_builder::atom(sb, t.[:mem:])));
+//    };
 
     sb.append('}');
   }
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 7db201a..1256c52 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -1,5 +1,15 @@
+CPMAddPackage(
+    NAME GTest
+    GITHUB_REPOSITORY google/googletest
+    VERSION 1.15.2
+)
+
 add_compile_options(-Wall -Wextra -Weffc++ -Wsign-compare -Wshadow -Wwrite-strings -Wpointer-arith -Winit-self -Wconversion -Wno-sign-conversion)
 
 add_executable(user_profile_tests user_profile_tests.cpp)
 target_link_libraries(user_profile_tests nlohmann_json::nlohmann_json simdjson::serialization simdjson::simdjson)
-add_test(user_profile_tests user_profile_tests)
\ No newline at end of file
+add_test(user_profile_tests user_profile_tests)
+
+add_executable(universal_formatter_tests universal_formatter_tests.cpp)
+target_link_libraries(universal_formatter_tests simdjson::serialization simdjson::simdjson GTest::gtest_main)
+add_test(universal_formatter_tests universal_formatter_tests)
\ No newline at end of file
diff --git a/tests/universal_formatter_tests.cpp b/tests/universal_formatter_tests.cpp
new file mode 100644
index 0000000..05b4552
--- /dev/null
+++ b/tests/universal_formatter_tests.cpp
@@ -0,0 +1,13 @@
+#include "simdjson/json_builder/universal_formatter.h"
+#include <gtest/gtest.h>
+
+TEST(UniversalFormatterTest, EmptyStruct) {
+  struct Empty {};
+
+  Empty obj;
+  simdjson::json_builder::universal_formatter universal_formatter;
+  simdjson::json_builder::string_builder string_builder;
+  universal_formatter.format(obj, string_builder);
+
+  EXPECT_EQ(string_builder.view(), "{}");
+}
\ No newline at end of file
diff --git a/tests/user_profile_tests.cpp b/tests/user_profile_tests.cpp
index 29f8cba..0d04115 100644
--- a/tests/user_profile_tests.cpp
+++ b/tests/user_profile_tests.cpp
@@ -22,7 +22,7 @@ template <auto B, auto E, typename F> constexpr void for_range(F &&f) {
 }
 
 template <typename T> consteval auto member_info(int n) {
-  return nonstatic_data_members_of(^T)[n];
+  return nonstatic_data_members_of(^^T)[n];
 }
 
 std::mt19937 rng(12345);
@@ -195,7 +195,7 @@ std::string nlohmann_serialize(const User &user) {
 template <typename T>
 bool compare(const T &user1, const T &user2, const std::string &json) {
   bool result = true;
-  for_range<0, nonstatic_data_members_of(^T).size()>([&]<auto i>() {
+  for_range<0, nonstatic_data_members_of(^^T).size()>([&]<auto i>() {
     constexpr auto mem = member_info<T>(i);
     if constexpr (std::equality_comparable<typename[:type_of(mem):]>) {
       if (user1.[:mem:] != user2.[:mem:]) {