<?xml version="1.0" encoding="utf-8"?>
<informationTable xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.sec.gov/edgar/document/thirteenf/informationtable">
  <infoTable>
    <nameOfIssuer>ATHA Energy Corp.</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>046824108</cusip>
    <value>43779</value>
    <shrsOrPrnAmt>
      <sshPrnamt>74500</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>74500</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Agilent Tech, Inc.</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>00846U101</cusip>
    <value>6291696</value>
    <shrsOrPrnAmt>
      <sshPrnamt>55200</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>55200</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Allison Transmission</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>01973R101</cusip>
    <value>19267725</value>
    <shrsOrPrnAmt>
      <sshPrnamt>164597</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>164597</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Amer. Water Works</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>030420103</cusip>
    <value>23005198</value>
    <shrsOrPrnAmt>
      <sshPrnamt>169044</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>169044</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Ametek Inc.</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>031100100</cusip>
    <value>29955953</value>
    <shrsOrPrnAmt>
      <sshPrnamt>139746</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>139746</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Amphenol Corp.</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>032095101</cusip>
    <value>31050639</value>
    <shrsOrPrnAmt>
      <sshPrnamt>245751</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>245751</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Analog Devices</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>032654105</cusip>
    <value>30261795</value>
    <shrsOrPrnAmt>
      <sshPrnamt>95121</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>95121</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Aon plc</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>g0403h108</cusip>
    <value>28657054</value>
    <shrsOrPrnAmt>
      <sshPrnamt>88782</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>88782</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Badger Meter Inc</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>056525108</cusip>
    <value>18609552</value>
    <shrsOrPrnAmt>
      <sshPrnamt>122150</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>122150</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Charles Schwab</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>808513105</cusip>
    <value>22642883</value>
    <shrsOrPrnAmt>
      <sshPrnamt>240933</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>240933</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Danaher Corp.</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>235851102</cusip>
    <value>21781438</value>
    <shrsOrPrnAmt>
      <sshPrnamt>114881</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>114881</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Donaldson Co., Inc.</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>257651109</cusip>
    <value>22949272</value>
    <shrsOrPrnAmt>
      <sshPrnamt>270405</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>270405</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Ecolab Inc.</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>278865100</cusip>
    <value>27934228</value>
    <shrsOrPrnAmt>
      <sshPrnamt>105008</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>105008</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Fastenal Co.</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>311900104</cusip>
    <value>8410000</value>
    <shrsOrPrnAmt>
      <sshPrnamt>181250</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>181250</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Federal Signal Corp</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>313855108</cusip>
    <value>6783622</value>
    <shrsOrPrnAmt>
      <sshPrnamt>62730</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>62730</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Ferguson Enterprises</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>31488V107</cusip>
    <value>24299860</value>
    <shrsOrPrnAmt>
      <sshPrnamt>104175</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>104175</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Fiserv Inc.</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>337738108</cusip>
    <value>8030903</value>
    <shrsOrPrnAmt>
      <sshPrnamt>143923</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>143923</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Generac Holdings</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>368736104</cusip>
    <value>3838234</value>
    <shrsOrPrnAmt>
      <sshPrnamt>19650</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>19650</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>HEICO Corp.</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>422806109</cusip>
    <value>5346900</value>
    <shrsOrPrnAmt>
      <sshPrnamt>19500</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>19500</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Invesco Water ETF</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>46137V142</cusip>
    <value>2191671</value>
    <shrsOrPrnAmt>
      <sshPrnamt>32780</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>32780</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Kadant Inc.</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>48282T104</cusip>
    <value>22141127</value>
    <shrsOrPrnAmt>
      <sshPrnamt>75735</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>75735</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Kornit Digital</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>M6372Q113</cusip>
    <value>18392656</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1254615</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1254615</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Microsoft Corp.</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>594918104</cusip>
    <value>3912327</value>
    <shrsOrPrnAmt>
      <sshPrnamt>10569</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>10569</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>NexGen Energy Ltd.</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>65340P106</cusip>
    <value>14204200</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1224500</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1224500</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Ormat Technologies</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>686688102</cusip>
    <value>3133760</value>
    <shrsOrPrnAmt>
      <sshPrnamt>28000</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>28000</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Progressive Corp.</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>743315103</cusip>
    <value>13139347</value>
    <shrsOrPrnAmt>
      <sshPrnamt>66280</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>66280</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Rollins, Inc.</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>775711104</cusip>
    <value>24340539</value>
    <shrsOrPrnAmt>
      <sshPrnamt>455730</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>455730</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Roper Technologies</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>776696106</cusip>
    <value>707720</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2000</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2000</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Ryan Specialty Hldngs</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>78351F107</cusip>
    <value>16195909</value>
    <shrsOrPrnAmt>
      <sshPrnamt>480021</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>480021</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Service Corp. Int'l</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>817565104</cusip>
    <value>30333399</value>
    <shrsOrPrnAmt>
      <sshPrnamt>367633</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>367633</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Stallion Uranium Corp</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>852919208</cusip>
    <value>60628</value>
    <shrsOrPrnAmt>
      <sshPrnamt>180000</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>180000</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Viper Energy Inc</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>64361Q101</cusip>
    <value>361823</value>
    <shrsOrPrnAmt>
      <sshPrnamt>7700</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>7700</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Visa Inc.</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>92826C839</cusip>
    <value>29367452</value>
    <shrsOrPrnAmt>
      <sshPrnamt>97166</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>97166</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Waters Corporation</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>941848103</cusip>
    <value>3490216</value>
    <shrsOrPrnAmt>
      <sshPrnamt>11720</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>11720</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Watsco, Inc.</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>942622200</cusip>
    <value>20260193</value>
    <shrsOrPrnAmt>
      <sshPrnamt>55692</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>55692</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Wheaton Precious Mtls</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>962879102</cusip>
    <value>21036669</value>
    <shrsOrPrnAmt>
      <sshPrnamt>160573</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>160573</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Wheaton Precious Mtls</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>962879102</cusip>
    <value>39147360</value>
    <shrsOrPrnAmt>
      <sshPrnamt>298812</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>298812</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Xylem Inc.</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>98419M100</cusip>
    <value>9659185</value>
    <shrsOrPrnAmt>
      <sshPrnamt>80830</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>80830</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
</informationTable>
