diff --git a/docs/rules/no-unmerged-classname.md b/docs/rules/no-unmerged-classname.md
new file mode 100644
index 0000000..02c253f
--- /dev/null
+++ b/docs/rules/no-unmerged-classname.md
@@ -0,0 +1,75 @@
+# Ensure className is merged with spread props (no-unmerged-classname)
+
+When using spread props (`{...rest}`, `{...props}`, etc.) along with a `className` prop, you should merge the className from the spread props with your custom className to avoid unintentionally overriding classes.
+
+## Rule details
+
+This rule warns when a component has spread props before a `className` prop, but the `className` doesn't appear to be merging values using a utility like `clsx()` or `classNames()`.
+
+👎 Examples of **incorrect** code for this rule:
+
+```jsx
+/* eslint primer-react/no-unmerged-classname: "error" */
+
+// ❌ className may override className from rest
+ {}} />
+
+// ❌ onChange expression doesn't merge
+ console.log('clicked')} />
+  // If rest contains { onClick: importantHandler }
+  // Result: importantHandler never gets called!
+}
+
+// ✅ Good: onClick from rest is preserved and composed
+function MyComponent({onClick, ...rest}) {
+  return  console.log('clicked'))} />
+  // If rest contains { onClick: importantHandler }
+  // Result: Both importantHandler and the log function get called!
+}
+```
+
+## Detected Event Handlers
+
+This rule checks for the following event handler props:
+
+- Mouse events: `onClick`, `onDoubleClick`, `onContextMenu`, `onMouseDown`, `onMouseUp`, `onMouseEnter`, `onMouseLeave`, `onMouseMove`, `onMouseOver`, `onMouseOut`
+- Touch events: `onTouchStart`, `onTouchEnd`, `onTouchMove`, `onTouchCancel`
+- Keyboard events: `onKeyDown`, `onKeyUp`, `onKeyPress`
+- Form events: `onChange`, `onSubmit`, `onInput`, `onInvalid`, `onSelect`
+- Focus events: `onFocus`, `onBlur`
+- Drag events: `onDrag`, `onDragEnd`, `onDragEnter`, `onDragExit`, `onDragLeave`, `onDragOver`, `onDragStart`, `onDrop`
+- Other events: `onScroll`, `onWheel`, `onLoad`, `onError`, `onAbort`
+- Media events: `onCanPlay`, `onCanPlayThrough`, `onDurationChange`, `onEmptied`, `onEncrypted`, `onEnded`, `onLoadedData`, `onLoadedMetadata`, `onLoadStart`, `onPause`, `onPlay`, `onPlaying`, `onProgress`, `onRateChange`, `onSeeked`, `onSeeking`, `onStalled`, `onSuspend`, `onTimeUpdate`, `onVolumeChange`, `onWaiting`
+- Animation/Transition events: `onAnimationStart`, `onAnimationEnd`, `onAnimationIteration`, `onTransitionEnd`
+
+## Options
+
+This rule has no configuration options.
+
+## When to use this rule
+
+Use this rule when your components accept and spread props that might contain event handlers. This is common in component libraries and wrapper components.
+
+## Related Rules
+
+- [spread-props-first](./spread-props-first.md) - Ensures spread props come before named props
+- [no-unmerged-classname](./no-unmerged-classname.md) - Ensures className is merged with spread props
diff --git a/src/index.js b/src/index.js
index 89b99bf..921921a 100644
--- a/src/index.js
+++ b/src/index.js
@@ -21,6 +21,8 @@ module.exports = {
     'enforce-css-module-default-import': require('./rules/enforce-css-module-default-import'),
     'use-styled-react-import': require('./rules/use-styled-react-import'),
     'spread-props-first': require('./rules/spread-props-first'),
+    'no-unmerged-classname': require('./rules/no-unmerged-classname'),
+    'no-unmerged-event-handler': require('./rules/no-unmerged-event-handler'),
   },
   configs: {
     recommended: require('./configs/recommended'),
diff --git a/src/rules/__tests__/no-unmerged-classname.test.js b/src/rules/__tests__/no-unmerged-classname.test.js
new file mode 100644
index 0000000..4b6aba2
--- /dev/null
+++ b/src/rules/__tests__/no-unmerged-classname.test.js
@@ -0,0 +1,71 @@
+const rule = require('../no-unmerged-classname')
+const {RuleTester} = require('eslint')
+
+const ruleTester = new RuleTester({
+  languageOptions: {
+    ecmaVersion: 'latest',
+    sourceType: 'module',
+    parserOptions: {
+      ecmaFeatures: {
+        jsx: true,
+      },
+    },
+  },
+})
+
+ruleTester.run('no-unmerged-classname', rule, {
+  valid: [
+    // No spread props - OK
+    ` {}} />`,
+      errors: [
+        {
+          messageId: 'noUnmergedEventHandler',
+          data: {handlerName: 'onClick'},
+        },
+      ],
+    },
+    // onChange after spread - PROBLEM
+    {
+      code: `