diff --git a/src/libcalamares/locale/TimeZone.cpp b/src/libcalamares/locale/TimeZone.cpp
index eaf7698ea..7143d7d33 100644
--- a/src/libcalamares/locale/TimeZone.cpp
+++ b/src/libcalamares/locale/TimeZone.cpp
@@ -35,6 +35,9 @@ namespace CalamaresUtils
 {
 namespace Locale
 {
+class RegionData;
+using RegionVector = QVector< RegionData* >;
+using ZoneVector = QVector< TimeZoneData* >;
 
 /** @brief Turns a string longitude or latitude notation into a double
  *
@@ -81,6 +84,7 @@ TimeZoneData::TimeZoneData( const QString& region,
     , m_latitude( latitude )
     , m_longitude( longitude )
 {
+    setObjectName( region + '/' + zone );
 }
 
 QString
@@ -105,9 +109,6 @@ RegionData::tr() const
     return QObject::tr( m_human, "tz_regions" );
 }
 
-using RegionVector = QVector< RegionData* >;
-using ZoneVector = QVector< TimeZoneData* >;
-
 static void
 loadTZData( RegionVector& regions, ZoneVector& zones )
 {
@@ -188,8 +189,10 @@ loadTZData( RegionVector& regions, ZoneVector& zones )
 }
 
 
-struct Private
+class Private : public QObject
 {
+    Q_OBJECT
+public:
     RegionVector m_regions;
     ZoneVector m_zones;
 
@@ -210,6 +213,11 @@ struct Private
             }
             return lhs->region() < rhs->region();
         } );
+
+        for ( auto* z : m_zones )
+        {
+            z->setParent( this );
+        }
     }
 };
 
@@ -322,6 +330,22 @@ ZonesModel::find( double latitude, double longitude ) const
     return nullptr;
 }
 
+QObject*
+ZonesModel::lookup( double latitude, double longitude ) const
+{
+    const auto* p = find( latitude, longitude );
+    if ( !p )
+    {
+        p = find( "America", "New_York" );
+    }
+    if ( !p )
+    {
+        cWarning() << "No zone (not even New York) found, expect crashes.";
+    }
+    return const_cast< QObject* >( reinterpret_cast< const QObject* >( p ) );
+}
+
+
 ZonesModel::Iterator::operator bool() const
 {
     return 0 <= m_index && m_index < m_p->m_zones.count();
@@ -376,3 +400,7 @@ RegionalZonesModel::filterAcceptsRow( int sourceRow, const QModelIndex& ) const
 
 }  // namespace Locale
 }  // namespace CalamaresUtils
+
+#include "utils/moc-warnings.h"
+
+#include "TimeZone.moc"
diff --git a/src/libcalamares/locale/TimeZone.h b/src/libcalamares/locale/TimeZone.h
index 55fdda60a..1a4ee03bf 100644
--- a/src/libcalamares/locale/TimeZone.h
+++ b/src/libcalamares/locale/TimeZone.h
@@ -35,7 +35,7 @@ namespace CalamaresUtils
 {
 namespace Locale
 {
-struct Private;
+class Private;
 class RegionalZonesModel;
 class ZonesModel;
 
@@ -122,22 +122,7 @@ public:
 
     QHash< int, QByteArray > roleNames() const override;
 
-    /** @brief Look up TZ data based on its name.
-     *
-     * Returns @c nullptr if not found.
-     */
-    const TimeZoneData* find( const QString& region, const QString& zone ) const;
-
-    /** @brief Look up TZ data based on the location.
-     *
-     * Returns the nearest zone to the given lat and lon.
-     */
-    const TimeZoneData* find( double latitude, double longitude ) const;
-
-    /** @brief Iterator for testing purposes
-     *
-     * This is primarily for testing, but who knows, it might be useful
-     * elsewhere, and it's convenient when it can access Private.
+    /** @brief Iterator for the underlying list of zones
      *
      * Iterates over all the zones in the model. Operator * may return
      * a @c nullptr when the iterator is not valid. Typical usage:
@@ -171,6 +156,26 @@ public:
 
     Iterator begin() const { return Iterator( m_private ); }
 
+public Q_SLOTS:
+    /** @brief Look up TZ data based on its name.
+     *
+     * Returns @c nullptr if not found.
+     */
+    const TimeZoneData* find( const QString& region, const QString& zone ) const;
+
+    /** @brief Look up TZ data based on the location.
+     *
+     * Returns the nearest zone to the given lat and lon.
+     */
+    const TimeZoneData* find( double latitude, double longitude ) const;
+
+    /** @brief Look up TZ data based on the location.
+     *
+     * Returns the nearest zone, or New York. This is non-const for QML
+     * purposes, but the object should be considered const anyway.
+     */
+    QObject* lookup( double latitude, double longitude ) const;
+
 private:
     Private* m_private;
 };