diff --git a/app/AggregateHistory.php b/app/AggregateHistory.php
index d47123930ebdf0958a03ff8d14464885756d424c..b34b1faa175cf3d49e6f034339304fdbd72338fa 100644
--- a/app/AggregateHistory.php
+++ b/app/AggregateHistory.php
@@ -1,4 +1,5 @@
 <?php
+use Ramsey\Uuid\UuidInterface;
 
 /**
  * Collection of domain events
@@ -7,7 +8,7 @@ class AggregateHistory extends ArrayObject {
 
 	private $aggregateId;
 
-	public function __construct($aggregateId, DomainEvents $domainEvents)
+	public function __construct(UuidInterface $aggregateId, DomainEvents $domainEvents)
 	{
 		$this->aggregateId = $aggregateId;
 
@@ -17,10 +18,7 @@ class AggregateHistory extends ArrayObject {
 		parent::__construct((array) $domainEvents);
 	}
 
-	/**
-	 * @return array|null|object
-	 */
-	public function getAggregateId()
+	public function getAggregateId(): UuidInterface
 	{
 		return $this->aggregateId;
 	}
diff --git a/app/AggregatePersister.php b/app/AggregatePersister.php
new file mode 100644
index 0000000000000000000000000000000000000000..4b68e95b6b005916b096d5341659711709c20de8
--- /dev/null
+++ b/app/AggregatePersister.php
@@ -0,0 +1,14 @@
+<?php
+
+use Ramsey\Uuid\UuidInterface;
+
+class AggregatePersister
+{
+	public function save(string $aggregateRoot, AbstractAggregate $aggregate) : void {
+		
+	}
+
+	public function load(string $aggregateRoot, UuidInterface $id): AbstractAggregate {
+
+	}
+}
\ No newline at end of file
diff --git a/app/RecordsEvents.php b/app/RecordsEvents.php
index e0e73610a8a2a644a6dbb9c1212cadc6ba04536b..c1c34584f7afff0ab96254be69850fbb01037a88 100644
--- a/app/RecordsEvents.php
+++ b/app/RecordsEvents.php
@@ -2,7 +2,7 @@
 
 interface RecordsEvents
 {
-	public function getRecordedEvents();
+	public function getRecordedEvents(): DomainEvents;
 
 	public function clearRecordedEvents();
 }
\ No newline at end of file
diff --git a/app/aggreagates/AbstractAggregate.php b/app/aggreagates/AbstractAggregate.php
index ea6c001d1b5d22f7ff1e4bd8f515b28e4d039d3d..b0a8f837b9d131d140f38a82955920153c3cf4ef 100644
--- a/app/aggreagates/AbstractAggregate.php
+++ b/app/aggreagates/AbstractAggregate.php
@@ -7,7 +7,7 @@ abstract class AbstractAggregate
 	 * @param \DomainEvent $domainEvent
 	 * @return string
 	 */
-	private function getApplyMethodForDomainEvent(DomainEvent $domainEvent)
+	private function getApplyMethodForDomainEvent(DomainEvent $domainEvent): string
 	{
 		return "apply" . get_class($domainEvent);
 	}
@@ -17,7 +17,8 @@ abstract class AbstractAggregate
 	 * @param \DomainEvent $domainEvent
 	 * @internal
 	 */
