diff --git a/CHANGES.rst b/CHANGES.rst
index a4a65ef..bc00d6a 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -4,6 +4,9 @@ Changelog
 4.3 (unreleased)
 ----------------
 
+- Make sure ``TransientObjectContainer.getTimeoutMinutes`` returns ints
+  (`#17 <https://github.com/zopefoundation/Products.Sessions/issues/17>`_)
+
 - Add ``tox``-based testing for unit tests, code coverage and linting
 
 - Fix ZMI layout.
diff --git a/src/Products/Transience/Transience.py b/src/Products/Transience/Transience.py
index fad0714..ecb8f2b 100644
--- a/src/Products/Transience/Transience.py
+++ b/src/Products/Transience/Transience.py
@@ -923,7 +923,7 @@ class TransientObjectContainer(SimpleItem):
 
     def getTimeoutMinutes(self):
         """ """
-        return self._timeout_secs / 60
+        return self._timeout_secs // 60
 
     def getPeriodSeconds(self):
         """ """

getTimeoutMinutes() shall return an integer value?
https://github.com/zopefoundation/Products.Sessions/blob/a756218d05eb2403c252b89664f46157ac2f25b2/src/Products/Transience/Transience.py#L924

Hello,
now(?) _getTimeoutMinutes()_  provides a **float**-type, but the ZMI template
https://github.com/zopefoundation/Products.Sessions/blob/a756218d05eb2403c252b89664f46157ac2f25b2/src/Products/Transience/dtml/manageTransientObjectContainer.dtml#L44-L45
requires an **integer**-type. Thus the form values of  _Transient Object Container_ cannot be saved anymore, if on any change the "Timeout" value is not explicitly set to an integer value. We could fix it via ZMI template code:
`-  value="<dtml-var name="getTimeoutMinutes" html_quote>" />`
`+ value="<dtml-var expr="int(getTimeoutMinutes())">" />`

Other ideas?
Best regards
fh

diff --git a/src/Products/Transience/tests/testTransientObjectContainer.py b/src/Products/Transience/tests/testTransientObjectContainer.py
index d5a8b6a..29d442a 100644
--- a/src/Products/Transience/tests/testTransientObjectContainer.py
+++ b/src/Products/Transience/tests/testTransientObjectContainer.py
@@ -294,6 +294,10 @@ class TestTransientObjectContainer(TestCase):
         self.assertEqual(self.t.getTimeoutMinutes(), 10)
         self.assertEqual(self.t.getPeriodSeconds(), 30)
 
+        # Make sure we always return an integer, our ZMI forms require it
+        self.t._timeout_secs = 125
+        self.assertTrue(isinstance(self.t.getTimeoutMinutes(), int))
+
     def test_new(self):
         t = self.t.new('foobieblech')
         self.assertTrue(issubclass(t.__class__, TransientObject))

pip install -e .
parse_log_pytest
pytest
pytest
3.7
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
AccessControl==6.3
Acquisition==5.2
attrs @ file:///croot/attrs_1668696182826/work
AuthEncoding==5.0
beautifulsoup4==4.13.3
BTrees==5.2
certifi @ file:///croot/certifi_1671487769961/work/certifi
cffi==1.15.1
Chameleon==4.2.0
DateTime==5.5
DocumentTemplate==4.6
ExtensionClass==5.1
flit_core @ file:///opt/conda/conda-bld/flit-core_1644941570762/work/source/flit_core
importlib-metadata @ file:///tmp/build/80754af9/importlib-metadata_1648562407465/work
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
MultiMapping==5.0
multipart==1.1.0
packaging @ file:///croot/packaging_1671697413597/work
PasteDeploy==3.1.0
Persistence==4.1
persistent==5.2
pluggy @ file:///tmp/build/80754af9/pluggy_1648042572264/work
-e git+https://github.com/zopefoundation/Products.Sessions.git@471680c425103a67d949f44b231a3ba96377c69a#egg=Products.Sessions
Products.TemporaryFolder==7.0
Products.ZODBMountPoint==2.0
py @ file:///opt/conda/conda-bld/py_1644396412707/work
pycparser==2.21
pytest==7.1.2
python-gettext==5.0
pytz==2025.2
RestrictedPython==7.3
roman==4.2
six==1.17.0
soupsieve==2.4.1
tempstorage==6.0
tomli @ file:///opt/conda/conda-bld/tomli_1657175507142/work
transaction==4.0
typing_extensions @ file:///croot/typing_extensions_1669924550328/work
waitress==2.1.2
WebOb==1.8.9
WebTest==3.0.1
WSGIProxy2==0.5.1
z3c.pt==4.4
zc.lockfile==3.0.post1
ZConfig==4.1
zExceptions==5.0
zipp @ file:///croot/zipp_1672387121353/work
ZODB==6.0
zodbpickle==3.3
Zope==5.10
zope.annotation==5.0
zope.browser==3.0
zope.browsermenu==5.0
zope.browserpage==5.0
zope.browserresource==5.1
zope.cachedescriptors==5.0
zope.component==6.0
zope.configuration==5.0.1
zope.container==5.2
zope.contentprovider==5.0
zope.contenttype==5.1
zope.datetime==5.0.0
zope.deferredimport==5.0
zope.deprecation==5.0
zope.dottedname==6.0
zope.event==5.0
zope.exceptions==5.1
zope.filerepresentation==6.0
zope.globalrequest==2.0
zope.hookable==6.0
zope.i18n==5.1
zope.i18nmessageid==6.1.0
zope.interface==6.4.post2
zope.lifecycleevent==5.0
zope.location==5.0
zope.pagetemplate==5.1
zope.processlifetime==3.0
zope.proxy==5.3
zope.ptresource==5.0
zope.publisher==7.0
zope.schema==7.0.1
zope.security==6.2
zope.sequencesort==5.0
zope.site==5.0
zope.size==5.0
zope.structuredtext==5.0
zope.tal==5.0.1
zope.tales==6.0
zope.testbrowser==6.0
zope.testing==5.0.1
zope.traversing==5.0
zope.viewlet==5.0

