diff --git a/src/MeasurementType.php b/src/MeasurementType.php
index 22c45d2..e7e4f4d 100644
--- a/src/MeasurementType.php
+++ b/src/MeasurementType.php
@@ -11,6 +11,7 @@ final class MeasurementType {
   const LENGTH = 'length';
   const VOLUME = 'volume';
   const WEIGHT = 'weight';
+  const TEMPERATURE = 'temperature';
 
   /**
    * Gets the labels for the defined measurement types.
@@ -24,6 +25,7 @@ final class MeasurementType {
       self::LENGTH => t('Length'),
       self::VOLUME => t('Volume'),
       self::WEIGHT => t('Weight'),
+      self::TEMPERATURE => t('Temperature'),
     ];
   }
 
@@ -43,6 +45,7 @@ final class MeasurementType {
       self::LENGTH => Length::class,
       self::VOLUME => Volume::class,
       self::WEIGHT => Weight::class,
+      self::TEMPERATURE => Temperature::class,
     ];
 
     return $classes[$type];
@@ -64,6 +67,7 @@ final class MeasurementType {
       self::LENGTH => LengthUnit::class,
       self::VOLUME => VolumeUnit::class,
       self::WEIGHT => WeightUnit::class,
+      self::TEMPERATURE => TemperatureUnit::class,
     ];
 
     return $classes[$type];
@@ -79,7 +83,7 @@ final class MeasurementType {
    */
   public static function assertExists($type) {
     $allowed_types = [
-      self::AREA, self::LENGTH, self::VOLUME, self::WEIGHT,
+      self::AREA, self::LENGTH, self::VOLUME, self::WEIGHT, self::TEMPERATURE,
     ];
     if (!in_array($type, $allowed_types)) {
       throw new \InvalidArgumentException(sprintf('Invalid measurement type "%s" provided.', $type));
diff --git a/src/Temperature.php b/src/Temperature.php
new file mode 100644
index 0000000..10e6ac9
--- /dev/null
+++ b/src/Temperature.php
@@ -0,0 +1,82 @@
+<?php
+
+namespace Drupal\physical;
+
+/**
+ * Provides a value object for temperature amounts.
+ *
+ * Usage example:
+ * @code
+ *   $temperature = new Temperature('98.6', TemperatureUnit::FAHRENHEIT);
+ * @endcode
+ */
+final class Temperature extends Measurement {
+  /**
+   * The measurement type.
+   *
+   * @var string
+   */
+  protected $type = MeasurementType::TEMPERATURE;
+
+  /**
+   * Converts the current temperature measurement to a new unit.
+   *
+   * @param string $new_unit
+   *   The new unit.
+   *
+   * @return static
+   *   The resulting length.
+   */
+  public function convert($new_unit) {
+    /*
+     * We won't use the base factors because they and formulas change
+     * depending on units being converted.
+     */
+    switch ( $this->unit ) {
+      case TemperatureUnit::CELSIUS:
+        $factor = $new_unit == TemperatureUnit::FAHRENHEIT ? '32' : '273.15';
+        if ( $new_unit == TemperatureUnit::FAHRENHEIT ) {
+          /*
+           * @see http://www.rapidtables.com/convert/temperature/how-celsius-to-fahrenheit.htm
+           */
+          $new_number = Calculator::add( Calculator::multiply($this->number, '1.8'), $factor);
+        } else {
+          /*
+           * @see http://www.rapidtables.com/convert/temperature/celsius-to-kelvin.htm
+           */
+          $new_number = Calculator::add( $this->number, $factor );
+        }
+        break;
+      case TemperatureUnit::FAHRENHEIT:
+        $factor = $new_unit == TemperatureUnit::CELSIUS ? '32' : '459.67';
+        if ( $new_unit == TemperatureUnit::CELSIUS ) {
+          /*
+           * @see http://www.rapidtables.com/convert/temperature/fahrenheit-to-celsius.htm
+           */
+          $new_number = Calculator::divide( Calculator::subtract( $this->number, $factor), '1.8' );
+        } else {
+          /*
+           * http://www.rapidtables.com/convert/temperature/fahrenheit-to-kelvin.htm
+           */
+          $new_number = Calculator::divide( Calculator::add( $this->number, $factor ), '1.8');
+        }
+        break;
+      case TemperatureUnit::KELVIN:
+        $factor = $new_unit == TemperatureUnit::CELSIUS ? '273.15' : '459.67';
+        if ( $new_unit == TemperatureUnit::CELSIUS ) {
+          /*
+           * @see http://www.rapidtables.com/convert/temperature/kelvin-to-celsius.htm
+           */
+          $new_number = Calculator::subtract( $this->number, $factor );
+        } else {
+          /*
+           * @see http://www.rapidtables.com/convert/temperature/kelvin-to-fahrenheit.htm
+           */
+          $new_number = Calculator::subtract( Calculator::multiply( $this->number, '1.8'), $factor);
+        }
+        break;
+    }
+
+    return new static($new_number, $new_unit);
+  }
+}
\ No newline at end of file
diff --git a/src/TemperatureUnit.php b/src/TemperatureUnit.php
new file mode 100644
index 0000000..afac6c6
--- /dev/null
+++ b/src/TemperatureUnit.php
@@ -0,0 +1,57 @@
+<?php
+
+namespace Drupal\physical;
+
+/**
+ * Provides common temperature units.
+ */
+final class TemperatureUnit implements UnitInterface {
+
+  const KELVIN = 'K';
+  const FAHRENHEIT = '°F';
+  const CELSIUS = '°C';
+  // Chicken would be nice about now. ;)
+
+  /**
+   * {@inheritdoc}
+   */
+  static function getLabels() {
+    return [
+      self::KELVIN => t('K'),
+      self::FAHRENHEIT => t('&deg;F'),
+      self::CELSIUS => t('&deg;C'),
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  static function getBaseUnit() {
+    return self::CELSIUS;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  static function getBaseFactor($unit) {
+    self::assertExists($unit);
+
+    $factors = [
+      self::KELVIN => '274.15',
+      self::FAHRENHEIT => '33.8',
+      self::CELSIUS => '1',
+    ];
+
+    return $factors[$unit];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  static function assertExists($unit) {
+    $allowed_units = [ self::KELVIN, self::FAHRENHEIT, self::CELSIUS ];
+    if (!in_array($unit, $allowed_units)) {
+      throw new \InvalidArgumentException(sprintf('Invalid temperature unit "%s" provided.', $unit));
+    }
+  }
+}
\ No newline at end of file
diff --git a/tests/src/Unit/TemperatureTest.php b/tests/src/Unit/TemperatureTest.php
new file mode 100644
index 0000000..4417f17
--- /dev/null
+++ b/tests/src/Unit/TemperatureTest.php
@@ -0,0 +1,75 @@
+<?php
+
+namespace Drupal\Tests\physical\Unit;
+
+use Drupal\physical\Temperature;
+use Drupal\physical\TemperatureUnit;
+use Drupal\Tests\UnitTestCase;
+
+/**
+ * Tests the temperature class.
+ *
+ * @coversDefaultClass \Drupal\physical\Temperature
+ * @group physical
+ */
+class TemperatureTest extends UnitTestCase {
+
+  /**
+   * The Celsius temperature
+   *
+   * @var \Drupal\physical\Temperature
+   */
+  protected $temperature_celsius;
+
+  /**
+   * The Fahrenheit temperature
+   *
+   * @var \Drupal\physical\Temperature
+   */
+  protected $temperature_fahrenheit;
+
+  /**
+   * The Kelvin temperature
+   *
+   * @var \Drupal\physical\Temperature
+   */
+  protected $temperature_kelvin;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setUp() {
+    parent::setUp();
+
+    $this->temperature_celsius = new Temperature('0', TemperatureUnit::CELSIUS);
+    $this->temperature_fahrenheit = new Temperature('65', TemperatureUnit::FAHRENHEIT);
+    $this->temperature_kelvin = new Temperature('504', TemperatureUnit::KELVIN);
+  }
+
+  /**
+   * ::covers __construct
+   */
+  public function testInvalidUnit() {
+    $this->setExpectedException(\InvalidArgumentException::class);
+    $volume = new Temperature('10', 'mm');
+  }
+
+  /**
+   * Tests unit conversion.
+   *
+   * ::covers convert
+   */
+  public function testConvert() {
+    // from celsius
+    $this->assertEquals( new Temperature('32', TemperatureUnit::FAHRENHEIT), $this->temperature_celsius->convert('°F')->round() );
+    $this->assertEquals( new Temperature('273.15', TemperatureUnit::KELVIN), $this->temperature_celsius->convert('K')->round(2) );
+    // from fahrenheit
+    $this->assertEquals( new Temperature('18', TemperatureUnit::CELSIUS), $this->temperature_fahrenheit->convert('°C')->round() );
+    $this->assertEquals( new Temperature('291.48', TemperatureUnit::KELVIN), $this->temperature_fahrenheit->convert('K')->round(2) );
+    // from kelvin
+    $this->assertEquals( new Temperature('230.85', TemperatureUnit::CELSIUS), $this->temperature_kelvin->convert('°C')->round(2) );
+    $this->assertEquals( new Temperature('447.53', TemperatureUnit::FAHRENHEIT), $this->temperature_kelvin->convert('°F')->round(2) );
+
+  }
+
+}
\ No newline at end of file
