diff --git a/var/spack/repos/builtin/packages/sensei/package.py b/var/spack/repos/builtin/packages/sensei/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..87fbacf530a174d0ccd79a9b8032312218bc1cde
--- /dev/null
+++ b/var/spack/repos/builtin/packages/sensei/package.py
@@ -0,0 +1,134 @@
+# Copyright 2013-2019 Lawrence Livermore National Security, LLC and other
+# Spack Project Developers. See the top-level COPYRIGHT file for details.
+#
+# SPDX-License-Identifier: (Apache-2.0 OR MIT)
+
+from spack import *
+
+
+class Sensei(CMakePackage):
+    """SENSEI is a platform for scalable in-situ analysis and visualization.
+    Its design motto is 'Write once, run everywhere', this means that once
+    the application is instrumented with SENSEI it can use existing and
+    future analysis backends. Existing backends include: Paraview/Catalyst,
+    Visit/Libsim, ADIOS, Python scripts, and so on."""
+
+    homepage = "https://sensei-insitu.org"
+    url      = "https://gitlab.kitware.com/sensei/sensei/-/archive/v3.1.0/sensei-v3.1.0.tar.gz"
+    git      = "https://gitlab.kitware.com/sensei/sensei.git"
+    maintainers = ['sshudler']
+
+    version('master', branch='master')
+    version('3.1.0', sha256='9a3e6d0d5bb6170ee666586435434da1708b3876fd448b9d41142571ed9da939')
+    version('3.0.0', sha256='0aabbea03ade9947c88fc0aa6d3cbaf3c8267e8504e384a041445678a95e58eb')
+    version('2.1.1', sha256='8a27ebf133fef00a59e4b29433762e6560bf20214072de7808836eb668bb5687')
+    version('2.1.0', sha256='b7af21a25523cf6cd8934d797471b75ca32881166625d71f24b5c8b6d727ca99')
+    version('2.0.0', sha256='df48eab035e1acdd8edf5159955c05306f9ca48117effacc4a6b77c3fb24f62b')
+    version('1.1.0', sha256='e5a4ba691573ff6c7b0d4793665e218ee5868ebcc0198915d1f16a4b7b92a368')
+    version('1.0.0', sha256='bdcb03c56b51f2795ec5a7e85a5abb01d473d192fac50f2a8bf2608cc3564ff8')
+
+    variant('sencore', default=True, description='Enables the SENSEI core library')
+    variant('catalyst', default=True, description='Build with ParaView-Catalyst support')
+    variant('libsim', default=False, description='Build with VisIt-Libsim support')
+    variant('vtkio', default=True, description='Enable adaptors to write to VTK XML format')
+    variant('adios', default=False, description='Enable ADIOS adaptors and endpoints')
+    variant('hdf5', default=False, description='Enables HDF5 adaptors and endpoints')
+    variant('python', default=False, description='Enable Python bindings')
+    variant('miniapps', default=True, description='Enable the parallel 3D and oscillators miniapps')
+    variant('cxxstd', default='11', values=('11', '14', '17'), multi=False, description='Use the specified C++ standard when building.')
+
+    # All SENSEI versions up to 2.1.1 support only Python 2, so in this case
+    # Paraview 6 cannot be used since it requires Python 3. Starting from
+    # version 3, SENSEI supports Python 3.
+    depends_on("paraview@5.5.0:5.5.2+python+mpi+hdf5", when="@:2.1.1 +catalyst")
+    depends_on("paraview@5.6:+python3+mpi+hdf5", when="@3: +catalyst")
+    depends_on("visit", when="+libsim")
+    depends_on("vtk", when="+libsim")
+    depends_on("vtk", when="~libsim ~catalyst")
+    depends_on("adios", when="+adios")
+    depends_on("hdf5", when="+hdf5")
+    # SENSEI 3 supports Python 3, earlier versions upport only Python 2
+    depends_on("python@:2.7.16", when="@:2.1.1 +python", type=('build', 'run'))
+    depends_on("python@3:", when="@3: +python", type=('build', 'run'))
+    depends_on("py-numpy", when="+python", type=('build', 'run'))
+    depends_on("py-mpi4py", when="+python", type=('build', 'run'))
+    depends_on("swig", when="+python", type='build')
+    depends_on('cmake@3.6:', when="@3:", type='build')
+
+    # Can have either LibSim or Catalyst, but not both
+    conflicts('+libsim', when='+catalyst')
+    # hdf5 variant is available only for SENSEI 3
+    conflicts('+hdf5', when='@:2.1.1')
+
+    def cmake_args(self):
+        spec = self.spec
+
+        # -Ox flags are set by default in CMake based on the build type
+        args = [
+            '-DCMAKE_CXX_STANDARD={0}'.format(spec.variants['cxxstd'].value),
+            '-DCMAKE_C_STANDARD=11',
+            '-DCMAKE_POSITION_INDEPENDENT_CODE=ON',
+            '-DENABLE_SENSEI:BOOL={0}'.format(
+                'ON' if '+sencore' in spec else 'OFF')
+        ]
+
+        vtk_dir_needed = True
+
+        if '+catalyst' in spec:
+            args.extend([
+                '-DENABLE_CATALYST:BOOL=ON',
+                '-DENABLE_CATALYST_PYTHON:BOOL=ON',
+                '-DParaView_DIR:PATH={0}'.format(spec['paraview'].prefix)
+            ])
+            vtk_dir_needed = False
+        else:
+            args.append('-DENABLE_CATALYST:BOOL=OFF')
+
+        if '+libsim' in spec:
+            args.extend([
+                '-DENABLE_LIBSIM:BOOL=ON',
+                '-DVISIT_DIR:PATH={0}'.format(spec['visit'].prefix),
+                '-DVTK_DIR:PATH={0}'.format(spec['vtk'].prefix)
+            ])
+            vtk_dir_needed = False
+        else:
+            args.append('-DENABLE_LIBSIM:BOOL=OFF')
+
+        vtkio_switch = 'ON' if '+vtkio' in spec else 'OFF'
+        args.append('-DENABLE_VTK_IO:BOOL={0}'.format(vtkio_switch))
+
+        python_switch = 'OFF'
+        if '+python' in spec:
+            python_switch = 'ON'
+            python_path = spec['python'].command.path
+            args.append('-DPYTHON_EXECUTABLE:FILEPATH={0}'.format(python_path))
+            if spec.satisfies('@3:'):
+                args.append('-DSENSEI_PYTHON_VERSION=3')
+        args.append('-DENABLE_PYTHON:BOOL={0}'.format(python_switch))
+
+        if '+adios' in spec:
+            if spec.satisfies('@3:'):
+                args.append('-DENABLE_ADIOS1:BOOL=ON')
+            else:
+                args.append('-DENABLE_ADIOS:BOOL=ON')
+            args.append('-DADIOS_DIR:PATH={0}'.format(spec['adios'].prefix))
+        else:
+            args.append('-DENABLE_ADIOS:BOOL=OFF')
+
+        if '+hdf5' in spec:
+            args.extend([
+                '-DENABLE_HDF5:BOOL=ON',
+                '-DHDF5_DIR:PATH={0}'.format(spec['hdf5'].prefix)
+            ])
+
+        if vtk_dir_needed:
+            args.append('-DVTK_DIR:PATH={0}'.format(spec['vtk'].prefix))
+
+        args.extend([
+            '-DENABLE_PARALLEL3D:BOOL={0}'.format(
+                'ON' if '+miniapps' in spec else 'OFF'),
+            '-DENABLE_OSCILLATORS:BOOL={0}'.format(
+                'ON' if '+miniapps' in spec else 'OFF')
+        ])
+
+        return args