name: Products.Sessions
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - attrs=22.1.0=py37h06a4308_0
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2022.12.7=py37h06a4308_0
  - flit-core=3.6.0=pyhd3eb1b0_0
  - importlib-metadata=4.11.3=py37h06a4308_0
  - importlib_metadata=4.11.3=hd3eb1b0_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - packaging=22.0=py37h06a4308_0
  - pip=22.3.1=py37h06a4308_0
  - pluggy=1.0.0=py37h06a4308_1
  - py=1.11.0=pyhd3eb1b0_0
  - pytest=7.1.2=py37h06a4308_0
  - python=3.7.16=h7a1cb2a_0
  - readline=8.2=h5eee18b_0
  - setuptools=65.6.3=py37h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tomli=2.0.1=py37h06a4308_0
  - typing_extensions=4.4.0=py37h06a4308_0
  - wheel=0.38.4=py37h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zipp=3.11.0=py37h06a4308_0
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - accesscontrol==6.3
      - acquisition==5.2
      - authencoding==5.0
      - beautifulsoup4==4.13.3
      - btrees==5.2
      - cffi==1.15.1
      - chameleon==4.2.0
      - datetime==5.5
      - documenttemplate==4.6
      - extensionclass==5.1
      - multimapping==5.0
      - multipart==1.1.0
      - pastedeploy==3.1.0
      - persistence==4.1
      - persistent==5.2
      - products-temporaryfolder==7.0
      - products-zodbmountpoint==2.0
      - pycparser==2.21
      - python-gettext==5.0
      - pytz==2025.2
      - restrictedpython==7.3
      - roman==4.2
      - six==1.17.0
      - soupsieve==2.4.1
      - tempstorage==6.0
      - transaction==4.0
      - waitress==2.1.2
      - webob==1.8.9
      - webtest==3.0.1
      - wsgiproxy2==0.5.1
      - z3c-pt==4.4
      - zc-lockfile==3.0.post1
      - zconfig==4.1
      - zexceptions==5.0
      - zodb==6.0
      - zodbpickle==3.3
      - zope==5.10
      - zope-annotation==5.0
      - zope-browser==3.0
      - zope-browsermenu==5.0
      - zope-browserpage==5.0
      - zope-browserresource==5.1
      - zope-cachedescriptors==5.0
      - zope-component==6.0
      - zope-configuration==5.0.1
      - zope-container==5.2
      - zope-contentprovider==5.0
      - zope-contenttype==5.1
      - zope-datetime==5.0.0
      - zope-deferredimport==5.0
      - zope-deprecation==5.0
      - zope-dottedname==6.0
      - zope-event==5.0
      - zope-exceptions==5.1
      - zope-filerepresentation==6.0
      - zope-globalrequest==2.0
      - zope-hookable==6.0
      - zope-i18n==5.1
      - zope-i18nmessageid==6.1.0
      - zope-interface==6.4.post2
      - zope-lifecycleevent==5.0
      - zope-location==5.0
      - zope-pagetemplate==5.1
      - zope-processlifetime==3.0
      - zope-proxy==5.3
      - zope-ptresource==5.0
      - zope-publisher==7.0
      - zope-schema==7.0.1
      - zope-security==6.2
      - zope-sequencesort==5.0
      - zope-site==5.0
      - zope-size==5.0
      - zope-structuredtext==5.0
      - zope-tal==5.0.1
      - zope-tales==6.0
      - zope-testbrowser==6.0
      - zope-testing==5.0.1
      - zope-traversing==5.0
      - zope-viewlet==5.0
