diff --git a/.gitignore b/.gitignore
index b9e05842088f86b33e293868b0b28f461db25096..8c73f0da74645b013f9fa4c757d94e3cdd3e134a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -58,6 +58,7 @@ vignettes/*.pdf
 
 # R Environment Variables
 .Renviron
+.Rprofile
 
 # pkgdown site
 docs/
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index eddfd06b31e15d13c3a9c35a0ea9af9856e30b15..11c48a856b463cc1e8b5b8b3774587e92e921bf6 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -4,8 +4,7 @@ stages:
   - revdepcheck
 
 variables:
-  R_CI: "$CI_PROJECT_DIR/ci"
-  R_LIBS_USER: "$R_CI/lib"
+  R_LIBS_USER: "$CI_PROJECT_DIR/ci/lib"
 
 default:
   tags: [docker]
@@ -13,17 +12,17 @@ default:
 cache:
   key: "airGR-${R_VERSION}"
   paths:
-    - $R_CI
+    - $R_LIBS_USER
 
 before_script:
   - mkdir -p $R_LIBS_USER
   - echo "R_LIBS='$R_LIBS_USER'" > .Renviron
-  - apt-get update && apt-get install -y libgdal-dev
-  - R -q -e 'install.packages("stringi")'
+  - echo 'options(repos = c(CRAN = "https://packagemanager.posit.co/cran/__linux__/focal/latest"))' > .Rprofile
+  - apt-get update && apt-get install -y libstdc++6
   - R -q -e 'remotes::install_deps(dependencies = TRUE)'
 
 .R-devel:
-  image: rocker/verse:devel
+  image: rocker/geospatial:devel
   variables:
     R_VERSION: devel
 
@@ -32,7 +31,7 @@ before_script:
     refs:
       - tags
       - schedules
-  image: rocker/verse:latest
+  image: rocker/geospatial:latest
   variables:
     R_VERSION: patched
 
@@ -41,17 +40,9 @@ before_script:
     refs:
       - tags
       - schedules
-  image: rocker/tidyverse:3.6
+  image: rocker/geospatial:4.1
   variables:
     R_VERSION: oldrel
-  before_script:
-    - mkdir -p $R_LIBS_USER
-    - echo "R_LIBS='$R_LIBS_USER'" > .Renviron
-    - apt-get update && apt-get install -y tk
-    - R -q -e 'remotes::update_packages("sm")'
-    - R -q -e 'remotes::update_packages("testthat", repo = "https://cran.rstudio.com/")'
-    - R -q -e 'install.packages("vioplot")'
-    - R -q -e 'remotes::install_deps(dependencies = TRUE)'
 
 .scheduled_tests:
   only:
@@ -71,14 +62,14 @@ before_script:
 .check:
   stage: check
   script:
-  - tlmgr update --self && tlmgr install ec epstopdf-pkg amsmath
+  - tlmgr update --self && tlmgr install ec epstopdf-pkg epstopdf-base amsmath
   - R -q -e 'remotes::update_packages("rcmdcheck")'
-  - R -q -e 'rcmdcheck::rcmdcheck(args = "--as-cran", error_on = "warning")'
+  - R -q -e 'rcmdcheck::rcmdcheck(args = c("--as-cran"), error_on = "warning")'
 
 .test_all:
   stage: check
   script:
-  - R -q -e 'testthat::test_local()'
+  - R -q -e 'devtools::test(stop_on_failure = TRUE)'
 
 benchmark_devel:
   extends: .R-devel
@@ -143,14 +134,9 @@ revdepcheck_devel:
       - schedule
       - master
   extends: .R-devel
-  variables:
-    CRANCACHE_DIR: "$R_CI/R-crancache"
-
   script:
     - R -q -e 'remotes::install_github("https://github.com/r-lib/revdepcheck")'
-    - R -q -e 'remotes::update_packages("crancache")'
-    - R -q -e 'library(crancache); remotes::update_packages(revdepcheck::cran_revdeps("airGR"))'
-    - R -q -e 'revdepcheck::revdep_check(timeout = as.difftime(30, units = "mins"))'
+    - R -q -e 'revdepcheck::revdep_check(timeout = as.difftime(20, units = "mins"))'
     - R -q -e 'stopifnot(all("+" == sapply(revdepcheck::revdep_summary(), "[[", "status")))'
     - R -q -e 'if (any(sapply(revdepcheck::revdep_summary(), function(x) {any(x$cmp$change == 1)}))) stop()'
   artifacts: