diff --git a/physical.physical_unit.yml b/physical.physical_unit.yml
index b5f43cc..1155141 100644
--- a/physical.physical_unit.yml
+++ b/physical.physical_unit.yml
@@ -32,7 +32,32 @@ cup:
   label: Cup
   unit: cup
   factor: 2.365882e-4
-  type: volume
+  type: volume  
+square_centimeter:
+  label: square centimeter
+  unit: cm
+  factor: 1E-4
+  type: area
+square_foot:
+  label: square foot
+  unit: ft²
+  factor: 9.290304E-2
+  type: area
+square_inch:
+  label: square inch
+  unit: in²
+  factor: 6.451600E-4
+  type: area
+square_meter:
+  label: square meter
+  unit: m²
+  factor: 1
+  type: area
+square_millimeter:
+  label: square milimeter
+  unit: mm²
+  factor: 1E-6
+  type: area
 feet:
   label: Feet
   unit: ft
diff --git a/src/Area.php b/src/Area.php
new file mode 100644
index 0000000..87be012
--- /dev/null
+++ b/src/Area.php
@@ -0,0 +1,22 @@
+<?php
+
+namespace Drupal\physical;
+
+/**
+ * Provides a value object for area amounts.
+ *
+ * Usage example:
+ * @code
+ *   $area = new Area('7.00', AreaUnit::SQUARE_CENTIMETER);
+ * @endcode
+ */
+final class Area extends Measurement {
+
+  /**
+   * The measurement type.
+   *
+   * @var string
+   */
+  protected $type = MeasurementType::AREA;
+
+}
diff --git a/src/AreaUnit.php b/src/AreaUnit.php
new file mode 100644
index 0000000..8c01ffe
--- /dev/null
+++ b/src/AreaUnit.php
@@ -0,0 +1,65 @@
+<?php
+
+namespace Drupal\physical;
+
+/**
+ * Provides area units.
+ */
+final class AreaUnit implements UnitInterface {
+
+  const SQUARE_MILLIMETER = 'mm2';
+  const SQUARE_CENTIMETER = 'cm2';
+  const SQUARE_METER = 'm2';
+  const SQUARE_INCH = 'in2';
+  const SQUARE_FOOT = 'ft2';
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function getLabels() {
+    return [
+      self::SQUARE_MILLIMETER => t('mm²'),
+      self::SQUARE_CENTIMETER => t('cm²'),
+      self::SQUARE_METER => t('m²'),
+      self::SQUARE_INCH => t('in²'),
+      self::SQUARE_FOOT => t('ft²'),
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function getBaseUnit() {
+    return self::SQUARE_METER;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function getBaseFactor($unit) {
+    self::assertExists($unit);
+    $factors = [
+      self::SQUARE_MILLIMETER => '0.000001',
+      self::SQUARE_CENTIMETER => '0.0001',
+      self::SQUARE_METER => '1',
+      self::SQUARE_INCH => '0.0006451600',
+      self::SQUARE_FOOT => '0.09290304',
+    ];
+
+    return $factors[$unit];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function assertExists($unit) {
+    $allowed_units = [
+      self::SQUARE_MILLIMETER, self::SQUARE_CENTIMETER, self::SQUARE_METER, 
+      self::SQUARE_INCH, self::SQUARE_FOOT,
+    ];
+    if (!in_array($unit, $allowed_units)) {
+      throw new \InvalidArgumentException(sprintf('Invalid area unit "%s" provided.', $unit));
+    }
+  }
+
+}
diff --git a/src/MeasurementType.php b/src/MeasurementType.php
index e1519ba..c25413a 100644
--- a/src/MeasurementType.php
+++ b/src/MeasurementType.php
@@ -9,6 +9,7 @@ final class MeasurementType {
 
   const LENGTH = 'length';
   const VOLUME = 'volume';
+  const AREA = 'area';
   const WEIGHT = 'weight';
 
   /**
@@ -21,6 +22,7 @@ final class MeasurementType {
     return [
       self::LENGTH => t('Length'),
       self::VOLUME => t('Volume'),
+      self::AREA => t('Area'),
       self::WEIGHT => t('Weight'),
     ];
   }
@@ -39,6 +41,7 @@ final class MeasurementType {
     $classes = [
       self::LENGTH => Length::class,
       self::VOLUME => Volume::class,
+      self::AREA => Area::class,
       self::WEIGHT => Weight::class,
     ];
 
@@ -59,6 +62,7 @@ final class MeasurementType {
     $classes = [
       self::LENGTH => LengthUnit::class,
       self::VOLUME => VolumeUnit::class,
+      self::AREA => AreaUnit::class,
       self::WEIGHT => WeightUnit::class,
     ];
 
@@ -75,7 +79,7 @@ final class MeasurementType {
    */
   public static function assertExists($type) {
     $allowed_types = [
-      self::LENGTH, self::VOLUME, self::WEIGHT,
+      self::LENGTH, self::VOLUME, self::AREA, self::WEIGHT,
     ];
     if (!in_array($type, $allowed_types)) {
       throw new \InvalidArgumentException(sprintf('Invalid measurement type "%s" provided.', $type));
diff --git a/tests/src/Unit/AreaTest.php b/tests/src/Unit/AreaTest.php
new file mode 100644
index 0000000..8e38577
--- /dev/null
+++ b/tests/src/Unit/AreaTest.php
@@ -0,0 +1,52 @@
+<?php
+
+namespace Drupal\Tests\physical\Unit;
+
+use Drupal\physical\Area;
+use Drupal\Tests\UnitTestCase;
+
+/**
+ * Tests the area class.
+ *
+ * @coversDefaultClass \Drupal\physical\Area
+ * @group physical
+ */
+class AreaTest extends UnitTestCase {
+
+  /**
+   * The area.
+   *
+   * @var \Drupal\physical\Area
+   */
+  protected $area;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setUp() {
+    parent::setUp();
+
+    $this->area = new Area('4', 'm2');
+  }
+
+  /**
+   * ::covers __construct
+   */
+  public function testInvalidUnit() {
+    $this->setExpectedException(\InvalidArgumentException::class);
+    $area = new Area('2', 'cm3');
+  }
+
+  /**
+   * Tests unit conversion.
+   *
+   * ::covers convert
+   */
+  public function testConvert() {
+    $this->assertEquals(new Area('4000000', 'mm2'), $this->area->convert('mm2')->round());
+    $this->assertEquals(new Area('40000', 'cm2'), $this->area->convert('cm2')->round());
+    $this->assertEquals(new Area('6200.01', 'in2'), $this->area->convert('in2')->round(2));
+    $this->assertEquals(new Area('43.05564', 'ft2'), $this->area->convert('ft2')->round(5));
+  }
+
+}
