diff --git a/update_desktop.sh b/update_desktop.sh
index b7f2dea7289212460a0df629c8c57c21b5c6bd8a..65585f948a44535820f54335c8b866db8e7a0031 100644
--- a/update_desktop.sh
+++ b/update_desktop.sh
@@ -19,6 +19,14 @@ function full_update(){
   git branch -D "$apply_branch"
 }
 
+function apply_patch(){
+  patch_name="$(basename $1 | cut -d '.' -f1)"
+  patch_path="$(readlink -f "$1")"
+  pushd "{{dwm_dir}}"
+  git checkout -b "patch/$patch_name"
+  patch < "$patch_path"
+}
+
 function show_help(){
   echo -e "Update your DWM based on your cureent config."
   echo -e "Your local config can be found in {{dwm_dir}}\n"
@@ -26,43 +34,58 @@ function show_help(){
   echo -e "\t-h, --help\tShow this message."
   echo -e "\t-f, --full\tRun full update."
   echo -e "\t-l, --local\tRun local update."
+  echo -e "\t-a, --apply\tApply a patch and create new git branch."
 }
 
 function main(){
   local show_help=0
   local full_update=0
   local local_update=0
+  local patch_to_apply=""
 
   while [[ "$#" -gt 0 ]]; do
       case $1 in
           -f|--full) full_update=1 ;;
           -h|--help) show_help=1 ;;
           -l|--local) local_update=1 ;;
+          -a|--apply) patch_to_apply="$2"; shift ;;
+          -al)patch_to_apply="$2"; shift; local_update=1;;
+          -af)patch_to_apply="$2"; shift; full_update=1;;
           *) echo "Unknown parameter passed: $1"; exit 1 ;;
       esac
       shift
   done
-
+  
   if [[ show_help -eq 1 ]];then
+    pushd "{{dwm_dir}}"
     show_help
     exit 0
   fi
 
+  if [[ -n "$patch_to_apply" ]];then
+    apply_patch "$patch_to_apply"
+    popd
+    if [[ $((full_update + local_update)) -eq 0 ]];then
+      exit 0
+    fi
+  fi
+
   if [[ full_update -eq 1 ]];then
+    pushd "{{dwm_dir}}"
     full_update
     exit 0
   fi
 
   if [[ local_update -eq 1 ]];then
+    pushd "{{dwm_dir}}"
     local_update
     exit 0
   fi
-
+  
+  pushd "{{dwm_dir}}"
   show_help
   exit 0
 }
 
-pushd "{{dwm_dir}}"
 trap popd EXIT
-
 main "$@"