diff --git a/examples/fabric-bridge-app/fabric-bridge-common/BUILD.gn b/examples/fabric-bridge-app/fabric-bridge-common/BUILD.gn
index 70d9586..3bc4c23 100644
--- a/examples/fabric-bridge-app/fabric-bridge-common/BUILD.gn
+++ b/examples/fabric-bridge-app/fabric-bridge-common/BUILD.gn
@@ -13,13 +13,32 @@
 # limitations under the License.
 
 import("//build_overrides/chip.gni")
-
 import("${chip_root}/src/app/chip_data_model.gni")
 
+config("config") {
+  include_dirs = [ "include" ]
+}
+
 chip_data_model("fabric-bridge-common") {
   zap_file = "fabric-bridge-app.zap"
-
   is_server = true
-
   cflags = [ "-DDYNAMIC_ENDPOINT_COUNT=16" ]
 }
+
+source_set("fabric-bridge-lib") {
+  public_configs = [ ":config" ]
+
+  sources = [
+    "include/CHIPProjectAppConfig.h",
+    "include/Device.h",
+    "include/DeviceManager.h",
+    "src/Device.cpp",
+    "src/DeviceManager.cpp",
+    "src/ZCLCallbacks.cpp",
+  ]
+
+  deps = [
+    "${chip_root}/examples/fabric-bridge-app/fabric-bridge-common",
+    "${chip_root}/src/lib",
+  ]
+}
diff --git a/examples/fabric-bridge-app/linux/include/Device.h b/examples/fabric-bridge-app/fabric-bridge-common/include/Device.h
similarity index 100%
rename from examples/fabric-bridge-app/linux/include/Device.h
rename to examples/fabric-bridge-app/fabric-bridge-common/include/Device.h
diff --git a/examples/fabric-bridge-app/linux/include/DeviceManager.h b/examples/fabric-bridge-app/fabric-bridge-common/include/DeviceManager.h
similarity index 100%
rename from examples/fabric-bridge-app/linux/include/DeviceManager.h
rename to examples/fabric-bridge-app/fabric-bridge-common/include/DeviceManager.h
diff --git a/examples/fabric-bridge-app/linux/Device.cpp b/examples/fabric-bridge-app/fabric-bridge-common/src/Device.cpp
similarity index 100%
rename from examples/fabric-bridge-app/linux/Device.cpp
rename to examples/fabric-bridge-app/fabric-bridge-common/src/Device.cpp
diff --git a/examples/fabric-bridge-app/linux/DeviceManager.cpp b/examples/fabric-bridge-app/fabric-bridge-common/src/DeviceManager.cpp
similarity index 100%
rename from examples/fabric-bridge-app/linux/DeviceManager.cpp
rename to examples/fabric-bridge-app/fabric-bridge-common/src/DeviceManager.cpp
diff --git a/examples/fabric-bridge-app/fabric-bridge-common/src/ZCLCallbacks.cpp b/examples/fabric-bridge-app/fabric-bridge-common/src/ZCLCallbacks.cpp
new file mode 100644
index 0000000..7a9521f
--- /dev/null
+++ b/examples/fabric-bridge-app/fabric-bridge-common/src/ZCLCallbacks.cpp
@@ -0,0 +1,92 @@
+/*
+ *
+ *    Copyright (c) 2024 Project CHIP Authors
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+
+#include "DeviceManager.h"
+
+#include <app-common/zap-generated/cluster-objects.h>
+#include <app-common/zap-generated/ids/Attributes.h>
+#include <app-common/zap-generated/ids/Clusters.h>
+#include <lib/support/ZclString.h>
+
+using namespace ::chip;
+using namespace ::chip::app::Clusters;
+
+#define ZCL_DESCRIPTOR_CLUSTER_REVISION (1u)
+#define ZCL_BRIDGED_DEVICE_BASIC_INFORMATION_CLUSTER_REVISION (2u)
+#define ZCL_BRIDGED_DEVICE_BASIC_INFORMATION_FEATURE_MAP (0u)
+
+// External attribute read callback function
+Protocols::InteractionModel::Status emberAfExternalAttributeReadCallback(EndpointId endpoint, ClusterId clusterId,
+                                                                         const EmberAfAttributeMetadata * attributeMetadata,
+                                                                         uint8_t * buffer, uint16_t maxReadLength)
+{
+    uint16_t endpointIndex  = emberAfGetDynamicIndexFromEndpoint(endpoint);
+    AttributeId attributeId = attributeMetadata->attributeId;
+
+    Device * dev = DeviceMgr().GetDevice(endpointIndex);
+    if (dev != nullptr && clusterId == app::Clusters::BridgedDeviceBasicInformation::Id)
+    {
+        using namespace app::Clusters::BridgedDeviceBasicInformation::Attributes;
+        ChipLogProgress(NotSpecified, "HandleReadBridgedDeviceBasicAttribute: attrId=%d, maxReadLength=%d", attributeId,
+                        maxReadLength);
+
+        if ((attributeId == Reachable::Id) && (maxReadLength == 1))
+        {
+            *buffer = dev->IsReachable() ? 1 : 0;
+        }
+        else if ((attributeId == NodeLabel::Id) && (maxReadLength == 32))
+        {
+            MutableByteSpan zclNameSpan(buffer, maxReadLength);
+            MakeZclCharString(zclNameSpan, dev->GetName());
+        }
+        else if ((attributeId == ClusterRevision::Id) && (maxReadLength == 2))
+        {
+            uint16_t rev = ZCL_BRIDGED_DEVICE_BASIC_INFORMATION_CLUSTER_REVISION;
+            memcpy(buffer, &rev, sizeof(rev));
+        }
+        else if ((attributeId == FeatureMap::Id) && (maxReadLength == 4))
+        {
+            uint32_t featureMap = ZCL_BRIDGED_DEVICE_BASIC_INFORMATION_FEATURE_MAP;
+            memcpy(buffer, &featureMap, sizeof(featureMap));
+        }
+        else
+        {
+            return Protocols::InteractionModel::Status::Failure;
+        }
+        return Protocols::InteractionModel::Status::Success;
+    }
+
+    return Protocols::InteractionModel::Status::Failure;
+}
+
+// External attribute write callback function
+Protocols::InteractionModel::Status emberAfExternalAttributeWriteCallback(EndpointId endpoint, ClusterId clusterId,
+                                                                          const EmberAfAttributeMetadata * attributeMetadata,
+                                                                          uint8_t * buffer)
+{
+    uint16_t endpointIndex                  = emberAfGetDynamicIndexFromEndpoint(endpoint);
+    Protocols::InteractionModel::Status ret = Protocols::InteractionModel::Status::Failure;
+
+    Device * dev = DeviceMgr().GetDevice(endpointIndex);
+    if (dev != nullptr && dev->IsReachable())
+    {
+        ChipLogProgress(NotSpecified, "emberAfExternalAttributeWriteCallback: ep=%d, clusterId=%d", endpoint, clusterId);
+        ret = Protocols::InteractionModel::Status::Success;
+    }
+
+    return ret;
+}
diff --git a/examples/fabric-bridge-app/linux/BUILD.gn b/examples/fabric-bridge-app/linux/BUILD.gn
index 2b408d5..d0f60f3 100644
--- a/examples/fabric-bridge-app/linux/BUILD.gn
+++ b/examples/fabric-bridge-app/linux/BUILD.gn
@@ -33,15 +33,12 @@
 executable("fabric-bridge-app") {
   sources = [
     "${chip_root}/examples/fabric-bridge-app/fabric-bridge-common/include/CHIPProjectAppConfig.h",
-    "Device.cpp",
-    "DeviceManager.cpp",
-    "include/Device.h",
-    "include/DeviceManager.h",
     "main.cpp",
   ]
 
   deps = [
     "${chip_root}/examples/fabric-bridge-app/fabric-bridge-common",
+    "${chip_root}/examples/fabric-bridge-app/fabric-bridge-common:fabric-bridge-lib",
     "${chip_root}/examples/platform/linux:app-main",
     "${chip_root}/src/lib",
   ]
diff --git a/examples/fabric-bridge-app/linux/main.cpp b/examples/fabric-bridge-app/linux/main.cpp
index 2047e15..0aa22b8 100644
--- a/examples/fabric-bridge-app/linux/main.cpp
+++ b/examples/fabric-bridge-app/linux/main.cpp
@@ -23,7 +23,6 @@
 #include "DeviceManager.h"
 
 #include <app/AttributeAccessInterfaceRegistry.h>
-#include <lib/support/ZclString.h>
 
 #if defined(PW_RPC_FABRIC_BRIDGE_SERVICE) && PW_RPC_FABRIC_BRIDGE_SERVICE
 #include "RpcClient.h"
@@ -40,10 +39,6 @@
 using namespace chip::app::Clusters;
 using namespace chip::app::Clusters::AdministratorCommissioning;
 
-#define ZCL_DESCRIPTOR_CLUSTER_REVISION (1u)
-#define ZCL_BRIDGED_DEVICE_BASIC_INFORMATION_CLUSTER_REVISION (2u)
-#define ZCL_BRIDGED_DEVICE_BASIC_INFORMATION_FEATURE_MAP (0u)
-
 namespace {
 
 constexpr uint16_t kPollIntervalMs = 100;
@@ -158,6 +153,8 @@
 
 void ApplicationInit()
 {
+    ChipLogDetail(NotSpecified, "Fabric-Bridge: ApplicationInit()");
+
     InteractionModelEngine::GetInstance()->RegisterCommandHandler(&gAdministratorCommissioningCommandHandler);
 
 #if defined(PW_RPC_FABRIC_BRIDGE_SERVICE) && PW_RPC_FABRIC_BRIDGE_SERVICE
@@ -172,7 +169,10 @@
     DeviceMgr().Init();
 }
 
-void ApplicationShutdown() {}
+void ApplicationShutdown()
+{
+    ChipLogDetail(NotSpecified, "Fabric-Bridge: ApplicationShutdown()");
+}
 
 int main(int argc, char * argv[])
 {
@@ -185,65 +185,3 @@
 
     return 0;
 }
-
-// External attribute read callback function
-Protocols::InteractionModel::Status emberAfExternalAttributeReadCallback(EndpointId endpoint, ClusterId clusterId,
-                                                                         const EmberAfAttributeMetadata * attributeMetadata,
-                                                                         uint8_t * buffer, uint16_t maxReadLength)
-{
-    uint16_t endpointIndex  = emberAfGetDynamicIndexFromEndpoint(endpoint);
-    AttributeId attributeId = attributeMetadata->attributeId;
-
-    Device * dev = DeviceMgr().GetDevice(endpointIndex);
-    if (dev != nullptr && clusterId == app::Clusters::BridgedDeviceBasicInformation::Id)
-    {
-        using namespace app::Clusters::BridgedDeviceBasicInformation::Attributes;
-        ChipLogProgress(NotSpecified, "HandleReadBridgedDeviceBasicAttribute: attrId=%d, maxReadLength=%d", attributeId,
-                        maxReadLength);
-
-        if ((attributeId == Reachable::Id) && (maxReadLength == 1))
-        {
-            *buffer = dev->IsReachable() ? 1 : 0;
-        }
-        else if ((attributeId == NodeLabel::Id) && (maxReadLength == 32))
-        {
-            MutableByteSpan zclNameSpan(buffer, maxReadLength);
-            MakeZclCharString(zclNameSpan, dev->GetName());
-        }
-        else if ((attributeId == ClusterRevision::Id) && (maxReadLength == 2))
-        {
-            uint16_t rev = ZCL_BRIDGED_DEVICE_BASIC_INFORMATION_CLUSTER_REVISION;
-            memcpy(buffer, &rev, sizeof(rev));
-        }
-        else if ((attributeId == FeatureMap::Id) && (maxReadLength == 4))
-        {
-            uint32_t featureMap = ZCL_BRIDGED_DEVICE_BASIC_INFORMATION_FEATURE_MAP;
-            memcpy(buffer, &featureMap, sizeof(featureMap));
-        }
-        else
-        {
-            return Protocols::InteractionModel::Status::Failure;
-        }
-        return Protocols::InteractionModel::Status::Success;
-    }
-
-    return Protocols::InteractionModel::Status::Failure;
-}
-
-// External attribute write callback function
-Protocols::InteractionModel::Status emberAfExternalAttributeWriteCallback(EndpointId endpoint, ClusterId clusterId,
-                                                                          const EmberAfAttributeMetadata * attributeMetadata,
-                                                                          uint8_t * buffer)
-{
-    uint16_t endpointIndex                  = emberAfGetDynamicIndexFromEndpoint(endpoint);
-    Protocols::InteractionModel::Status ret = Protocols::InteractionModel::Status::Failure;
-
-    Device * dev = DeviceMgr().GetDevice(endpointIndex);
-    if (dev != nullptr && dev->IsReachable())
-    {
-        ChipLogProgress(NotSpecified, "emberAfExternalAttributeWriteCallback: ep=%d, clusterId=%d", endpoint, clusterId);
-        ret = Protocols::InteractionModel::Status::Success;
-    }
-
-    return ret;
-}
