diff --git a/packages/match/LICENSE b/packages/match/LICENSE
new file mode 100644
index 000000000..38b41d975
--- /dev/null
+++ b/packages/match/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2021 Solid Primitives Working Group
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/packages/match/README.md b/packages/match/README.md
new file mode 100644
index 000000000..8b0db799f
--- /dev/null
+++ b/packages/match/README.md
@@ -0,0 +1,132 @@
+
+
+
+
+# @solid-primitives/match
+
+[](https://bundlephobia.com/package/@solid-primitives/match)
+[](https://www.npmjs.com/package/@solid-primitives/match)
+[](https://github.com/solidjs-community/solid-primitives#contribution-process)
+
+Control-flow components for matching discriminated union (tagged union) members and union literals.
+
+## Installation
+
+```bash
+npm install @solid-primitives/match
+# or
+yarn add @solid-primitives/match
+# or
+pnpm add @solid-primitives/match
+```
+
+## `MatchTag`
+
+Control-flow component for matching discriminated union (tagged union) members.
+
+### How to use it
+
+```tsx
+type MyUnion = {
+ type: "foo",
+ foo: "foo-value",
+} | {
+ type: "bar",
+ bar: "bar-value",
+}
+
+const [value, setValue] = createSignal({type: "foo", foo: "foo-value"})
+
+ <>{v().foo}>,
+ bar: v => <>{v().bar}>,
+}} />
+```
+
+### Changing the tag key
+
+The default tag key is `"type"`, but it can be changed with the `tag` prop:
+
+```tsx
+type MyUnion = {
+ kind: "foo",
+ foo: "foo-value",
+} | {
+ kind: "bar",
+ bar: "bar-value",
+}
+
+ <>{v().foo}>,
+ bar: v => <>{v().bar}>,
+}} />
+```
+
+### Partial matching
+
+Use the `partial` prop to only handle some of the union members:
+
+```tsx
+ <>{v().foo}>,
+ // bar case is not handled
+}} />
+```
+
+### Fallback
+
+Provide a fallback element when no match is found or the value is `null`/`undefined`:
+
+```tsx
+ <>{v().foo}>,
+ bar: v => <>{v().bar}>,
+}} fallback={
No match found
} />
+```
+
+## `MatchValue`
+
+Control-flow component for matching union literals.
+
+### How to use it
+
+```tsx
+type MyUnion = "foo" | "bar";
+
+const [value, setValue] = createSignal("foo");
+
+
foo
,
+ bar: () =>
bar
,
+}} />
+```
+
+### Partial matching
+
+Use the `partial` prop to only handle some of the union members:
+
+```tsx
+
foo
,
+ // bar case is not handled
+}} />
+```
+
+### Fallback
+
+Provide a fallback element when no match is found or the value is `null`/`undefined`:
+
+```tsx
+