diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..b25c15b81fae06e1c55946ac6270bfdb293870e8
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+*~
diff --git a/kicad-git-setup b/kicad-git-setup
index 4aef1bd6858dbe3d77f675b50284e3dfad163713..70064455d793d032cb436e55349b902c3626d911 100755
--- a/kicad-git-setup
+++ b/kicad-git-setup
@@ -1,7 +1,32 @@
-#!/bin/sh
+#!/bin/bash
 
 shopt -s  nullglob
 
+kicad-sch-filter() {
+    cat $(realpath $(dirname $0)/kicad-sch-filter)
+}
+
+kicad-pro-filter() {
+    cat $(realpath $(dirname $0)/kicad-pro-filter)
+}
+
+mkdir -p ~/.config/git
+for s in kicad-pro-filter kicad-sch-filter ; do
+    if ! declare -f -F $s > /dev/null ; then
+        echo "${s} not defined"
+        continue
+    fi
+    if [ ! -f ~/.config/git/${s} ] ; then
+        echo "Creating ~/.config/git/${s}"
+        cat <($s) > ~/.config/git/${s}
+        chmod +x ~/.config/git/${s}
+    elif ! diff <($s) <(cat ~/.config/git/${s}) > /dev/null ; then
+        echo "Updating ~/.config/git/${s}"
+        cat <($s) > ~/.config/git/${s}
+        chmod +x ~/.config/git/${s}
+    fi
+done
+
 SCHEMATICS=( *.sch )
 if [ ${#SCHEMATICS[*]} -eq 0  ] ; then
     echo "No schematic file(s) in directory" >&2
@@ -35,8 +60,9 @@ for i in "${GITIGNORE[@]}" ; do
 done
 
 # Install filtering (see https://jnavila.github.io/plotkicadsch/)
-GITATTRIBUTES=( "*.pro filter=kicad_pro" )
-GITATTRIBUTES+=( "*.sch filter=kicad_sch" )
+GITATTRIBUTES+=( "*.pro filter=kicad-pro" )
+GITATTRIBUTES+=( "*.sch ident" )
+GITATTRIBUTES+=( "*.sch filter=kicad-sch" )
 if [ ! -f .gitattributes ] ; then
     touch .gitattributes
 fi
@@ -45,10 +71,10 @@ for a in "${GITATTRIBUTES[@]}" ; do
         echo "${a}" >> .gitattributes
     fi
 done
-FILTER=( "filter.kicad_pro.clean sed -E 's/^update=.*$/update=Date/'" )
-FILTER+=( "filter.kicad_pro.smudge cat" )
-FILTER+=( "filter.kicad_sch.clean sed -E 's/#(PWR|FLG)[0-9]+/#\1?/'" )
-FILTER+=( "filter.kicad_sch.smudge cata" )
+FILTER=( "filter.kicad-pro.clean ~/.config/git/kicad-pro-filter clean %f" )
+FILTER+=( "filter.kicad-pro.smudge  ~/.config/git/kicad-pro-filter smudge %f" )
+FILTER+=( "filter.kicad-sch.clean ~/.config/git/kicad-sch-filter clean %f" )
+FILTER+=( "filter.kicad-sch.smudge  ~/.config/git/kicad-sch-filter smudge %f" )
 for f in "${FILTER[@]}" ; do
     if [[ "$f" =~ ([^\ ]+)[\ ]+(.*) ]] ; then
          KEY=${BASH_REMATCH[1]}
diff --git a/kicad-pro-filter b/kicad-pro-filter
new file mode 100755
index 0000000000000000000000000000000000000000..26ad99c048a67a7a8c1521597a29889380879864
--- /dev/null
+++ b/kicad-pro-filter
@@ -0,0 +1,52 @@
+#!/usr/bin/python3
+
+import sys
+import re
+
+def clean(filename):
+    for line in sys.stdin:
+        line = line[0:-1]
+        m = re.match('^#\$Id[^\$]*\$$', line)
+        if m:
+            continue
+        m = re.match('^(update|last_client)=', line)
+        if m:
+            print("%s=" % m.group(1))
+            continue
+        m = re.match('^\[([^\]]*)\]', line)
+        if m:
+            key = m.group(1)
+            break
+        print(line)
+
+    section = {}
+    section[key] = []
+    for line in sys.stdin:
+        line = line[0:-1]
+        m = re.match('^\[([^\]]*)\]', line)
+        if m:
+            key = m.group(1)
+            section[key] = []
+            continue
+        section[key].append(line)
+    for k in sorted(section.keys()):
+        print('[%s]' % k)
+        for line in section[k]:
+            print(line)
+
+def smudge(filename):
+    for line in sys.stdin:
+        line = line[0:-1]
+        m = re.match('^#\$Id[^\$]*\$$', line)
+        if m:
+            continue
+        print(line)
+
+if __name__ == '__main__':
+   if sys.argv[1] == 'clean':
+      clean(sys.argv[2])
+   elif sys.argv[1] == 'smudge':
+       smudge(sys.argv[2])
+   else:
+       raise Exception("Unknown command '%s' on '%s'",
+                       sys.argv[1], sys.argv[2])
diff --git a/kicad-sch-filter b/kicad-sch-filter
new file mode 100755
index 0000000000000000000000000000000000000000..83b67d77bc55e9b7380dc9729b5f6aa3b7603538
--- /dev/null
+++ b/kicad-sch-filter
@@ -0,0 +1,69 @@
+#!/bin/bash
+
+clean() {
+    IFS= read -r LINE
+    if [[ "${LINE}" =~ ^(EESchema.*[^\ ])[\ ]*\#(\$Id.*\$)$ ]] ; then
+        echo "${BASH_REMATCH[1]} #${BASH_REMATCH[2]}"
+    elif  [[ "${LINE}" =~ ^(EESchema[^\#\$]*[^\ ])[\ ]*$ ]] ; then
+        echo "${BASH_REMATCH[1]} #\$Id\$"
+    else
+        echo "Unknown schema type '${LINE}'" 1>&2
+        exit 1
+    fi
+    (
+        while IFS= read -r LINE ; do
+            if [[ "${LINE}" =~ ^((Rev|Date)\ \").*(\") ]] ; then
+                # Clean out revision and date
+                echo "${BASH_REMATCH[1]}${BASH_REMATCH[3]}"
+            else
+                echo "${LINE}"
+            fi
+        done
+    ) | sed -E 's/#(PWR|FLG)[0-9]+/#\1?/'
+}
+
+smudge() {
+    local REV="Unknown"
+    local DATE="Unknown"
+    local HASH=
+    IFS= read -r LINE
+    if [[ "${LINE}" =~ ^EESchema.*\#\$Id:(.*)\$ ]] ; then
+        local HASH=${BASH_REMATCH[1]}
+        REV=$(git describe ${HASH} 2>/dev/null | sed -e 's/:.*//')
+        if [ -z "${REV}" ] ; then
+            REV="g$(git describe --always ${HASH} | sed -e 's/:.*//')"
+        fi
+        DATE=$(git log --format="%ai" -- "$1" | head -1)
+        if [ -z "${DATE}" ] ; then
+            DATE="Unknown2"
+        fi
+        echo "${LINE}"
+    elif [[ "${LINE}" =~ ^EESchema.* ]] ; then
+        echo "${LINE}"
+    else
+        echo "Unknown schema type '${LINE}'" 1>&2
+        exit 1
+    fi
+
+    while IFS= read -r LINE; do
+        if [[ "${LINE}" =~ ^(Rev\ \").*(\") ]] ; then
+            echo "${BASH_REMATCH[1]}${REV}${BASH_REMATCH[2]}"
+        elif [[ "${LINE}" =~ ^(Date\ \").*(\") ]] ; then
+            echo "${BASH_REMATCH[1]}${DATE}${BASH_REMATCH[2]}"
+        else
+            echo "${LINE}"
+        fi
+    done
+}
+
+case "$1" in
+    clean)
+        clean $2
+        ;;
+    smudge)
+        smudge $2
+        ;;
+    *)
+        echo "unknown command '$1'" 1>&2
+        ;;
+esac