prefix: /opt/conda/envs/Products.Sessions

src/Products/Transience/tests/testTransientObjectContainer.py::TestTransientObjectContainer::testGetTimeoutMinutesWorks
src/Products/Transience/tests/testTransientObjectContainer.py::TestTransientObjectContainer::testDeleteInvalidKeyRaisesKeyError src/Products/Transience/tests/testTransientObjectContainer.py::TestTransientObjectContainer::testGarbageCollection src/Products/Transience/tests/testTransientObjectContainer.py::TestTransientObjectContainer::testGetDelaysTimeout src/Products/Transience/tests/testTransientObjectContainer.py::TestTransientObjectContainer::testGetItemFails src/Products/Transience/tests/testTransientObjectContainer.py::TestTransientObjectContainer::testGetReturnsDefault src/Products/Transience/tests/testTransientObjectContainer.py::TestTransientObjectContainer::testHasKeyWorks src/Products/Transience/tests/testTransientObjectContainer.py::TestTransientObjectContainer::testItemsWorks src/Products/Transience/tests/testTransientObjectContainer.py::TestTransientObjectContainer::testKeysWorks src/Products/Transience/tests/testTransientObjectContainer.py::TestTransientObjectContainer::testLen src/Products/Transience/tests/testTransientObjectContainer.py::TestTransientObjectContainer::testPathologicalLeftBranching src/Products/Transience/tests/testTransientObjectContainer.py::TestTransientObjectContainer::testPathologicalRightBranching src/Products/Transience/tests/testTransientObjectContainer.py::TestTransientObjectContainer::testRandomDeletes src/Products/Transience/tests/testTransientObjectContainer.py::TestTransientObjectContainer::testRandomNonOverlappingInserts src/Products/Transience/tests/testTransientObjectContainer.py::TestTransientObjectContainer::testRandomOverlappingInserts src/Products/Transience/tests/testTransientObjectContainer.py::TestTransientObjectContainer::testReplaceWorks src/Products/Transience/tests/testTransientObjectContainer.py::TestTransientObjectContainer::testResetWorks src/Products/Transience/tests/testTransientObjectContainer.py::TestTransientObjectContainer::testSetItemDelaysTimeout src/Products/Transience/tests/testTransientObjectContainer.py::TestTransientObjectContainer::testSetItemGetItemWorks src/Products/Transience/tests/testTransientObjectContainer.py::TestTransientObjectContainer::testSubobjectLimitWorks src/Products/Transience/tests/testTransientObjectContainer.py::TestTransientObjectContainer::testSuccessorChildParentRewriteExerciseCase src/Products/Transience/tests/testTransientObjectContainer.py::TestTransientObjectContainer::testTargetedDeletes src/Products/Transience/tests/testTransientObjectContainer.py::TestTransientObjectContainer::testValuesWorks src/Products/Transience/tests/testTransientObjectContainer.py::TestTransientObjectContainer::testZeroTimeoutMeansPersistForever src/Products/Transience/tests/testTransientObjectContainer.py::TestTransientObjectContainer::test_getId src/Products/Transience/tests/testTransientObjectContainer.py::TestTransientObjectContainer::test_new src/Products/Transience/tests/testTransientObjectContainer.py::TestTransientObjectContainer::test_newDupFails src/Products/Transience/tests/testTransientObjectContainer.py::TestTransientObjectContainer::test_new_or_existing src/Products/Transience/tests/testTransientObjectContainer.py::TestSlowTransientObjectContainer::testChangingTimeoutWorks src/Products/Transience/tests/testTransientObjectContainer.py::TestSlowTransientObjectContainer::testItemsGetExpired src/Products/Transience/tests/testTransientObjectContainer.py::test_suite
src/Products/Transience/Transience.py CHANGES.rst
src/Products/Transience/Transience.py CHANGES.rst