diff --git a/.gitignore b/.gitignore
index 3afee3475a10291c108cdf6a4681978e0ac638b5..d56c055be1f0a23265da52a1bd65e6bea6556f47 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,3 @@
 build
 .sconsign.dblite
+*.o
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 1eb59ced4d22daff085e409e8e2153caa3ce57f5..7b1d22285eacd54f6ba0936182de4883f8a37e21 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,19 +1,178 @@
 before_script:
-  - pwd
-  - cp -R ./* /home/gitlab-runner/code/peasoup_umbrella/zipr/
-  - cd /home/gitlab-runner/code/peasoup_umbrella
-  - source set_env_vars
+  - "source ~gitlab-runner/cicd_support/cicd_support.shinc" 
+
+
 after_script:
-  - "rm -rf /home/gitlab-runner/code/peasoup_umbrella/zipr/* || true"
+  - "echo Test Complete."
+
+stages:
+  - clean
+  - build
+  - test
+
+
+
+#
+# Cleaning
+#
+
+#template 
+.do-clean: &do-nightly-clean
+  stage: clean
+  script:
+    - ./cicd_tests/do-clean.sh
+
+# per os items
+do-nightly-clean-ubuntu18:
+  <<: *do-nightly-clean
+  tags:
+    - ubuntu18
+  variables:
+    OS: 'ubuntu18'  
+
+do-nightly-clean-ubuntu16:
+  <<: *do-nightly-clean
+  tags:
+    - ubuntu16
+  variables:
+    OS: 'ubuntu16'  
+
+do-nightly-clean-centos75:
+  <<: *do-nightly-clean
+  tags:
+    - centos75
+  variables:
+    OS: 'centos75'  
+
+
+#
+# building 
+#
+
+
+# template
+.do-build: &do-build
+  stage: build
+  script:
+    - ./cicd_tests/do-build.sh
+
+
+# per os items
+do-build-ubuntu18:
+  <<: *do-build
+  tags:
+    - ubuntu18
+  variables:
+    OS: 'ubuntu18'  
+
+
+do-build-ubuntu16:
+  <<: *do-build
+  tags:
+    - ubuntu16
+  variables:
+    OS: 'ubuntu16'  
+
+do-build-centos75:
+  <<: *do-build
+  tags:
+    - centos75
+  variables:
+    OS: 'centos75'  
+
+
+
+#
+# $PSZ ls
+#
+
+# template
+.xform-ls: &xform-ls
+  stage: test
+  script:
+    - ./cicd_tests/xform-ls.sh
+
+#per OS
+xform-ls-ubuntu18:
+  <<: *xform-ls
+  tags:
+    - ubuntu18
+  variables:
+    OS: 'ubuntu18'  
+
+xform-ls-ubuntu16:
+  <<: *xform-ls
+  tags:
+    - ubuntu16
+  variables:
+    OS: 'ubuntu16'  
+
+xform-ls-centos75:
+  <<: *xform-ls
+  tags:
+    - centos75
+  variables:
+    OS: 'centos75'  
+
+#
+# $PSZ cat
+#
 
-testing:
+# template
+.xform-cat: &xform-cat
+  stage: test
+  script:
+    - ./cicd_tests/xform-cat.sh
+
+xform-cat-ubuntu18:
+  <<: *xform-cat
   tags:
-    - zipr
+    - ubuntu18
+  variables:
+    OS: 'ubuntu18'  
+    
+xform-cat-ubuntu16:
+  <<: *xform-cat
+  tags:
+    - ubuntu16
+  variables:
+    OS: 'ubuntu16'  
+
+xform-cat-centos75:
+  <<: *xform-cat
+  tags:
+    - centos75
+  variables:
+    OS: 'centos75'  
+
+#
+# run zipr internal tests
+#
+
+# template
+.internal-tests: &internal-tests
+  stage: test
   script:
-    - pwd
-    - hostname
-    - whoami
-    - cd zipr
-    - ls
-    - scons -c
-    - scons debug=1
+    - ./cicd_tests/internal-tests.sh
+
+#per OS
+internal-tests-ubuntu18:
+  <<: *internal-tests
+  tags:
+    - ubuntu18
+  variables:
+    OS: 'ubuntu18'  
+
+internal-tests-ubuntu16:
+  <<: *internal-tests
+  tags:
+    - ubuntu16
+  variables:
+    OS: 'ubuntu16'  
+
+internal-tests-centos75:
+  <<: *internal-tests
+  tags:
+    - centos75
+  variables:
+    OS: 'centos75'  
diff --git a/cicd_tests/do-build.sh b/cicd_tests/do-build.sh
new file mode 100755
index 0000000000000000000000000000000000000000..2ea87c4665ef4cbab4078f18f408c32443c7b790
--- /dev/null
+++ b/cicd_tests/do-build.sh
@@ -0,0 +1,34 @@
+#/bin/bash 
+
+set -e
+set -x
+
+main()
+{
+
+	# gather info for debugging later, probably not necessary 
+	pwd
+	hostname
+	whoami
+	env|grep "^CICD"
+
+	local orig_dir=$(pwd)
+
+	# puts peasoup_umbrella (and all submodules) in CICD_MODULE_WORK_DIR
+	cicd_setup_module_dependency allnp/peasoup_umbrella.git
+
+
+	# puts the version of zipr to test in peasoup_umbrella/zipr.
+	cicd_put_module_in_tree peasoup_umbrella/zipr
+
+	# Build/run $PSZ, test result
+	cd $CICD_MODULE_WORK_DIR/peasoup_umbrella
+	source set_env_vars
+	sudo ./get-peasoup-packages.sh all
+	./build-all.sh
+	dropdb $PGDATABASE 2>/dev/null || true ; ./postgres_setup.sh
+
+	cd $orig_dir
+}
+
+main "$@"
diff --git a/cicd_tests/do-clean.sh b/cicd_tests/do-clean.sh
new file mode 100755
index 0000000000000000000000000000000000000000..95dc3b04bd7eed3a1c9bd554fcf9ffbe047547b8
--- /dev/null
+++ b/cicd_tests/do-clean.sh
@@ -0,0 +1,22 @@
+#/bin/bash 
+
+set -e
+set -x
+
+main()
+{
+
+	# gather info for debugging later, probably not necessary 
+	pwd
+	hostname
+	whoami
+	env|grep "^CICD"
+
+
+	if [[ $CICD_NIGHTLY == 1 ]] ; then
+		rm -rf $CICD_MODULE_WORK_DIR/peasoup_umbrella
+	fi
+
+}
+
+main "$@"
diff --git a/cicd_tests/internal-tests.sh b/cicd_tests/internal-tests.sh
new file mode 100755
index 0000000000000000000000000000000000000000..7d4c8ee050d6e1d7557957eb2555874154c3b645
--- /dev/null
+++ b/cicd_tests/internal-tests.sh
@@ -0,0 +1,12 @@
+#!/bin/bash 
+
+set -e
+set -x
+
+cd $CICD_MODULE_WORK_DIR/peasoup_umbrella
+source set_env_vars
+# run zipr internal tests
+cd $ZIPR_HOME/test; scons
+for i in *.exe; do ./$i; done
+
+
diff --git a/cicd_tests/xform-cat.sh b/cicd_tests/xform-cat.sh
new file mode 100755
index 0000000000000000000000000000000000000000..af86bf8e4498ad6dea605d247760350fa8a526ad
--- /dev/null
+++ b/cicd_tests/xform-cat.sh
@@ -0,0 +1,10 @@
+cd $CICD_MODULE_WORK_DIR/peasoup_umbrella
+
+set -e
+set -x
+
+source set_env_vars
+cd /tmp
+rm -rf cat.rida ped_cat; $PSZ $(which cat) ./cat.rida -c rida=on -s meds_static=off --tempdir ped_cat || true
+if [[ ! -x ./cat.rida ]]; then cat ped_ls/logs/*; fi
+./cat.rida /dev/null 
diff --git a/cicd_tests/xform-ls.sh b/cicd_tests/xform-ls.sh
new file mode 100755
index 0000000000000000000000000000000000000000..8a37160ea7a35466a4c29ce0b60518e36eb02ef0
--- /dev/null
+++ b/cicd_tests/xform-ls.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+set -e
+set -x
+
+cd $CICD_MODULE_WORK_DIR/peasoup_umbrella
+source set_env_vars
+cd /tmp
+rm -rf ls.rida ped_ls; $PSZ /bin/ls ./ls.rida -c rida=on -s meds_static=off --tempdir ped_ls || true
+if [[ ! -x ./ls.rida ]]; then cat ped_ls/logs/*; fi
+rm -rf ped_ls
+./ls.rida
diff --git a/test/ZiprRange.cpp b/test/ZiprRange.cpp
index ebbd9e7e76963db98f9afe2d912e0d42626be75d..28027047034be6835b5913b6d32828a5c95c460e 100644
--- a/test/ZiprRange.cpp
+++ b/test/ZiprRange.cpp
@@ -61,18 +61,17 @@ bool TestRangeSpeed() {
 	}
 
 	//m.PrintMemorySpace(cout);
-
-	for (int i = 0;
-	     i<100000000;
-			 i++)
+	const auto timeStart=clock();	
+	auto i=0;
+	for (i = 0; (clock()-timeStart)/CLOCKS_PER_SEC < 10; i++)
 	{
 		volatile RangeAddress_t found_start = 0;
-		Range_t placement;
-		placement = m.GetFreeRange(d->Size());
+		auto placement = m.GetFreeRange(d->Size());
 
 		found_start = placement.GetStart();
 		found_start++;
 	}
+	cout<<"In 10 seconds, executed "<<dec<<i<<" iterations of GetFreeRange()"<<endl;
 
 	return true;
 }