diff --git a/web/src/models/pattern-model.ts b/web/src/models/pattern-model.ts
index 447786399566a001b11af052ea36c1d403e4acf1..94c3fa8ed0d42af697e7f03e457cb69beaf2ba6d 100644
--- a/web/src/models/pattern-model.ts
+++ b/web/src/models/pattern-model.ts
@@ -4,3 +4,8 @@ export interface Pattern {
   description: string
   numberOfImplementations: number
 }
+
+export interface CreatePatternRequest {
+  title: string
+  description: string
+}
diff --git a/web/src/pages/Patterns/add-pattern/add-pattern-button.tsx b/web/src/pages/Patterns/add-pattern/add-pattern-button.tsx
index 8c8c6c5bf886bfcb2c7b5f3500b826c099329a9c..5a2cd11c37a7e811412d02784f92c690ab6c9282 100644
--- a/web/src/pages/Patterns/add-pattern/add-pattern-button.tsx
+++ b/web/src/pages/Patterns/add-pattern/add-pattern-button.tsx
@@ -21,6 +21,10 @@ import {
   Textarea,
 } from '@chakra-ui/react'
 import { useFormik } from 'formik'
+import { useQueryClient } from 'react-query'
+
+import { GetPatternsQuery } from '../query-builder'
+import { CreatePatternMutation } from '../query-builder/create-pattern-mutation'
 
 import { CreatePatternSchema, createPatternSchema } from './schema'
 
@@ -28,9 +32,20 @@ const FORM_ID = 'add-pattern-form'
 
 export const AddPatternButton: React.FC<ButtonProps> = () => {
   const { isOpen, onClose, onOpen } = useDisclosure()
+  const queryClient = useQueryClient()
+
+  const createMutation = CreatePatternMutation.useMutation({
+    onSuccess: () => {
+      queryClient.invalidateQueries(GetPatternsQuery.getKey({}))
+    },
+  })
 
-  const handleOnSubmit = (values: CreatePatternSchema) => {
-    console.log(values)
+  const handleOnSubmit = async (values: CreatePatternSchema) => {
+    await createMutation.mutateAsync({
+      title: values.title,
+      description: values.description,
+    })
+    onClose()
   }
 
   const {
@@ -72,7 +87,10 @@ export const AddPatternButton: React.FC<ButtonProps> = () => {
               <VStack>
                 <FormControl isInvalid={Boolean(errors.title) && touched.title}>
                   <FormLabel>
-                    <Text fontSize="sm">Titulo</Text>
+                    <HStack>
+                      <Text fontSize="sm">Titulo</Text>
+                      <Text color="red">*</Text>
+                    </HStack>
                   </FormLabel>
                   <Input
                     name="title"
@@ -89,7 +107,10 @@ export const AddPatternButton: React.FC<ButtonProps> = () => {
                   isInvalid={Boolean(errors.description) && touched.description}
                 >
                   <FormLabel>
-                    <Text fontSize="sm">Descripcion</Text>
+                    <HStack>
+                      <Text fontSize="sm">Descripcion</Text>
+                      <Text color="red">*</Text>
+                    </HStack>
                   </FormLabel>
                   <Textarea
                     name="description"
diff --git a/web/src/pages/Patterns/query-builder/create-pattern-mutation.ts b/web/src/pages/Patterns/query-builder/create-pattern-mutation.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a18e1c5c33b96f33975966f79444845f3f4b810e
--- /dev/null
+++ b/web/src/pages/Patterns/query-builder/create-pattern-mutation.ts
@@ -0,0 +1,22 @@
+import { AxiosError } from 'axios'
+import { useMutation as useRQMutation, UseMutationOptions } from 'react-query'
+
+import { CreatePatternRequest, Pattern } from 'src/models'
+import axiosService from 'src/services/axios-service'
+
+export namespace CreatePatternMutation {
+  export type Params = CreatePatternRequest
+
+  export type Response = Pattern
+
+  export const key = ['create', 'pattern']
+
+  export const mutationFn = (params: Params) =>
+    axiosService.post<Response>(`/pattern/`, params).then((res) => res.data)
+
+  export const useMutation = (
+    options: UseMutationOptions<Response, AxiosError, CreatePatternRequest> = {}
+  ) => {
+    return useRQMutation(mutationFn, { ...options, mutationKey: key })
+  }
+}