diff --git a/packages/omnicounter-utils-evm/src/omnicounter/factory.ts b/packages/omnicounter-utils-evm/src/omnicounter/factory.ts
new file mode 100644
index 000000000..1a08d545a
--- /dev/null
+++ b/packages/omnicounter-utils-evm/src/omnicounter/factory.ts
@@ -0,0 +1,19 @@
+import pMemoize from 'p-memoize'
+import { OmniCounter } from '@/omnicounter/sdk'
+import { createEndpointFactory } from '@layerzerolabs/protocol-utils-evm'
+import { EndpointFactory } from '@layerzerolabs/protocol-utils'
+import { OAppFactory } from '@layerzerolabs/ua-utils'
+import { OmniContractFactory } from '@layerzerolabs/utils-evm'
+
+/**
+ * Syntactic sugar that creates an instance of EVM `OmniCounter` SDK based on an `OmniPoint` with help of an
+ * `OmniContractFactory` and an (optional) `EndpointFactory`
+ *
+ * @param {OmniContractFactory} contractFactory
+ * @param {EndpointFactory} [endpointFactory]
+ * @returns {EndpointFactory<Endpoint>}
+ */
+export const createOmniCounterFactory = (
+    contractFactory: OmniContractFactory,
+    endpointFactory: EndpointFactory = createEndpointFactory(contractFactory)
+): OAppFactory<OmniCounter> => pMemoize(async (point) => new OmniCounter(await contractFactory(point), endpointFactory))
diff --git a/packages/omnicounter-utils-evm/src/omnicounter/index.ts b/packages/omnicounter-utils-evm/src/omnicounter/index.ts
index 7db67b18a..244dbb9aa 100644
--- a/packages/omnicounter-utils-evm/src/omnicounter/index.ts
+++ b/packages/omnicounter-utils-evm/src/omnicounter/index.ts
@@ -1 +1,2 @@
+export * from './factory'
 export * from './sdk'
diff --git a/packages/omnicounter-utils-evm/src/omnicounter/sdk.ts b/packages/omnicounter-utils-evm/src/omnicounter/sdk.ts
index fb8aa5feb..e6b199819 100644
--- a/packages/omnicounter-utils-evm/src/omnicounter/sdk.ts
+++ b/packages/omnicounter-utils-evm/src/omnicounter/sdk.ts
@@ -1,8 +1,17 @@
-import { IOmniCounterApp } from '@layerzerolabs/omnicounter-utils'
+import { IOmniCounter } from '@layerzerolabs/omnicounter-utils'
+import { EndpointFactory } from '@layerzerolabs/protocol-utils'
 import { OApp } from '@layerzerolabs/ua-utils-evm'
 import { OmniTransaction } from '@layerzerolabs/utils'
+import { OmniContract } from '@layerzerolabs/utils-evm'
+
+export class OmniCounter extends OApp implements IOmniCounter {
+    public constructor(
+        public override contract: OmniContract,
+        protected override endpointFactory: EndpointFactory
+    ) {
+        super(contract, endpointFactory)
+    }
 
-export class OmniCounterApp extends OApp implements IOmniCounterApp {
     public async increment(eid: number, type: number, options: string): Promise<OmniTransaction> {
         const data = this.contract.contract.interface.encodeFunctionData('increment', [eid, type, options])
         return super.createTransaction(data)
diff --git a/packages/omnicounter-utils/src/omnicounter/types.ts b/packages/omnicounter-utils/src/omnicounter/types.ts
index ffea90f87..30ff2a8ff 100644
--- a/packages/omnicounter-utils/src/omnicounter/types.ts
+++ b/packages/omnicounter-utils/src/omnicounter/types.ts
@@ -1,6 +1,6 @@
 import { OmniTransaction } from '@layerzerolabs/utils'
 import { EndpointId } from '@layerzerolabs/lz-definitions'
 
-export interface IOmniCounterApp {
+export interface IOmniCounter {
     increment(eid: EndpointId, type: number, options: string): Promise<OmniTransaction>
 }
diff --git a/packages/ua-utils-evm/src/oapp/sdk.ts b/packages/ua-utils-evm/src/oapp/sdk.ts
index 1edd043a7..e740acc61 100644
--- a/packages/ua-utils-evm/src/oapp/sdk.ts
+++ b/packages/ua-utils-evm/src/oapp/sdk.ts
@@ -15,7 +15,7 @@ import { OmniSDK } from '@layerzerolabs/utils-evm'
 export class OApp extends OmniSDK implements IOApp {
     constructor(
         contract: OmniContract,
-        private readonly endpointFactory: EndpointFactory
+        protected readonly endpointFactory: EndpointFactory
     ) {
         super(contract)
     }