diff --git a/pages/.gitignore b/pages/.gitignore
index f339871f77b2ce36f26c69920bccae8cee77f41f..b731620fdf8be028d30088f0df75e32b5068744c 100644
--- a/pages/.gitignore
+++ b/pages/.gitignore
@@ -1,3 +1,3 @@
 /docs/ragdoc/
-__pycache__
 /docs/cloc.md
+__pycache__
diff --git a/pages/cloc/.clocignore b/pages/cloc/.clocignore
new file mode 100644
index 0000000000000000000000000000000000000000..6be9eae9397330f2ed35619202932df433ce8bda
--- /dev/null
+++ b/pages/cloc/.clocignore
@@ -0,0 +1 @@
+run-cloc.sh
diff --git a/pages/cloc/.gitignore b/pages/cloc/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..2591dbfb5069d5010b8f0b40b18bf1a0a85cdb46
--- /dev/null
+++ b/pages/cloc/.gitignore
@@ -0,0 +1,10 @@
+files.csv
+my_definitions.txt
+ragconnect.base.lang
+ragconnect.file
+ragconnect.lang
+ragconnect.base-*.md
+ragconnect.base-*.txt
+ragconnect.tests-*.md
+ragconnect.tests-*.txt
+tmp.json
diff --git a/pages/cloc/cloc-def-connect.txt b/pages/cloc/cloc-def-connect.txt
new file mode 100644
index 0000000000000000000000000000000000000000..a20ca00ecfd5c2377ea06a87ebda2c4731ac30a2
--- /dev/null
+++ b/pages/cloc/cloc-def-connect.txt
@@ -0,0 +1,5 @@
+Connect
+    filter call_regexp_common Java
+    extension connect
+    extension ragconnect
+    3rd_gen_scale 10
diff --git a/pages/cloc/cloc-def-flex.txt b/pages/cloc/cloc-def-flex.txt
new file mode 100644
index 0000000000000000000000000000000000000000..4ac6dbb8da93e05d5b848dd5f8e8ed393c8b03c3
--- /dev/null
+++ b/pages/cloc/cloc-def-flex.txt
@@ -0,0 +1,4 @@
+Flex
+    filter remove_matches ^\s*//
+    extension flex
+    3rd_gen_scale 1.5
diff --git a/pages/cloc/cloc-def-grammar.txt b/pages/cloc/cloc-def-grammar.txt
new file mode 100644
index 0000000000000000000000000000000000000000..0afc6b8ad9bb80c5a34d155d2ea35cd856e9d924
--- /dev/null
+++ b/pages/cloc/cloc-def-grammar.txt
@@ -0,0 +1,5 @@
+Grammar
+    filter call_regexp_common Java
+    extension ast
+    extension relast
+    3rd_gen_scale 30
diff --git a/pages/cloc/cloc-def-jrag-jadd.txt b/pages/cloc/cloc-def-jrag-jadd.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b5e3435ab068a9a83653808aa4e22aeb30c604fa
--- /dev/null
+++ b/pages/cloc/cloc-def-jrag-jadd.txt
@@ -0,0 +1,5 @@
+Attributes
+    filter call_regexp_common Java
+    extension jrag
+    extension jadd
+    3rd_gen_scale 1.5
diff --git a/pages/cloc/cloc-def-parser.txt b/pages/cloc/cloc-def-parser.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c3df6758e0c6ca76f3af52e0ebb7a455c73b25a5
--- /dev/null
+++ b/pages/cloc/cloc-def-parser.txt
@@ -0,0 +1,4 @@
+Parser
+    filter remove_matches ^\s*//
+    extension parser
+    3rd_gen_scale 1.5
diff --git a/pages/cloc/run-cloc.sh b/pages/cloc/run-cloc.sh
new file mode 100755
index 0000000000000000000000000000000000000000..79308c9070e19ea9b6e77f26a9a343c9cca7117c
--- /dev/null
+++ b/pages/cloc/run-cloc.sh
@@ -0,0 +1,77 @@
+#!/bin/bash
+if [ "$1" == "-h" ] || [ "$1" == "--help" ]; then
+  echo "-s -> skip running cloc commands"
+  echo "-a -> produce files.csv with code count for single src files"
+  exit
+fi
+if [ "$1" != "-s" ]; then
+  #  --force-lang=Java,jrag --force-lang=Java,jadd
+  DEF_FILE=my_definitions.txt
+  echo "Export language definitions"
+  cloc --quiet --write-lang-def="$DEF_FILE"
+  for f in cloc-def-*.txt;
+  do
+  	cat $f >> "$DEF_FILE"
+  done
+  REPO_ROOT="../.."
+  CLOC_CMD="cloc --exclude-lang=JSON --read-lang-def=my_definitions.txt --exclude-list-file=.clocignore --quiet --hide-rate"
+  #  --ignored=bad-files.txt
+  cloc_double() {
+    f=$1
+    shift
+    echo "Creating $f.txt"
+    $CLOC_CMD --report-file="$f.txt" $@
+    echo "Creating $f.md"
+    $CLOC_CMD --md --report-file=tmp.md $@
+    tail -n+3 tmp.md > "$f.md"
+    rm tmp.md
+  }
+  make_page() {
+    echo "# Evaluation Metrics: Lines of Code"
+    echo
+    echo "## Manually written generator code"
+    echo
+    cat ragconnect.base-src-result.md
+    echo
+    echo "## Generated generator code"
+    cat ragconnect.base-gen-result.md
+    echo
+    echo "## Manually written test code"
+    cat ragconnect.tests-src-result.md
+    echo
+    echo "## Generated test code"
+    cat ragconnect.tests-gen-result.md
+  }
+fi
+if [ "$1" != "-s" ] && [ "$1" != "-a" ]; then
+  echo "Running cloc with new definitions"
+  cloc_double "ragconnect.base-src-result" --found=ragconnect.base-src-found.txt ${REPO_ROOT}/ragconnect.base/src/main/
+  cloc_double "ragconnect.base-gen-result" --found=ragconnect.base-gen-found.txt ${REPO_ROOT}/ragconnect.base/src/gen/jastadd ${REPO_ROOT}/ragconnect.base/src/gen/java
+  cloc_double "ragconnect.tests-src-result" --found=ragconnect.tests-src-found.txt ${REPO_ROOT}/ragconnect.tests/src/test/01-input/ ${REPO_ROOT}/ragconnect.tests/src/test/java/
+  cloc_double "ragconnect.tests-gen-result" --found=ragconnect.tests-gen-found.txt ${REPO_ROOT}/ragconnect.tests/src/test/02-after-ragconnect/ ${REPO_ROOT}/ragconnect.tests/src/test/java-gen
+  $CLOC_CMD --sum-reports --report_file=ragconnect ragconnect.base-src-result.txt ragconnect.base-gen-result.txt ragconnect.tests-src-result.txt ragconnect.tests-gen-result.txt
+  echo "Creating ../docs/cloc.md"
+  make_page > ../docs/cloc.md
+fi
+if [ "$1" == "-a" ]; then
+  echo "filename,code" > files.csv
+  for f in $(find ${REPO_ROOT}/ragconnect.base/src/main/ ${REPO_ROOT}/ragconnect.base/src/gen/jastadd-sources/ -type f); do
+    printf '.'
+    echo $f,$($CLOC_CMD --json $f | jq '.SUM.code') >> files.csv
+  done
+  echo
+  exit
+fi
+
+
+# cat ragconnect.base-src-result.txt
+# cat ragconnect.base.file
+# cat ragconnect.tests-result.txt
+
+echo "LOC stats:"
+echo "Language                     files          blank        comment           code"
+( for t in *-result.txt ; do echo -e "==> $t <=="; grep -v -e '---' -e 'SUM' -e 'Language' -e 'github' $t; done)
+
+echo 
+echo "Summary:"
+grep -v -e '---' -e 'SUM' -e 'Language' -e 'github' ragconnect.file