-	public function applyIfAccepts(DomainEvent $domainEvent) {
+	public function applyIfAccepts(DomainEvent $domainEvent)
+	{
 		if(method_exists($this, $this->getApplyMethodForDomainEvent($domainEvent))) {
 			$this->apply($domainEvent);
 		}
@@ -27,7 +28,8 @@ abstract class AbstractAggregate
 	 * Apply domain event; if objects does not accepts this event -> fail
 	 * @param \DomainEvent $domainEvent
 	 */
-	public function apply(DomainEvent $domainEvent) {
+	public function apply(DomainEvent $domainEvent)
+	{
 		$method = $this->getApplyMethodForDomainEvent($domainEvent);
 		$this->$method($domainEvent);
 	}
diff --git a/app/aggreagates/Basket.php b/app/aggreagates/Basket.php
index 8d1a7ebe5f1674adf77b9d25bc213459284337d6..6a9706d9557d321de978f23d93094087736050e8 100644
--- a/app/aggreagates/Basket.php
+++ b/app/aggreagates/Basket.php
@@ -22,17 +22,17 @@ final class Basket extends AbstractAggregate implements RecordsEvents
 	 * @param \BasketId $basketId
 	 * @return \Basket
 	 */
-	public static function pickUp(BasketId $basketId)
+	public static function pickUp(BasketId $basketId): self
 	{
 		$basket = new Basket($basketId);
 		$basket->recordThat(new BasketWasPickedUp($basketId));
 		return $basket;
 	}
 
-	public static function reconstituteFrom(AggregateHistory $aggregateHistory)
+	public static function reconstituteFrom(AggregateHistory $aggregateHistory): self
 	{
 		$basketId = $aggregateHistory->getAggregateId();
-		$basket = new static($basketId);
+		$basket = new static(new BasketId($basketId));
 
 		foreach($aggregateHistory as $event) {
 			$basket->apply($event);
@@ -106,14 +106,15 @@ final class Basket extends AbstractAggregate implements RecordsEvents
 		}
 	}
 
-	private function isProductInBasket(ProductId $productId) {
+	private function isProductInBasket(ProductId $productId): bool
+	{
 		return isset($this->itemsCountById[(string) $productId]) && ($this->itemsCountById[(string) $productId] > 0);
 	}
 
 	// -------- implementation of RecordsEvents ------------------
 	private $recordedEvents = [];
 
-	public function getRecordedEvents()
+	public function getRecordedEvents(): DomainEvents
 	{
 		return new DomainEvents($this->recordedEvents);
 	}
diff --git a/app/events/BasketWasPickedUp.php b/app/events/BasketWasPickedUp.php
index 3e6d4f735fce472f061c5de2ad21bbcc117e2bcb..71d8ce3674e21667c6a5b439dbbf2ab1b1b20f7d 100644
--- a/app/events/BasketWasPickedUp.php
+++ b/app/events/BasketWasPickedUp.php
@@ -1,5 +1,7 @@
 <?php
 
+use Ramsey\Uuid\UuidInterface;
+
 class BasketWasPickedUp implements DomainEvent
 {
 	private $basketId;
@@ -13,11 +15,8 @@ class BasketWasPickedUp implements DomainEvent
 		$this->basketId = $basketId;
 	}
 
-	/**
-	 * @return \BasketId
-	 */
-	public function getAggregateId()
+	public function getAggregateId(): UuidInterface
 	{
-		return $this->basketId;
+		return $this->basketId->getId();
 	}
 }
\ No newline at end of file
diff --git a/app/events/DomainEvent.php b/app/events/DomainEvent.php
index 32bd64e27b2501912a65b0bac7b7b5b4b8148091..8843617fff14d01a809eb488065da8feb0478b5c 100644
--- a/app/events/DomainEvent.php
+++ b/app/events/DomainEvent.php
@@ -1,12 +1,13 @@
 <?php
 
+use Ramsey\Uuid\UuidInterface;
+
 interface DomainEvent
 {
 
 	/**
 	 * Aggregate instance identifier (must be unique per aggregate)
-	 * @return \Ramsey\Uuid\Uuid
 	 */
-	public function getAggregateId();
+	public function getAggregateId(): UuidInterface;
 
 }
\ No newline at end of file
diff --git a/app/events/ProductWasAddedToBasket.php b/app/events/ProductWasAddedToBasket.php
index d2a327c6e2bd3669bf597c7b0938cf67a3ad0c0b..ce07c86dd0db8ae0c55132c657ba31f977714e92 100644
--- a/app/events/ProductWasAddedToBasket.php
+++ b/app/events/ProductWasAddedToBasket.php
@@ -1,5 +1,7 @@
 <?php
 
+use Ramsey\Uuid\UuidInterface;
+
 class ProductWasAddedToBasket implements DomainEvent
 {
 	private $basketId;
@@ -19,23 +21,17 @@ class ProductWasAddedToBasket implements DomainEvent
 		$this->productName = $productName;
 	}
 
-	public function getAggregateId()
+	public function getAggregateId(): UuidInterface
 	{
-		return $this->basketId;
+		return $this->basketId->getId();
 	}
 
-	/**
-	 * @return BasketId
-	 */
-	public function getProductId()
+	public function getProductId(): ProductId
 	{
 		return $this->productId;
 	}
 
-	/**
-	 * @return ProductId
-	 */
-	public function getProductName()
+	public function getProductName(): string
 	{
 		return $this->productName;
 	}
diff --git a/app/events/ProductWasRemovedFromBasket.php b/app/events/ProductWasRemovedFromBasket.php
index 4c47a3bccd0eeccd0204276f20685cfd2cde3f6c..2a38bda8a0e62a6d39a33c2198a818f5cfe84291 100644
--- a/app/events/ProductWasRemovedFromBasket.php
+++ b/app/events/ProductWasRemovedFromBasket.php
@@ -1,5 +1,7 @@
 <?php
 
+use Ramsey\Uuid\UuidInterface;
+
 class ProductWasRemovedFromBasket implements DomainEvent
 {
 	private $basketId;
@@ -16,18 +18,12 @@ class ProductWasRemovedFromBasket implements DomainEvent
 		$this->productId = $productId;
 	}
 
-	/**
-	 * @return BasketId
-	 */
-	public function getAggregateId()
+	public function getAggregateId(): UuidInterface
 	{
-		return $this->basketId;
+		return $this->basketId->getId();
 	}
 
-	/**
-	 * @return ProductId
-	 */
-	public function getProductId()
+	public function getProductId(): ProductId
 	{
 		return $this->productId;
 	}
diff --git a/app/ids.php b/app/ids.php
index fba59010ded5def4143b59a4ada0679173f4fe0d..f622910ce802e967a4df86e305175f31ee424b22 100644
--- a/app/ids.php
+++ b/app/ids.php
@@ -1,5 +1,7 @@
 <?php
 
+use Ramsey\Uuid\UuidInterface;
+
 abstract class AbstractId {
 
 	private $uuid;
@@ -13,11 +15,12 @@ abstract class AbstractId {
 		$this->uuid = $uuid;
 	}
 
-	function getId() {
+	function getId(): UuidInterface
+	{
 		return $this->uuid;
 	}
 
-	function __toString()
+	function __toString(): string
 	{
 		return (string) $this->uuid;
 	}
diff --git a/tests/BasketTest.phpt b/tests/BasketTest.phpt
index da11dc3897416ed3db84e319427821587f052244..4c1aea010863059f345e8eb4de3dcb57bb225edc 100644
--- a/tests/BasketTest.phpt
+++ b/tests/BasketTest.phpt
@@ -74,7 +74,7 @@ class BasketTest extends \Tester\TestCase {
 
 		// Act
 		$reconstitutedBasket = Basket::reconstituteFrom(
-			new AggregateHistory($basketId, $retrievedEvents = $events)
+			new AggregateHistory($basketId->getId(), $retrievedEvents = $events)
 		);
 
 		// Assert