diff --git a/after/ftplugin/python.vim b/after/ftplugin/python.vim
index b4a2fb7..7d904a3 100644
--- a/after/ftplugin/python.vim
+++ b/after/ftplugin/python.vim
@@ -28,3 +28,46 @@ let python_highlight_all=1
 
 " Mappings
 nnoremap K :YcmCompleter GetDoc<CR>
+
+" Set custom fold expression
+setlocal foldmethod=expr
+setlocal foldexpr=PythonFold(v:lnum)
+
+" Custom fold function greedyily matches following blank lines
+function! PythonFold(lnum)
+  let l:line = getline(a:lnum)
+
+  " Blank lines, comments, and docstrings use previous fold level
+  if l:line =~ '^\(\s*\|#.*\|"\(""\)\=.*\)$'
+    return '='
+  " Keywords beginning indented blocks start a fold
+  elseif l:line =~ '^\s*class\s\+\w*(\w*)\s*:\s*$'
+    \ || l:line =~ '^\s*def\s\+\w\+\s*(.*)\s*:\s*$'
+    \ || l:line =~ '^\s*if\s\+.*:\s*$'
+    \ || l:line =~ '^\s*elif\s\+.*:\s*$'
+    \ || l:line =~ '^\s*else\s*:\s*$'
+    \ || l:line =~ '^\s*for\s\+.*:\s*$'
+    \ || l:line =~ '^\s*while\s\+.*:\s*$'
+    \ || l:line =~ '^\s*try\s*:\s*$'
+    \ || l:line =~ '^\s*except\s*.*:\s*$'
+    return '>'.string((indent(a:lnum) / &shiftwidth) + 1)
+  " Opening curly braces, not in a string, add a fold level
+  elseif l:line =~ '{' && l:line !~ '}' && l:line !~ "'.*{.*'" && l:line !~ '".*{.*"'
+    return 'a1'
+  " Closing curly braces, not in a string, substract a fold level
+  elseif l:line =~ '}' && l:line !~ '{' && l:line !~ "'.*}.*'" && l:line !~ '".*}.*"'
+    return 's1'
+  " Opening square braces, not in a string, add a fold level
+  elseif l:line =~ '[' && l:line !~ ']' && l:line !~ "'.*[.*'" && l:line !~ '".*].*"'
+    return 'a1'
+  " Closing square braces, not in a string, substract a fold level
+  elseif l:line =~ ']' && l:line !~ '[' && l:line !~ "'.*].*'" && l:line !~ '".*[.*"'
+    return 's1'
+  " Calculate lines with a lower indent than the previous line
+  elseif indent(a:lnum) < indent(a:lnum - 1)
+    return string((indent(a:lnum) / &shiftwidth))
+  endif
+
+  " Finally all unmatched lines use fold level from previous line
+  return '='
+endfunction
diff --git a/vimrc b/vimrc
index ac2808a..1bfea96 100644
--- a/vimrc
+++ b/vimrc
@@ -159,9 +159,6 @@ let g:DoxygenToolkit_commentType="C++"
 Plug 'suan/vim-instant-markdown'
 let g:markdown_fenced_languages=['cpp', 'c', 'cmake', 'sh', 'vim', 'python']
 
-" SimplyFold - python folding
-Plug 'tmhedberg/SimpylFold'
-
 " syntastic - syntax checker
 Plug 'scrooloose/syntastic'
 let g:syntastic_always_populate_loc_list = 1