diff --git a/specification/etc/specification.png b/specification/etc/specification.png
new file mode 100644
index 000000000000..a690413633cc
Binary files /dev/null and b/specification/etc/specification.png differ
diff --git a/specification/etc/specification.ucls b/specification/etc/specification.ucls
new file mode 100644
index 000000000000..63dc2ee32766
--- /dev/null
+++ b/specification/etc/specification.ucls
@@ -0,0 +1,212 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/specification/src/main/java/com/iluwatar/app/App.java b/specification/src/main/java/com/iluwatar/app/App.java
index 85f9a386ba47..b078907b9937 100644
--- a/specification/src/main/java/com/iluwatar/app/App.java
+++ b/specification/src/main/java/com/iluwatar/app/App.java
@@ -16,7 +16,21 @@
import com.iluwatar.selector.ColorSelector;
import com.iluwatar.selector.MovementSelector;
+/**
+ *
+ * The central idea of Specification pattern is to separate the statement of how to match a candidate, from the
+ * candidate object that it is matched against. As well as its usefulness in selection, it is also valuable for
+ * validation and for building to order.
+ *
+ * In this example we have a pool of creatures with different properties. We then have defined separate selection
+ * rules (Specifications) that we apply to the collection and as output receive only the creatures that match
+ * the selection criteria.
+ *
+ * http://martinfowler.com/apsupp/spec.pdf
+ *
+ */
public class App {
+
public static void main( String[] args ) {
// initialize creatures list
List creatures = Arrays.asList(new Goblin(), new Octopus(), new Dragon(), new Shark(), new Troll(), new KillerBee());
diff --git a/specification/src/main/java/com/iluwatar/creature/AbstractCreature.java b/specification/src/main/java/com/iluwatar/creature/AbstractCreature.java
index e0714483664c..c6294bd4aac1 100644
--- a/specification/src/main/java/com/iluwatar/creature/AbstractCreature.java
+++ b/specification/src/main/java/com/iluwatar/creature/AbstractCreature.java
@@ -4,6 +4,11 @@
import com.iluwatar.property.Movement;
import com.iluwatar.property.Size;
+/**
+ *
+ * Base class for concrete creatures.
+ *
+ */
public abstract class AbstractCreature implements Creature {
private String name;
diff --git a/specification/src/main/java/com/iluwatar/creature/Creature.java b/specification/src/main/java/com/iluwatar/creature/Creature.java
index eb49b5a77c1e..1844db80449b 100644
--- a/specification/src/main/java/com/iluwatar/creature/Creature.java
+++ b/specification/src/main/java/com/iluwatar/creature/Creature.java
@@ -4,6 +4,11 @@
import com.iluwatar.property.Movement;
import com.iluwatar.property.Size;
+/**
+ *
+ * Creature interface.
+ *
+ */
public interface Creature {
String getName();
diff --git a/specification/src/main/java/com/iluwatar/creature/Dragon.java b/specification/src/main/java/com/iluwatar/creature/Dragon.java
index d7a93f74c473..a925c60b9a30 100644
--- a/specification/src/main/java/com/iluwatar/creature/Dragon.java
+++ b/specification/src/main/java/com/iluwatar/creature/Dragon.java
@@ -4,6 +4,11 @@
import com.iluwatar.property.Movement;
import com.iluwatar.property.Size;
+/**
+ *
+ * Dragon creature.
+ *
+ */
public class Dragon extends AbstractCreature {
public Dragon() {
diff --git a/specification/src/main/java/com/iluwatar/creature/Goblin.java b/specification/src/main/java/com/iluwatar/creature/Goblin.java
index 4f584756d47c..19bdac7f1d1a 100644
--- a/specification/src/main/java/com/iluwatar/creature/Goblin.java
+++ b/specification/src/main/java/com/iluwatar/creature/Goblin.java
@@ -4,6 +4,11 @@
import com.iluwatar.property.Movement;
import com.iluwatar.property.Size;
+/**
+ *
+ * Goblin creature.
+ *
+ */
public class Goblin extends AbstractCreature {
public Goblin() {
diff --git a/specification/src/main/java/com/iluwatar/creature/KillerBee.java b/specification/src/main/java/com/iluwatar/creature/KillerBee.java
index bbb906bf133a..e2ebf4d1fae9 100644
--- a/specification/src/main/java/com/iluwatar/creature/KillerBee.java
+++ b/specification/src/main/java/com/iluwatar/creature/KillerBee.java
@@ -4,6 +4,11 @@
import com.iluwatar.property.Movement;
import com.iluwatar.property.Size;
+/**
+ *
+ * KillerBee creature.
+ *
+ */
public class KillerBee extends AbstractCreature {
public KillerBee() {
diff --git a/specification/src/main/java/com/iluwatar/creature/Octopus.java b/specification/src/main/java/com/iluwatar/creature/Octopus.java
index b3bab86b9f04..f40030475379 100644
--- a/specification/src/main/java/com/iluwatar/creature/Octopus.java
+++ b/specification/src/main/java/com/iluwatar/creature/Octopus.java
@@ -4,6 +4,11 @@
import com.iluwatar.property.Movement;
import com.iluwatar.property.Size;
+/**
+ *
+ * Octopus creature.
+ *
+ */
public class Octopus extends AbstractCreature {
public Octopus() {
diff --git a/specification/src/main/java/com/iluwatar/creature/Shark.java b/specification/src/main/java/com/iluwatar/creature/Shark.java
index 3ae40a3423a5..a751cc605d9b 100644
--- a/specification/src/main/java/com/iluwatar/creature/Shark.java
+++ b/specification/src/main/java/com/iluwatar/creature/Shark.java
@@ -4,6 +4,11 @@
import com.iluwatar.property.Movement;
import com.iluwatar.property.Size;
+/**
+ *
+ * Shark creature.
+ *
+ */
public class Shark extends AbstractCreature {
public Shark() {
diff --git a/specification/src/main/java/com/iluwatar/creature/Troll.java b/specification/src/main/java/com/iluwatar/creature/Troll.java
index 82178042b8c0..3773c6e93e1a 100644
--- a/specification/src/main/java/com/iluwatar/creature/Troll.java
+++ b/specification/src/main/java/com/iluwatar/creature/Troll.java
@@ -4,6 +4,11 @@
import com.iluwatar.property.Movement;
import com.iluwatar.property.Size;
+/**
+ *
+ * Troll creature.
+ *
+ */
public class Troll extends AbstractCreature {
public Troll() {
diff --git a/specification/src/main/java/com/iluwatar/property/Color.java b/specification/src/main/java/com/iluwatar/property/Color.java
index 52238b13bcc3..4ee16063a319 100644
--- a/specification/src/main/java/com/iluwatar/property/Color.java
+++ b/specification/src/main/java/com/iluwatar/property/Color.java
@@ -1,5 +1,10 @@
package com.iluwatar.property;
+/**
+ *
+ * Color property.
+ *
+ */
public enum Color {
DARK("dark"), LIGHT("light"), GREEN("green"), RED("red");
diff --git a/specification/src/main/java/com/iluwatar/property/Movement.java b/specification/src/main/java/com/iluwatar/property/Movement.java
index a4b29deb85f2..9fcdc4d238b0 100644
--- a/specification/src/main/java/com/iluwatar/property/Movement.java
+++ b/specification/src/main/java/com/iluwatar/property/Movement.java
@@ -1,5 +1,10 @@
package com.iluwatar.property;
+/**
+ *
+ * Movement property.
+ *
+ */
public enum Movement {
WALKING("walking"), SWIMMING("swimming"), FLYING("flying");
diff --git a/specification/src/main/java/com/iluwatar/property/Size.java b/specification/src/main/java/com/iluwatar/property/Size.java
index d97775ea47e3..2fbbdb2dc33b 100644
--- a/specification/src/main/java/com/iluwatar/property/Size.java
+++ b/specification/src/main/java/com/iluwatar/property/Size.java
@@ -2,7 +2,7 @@
/**
*
- * Enumeration for creature size.
+ * Size property.
*
*/
public enum Size {
diff --git a/specification/src/main/java/com/iluwatar/selector/ColorSelector.java b/specification/src/main/java/com/iluwatar/selector/ColorSelector.java
index 07e437b4c4b0..532c79e89961 100644
--- a/specification/src/main/java/com/iluwatar/selector/ColorSelector.java
+++ b/specification/src/main/java/com/iluwatar/selector/ColorSelector.java
@@ -5,6 +5,11 @@
import com.iluwatar.creature.Creature;
import com.iluwatar.property.Color;
+/**
+ *
+ * Color selector.
+ *
+ */
public class ColorSelector implements Predicate {
private final Color c;
diff --git a/specification/src/main/java/com/iluwatar/selector/MovementSelector.java b/specification/src/main/java/com/iluwatar/selector/MovementSelector.java
index 5fe7ce40a75b..076e0ea5dddb 100644
--- a/specification/src/main/java/com/iluwatar/selector/MovementSelector.java
+++ b/specification/src/main/java/com/iluwatar/selector/MovementSelector.java
@@ -5,6 +5,11 @@
import com.iluwatar.creature.Creature;
import com.iluwatar.property.Movement;
+/**
+ *
+ * Movement selector.
+ *
+ */
public class MovementSelector implements Predicate {
private final Movement m;
diff --git a/specification/src/main/java/com/iluwatar/selector/SizeSelector.java b/specification/src/main/java/com/iluwatar/selector/SizeSelector.java
index 1242920f7969..58d7058394ce 100644
--- a/specification/src/main/java/com/iluwatar/selector/SizeSelector.java
+++ b/specification/src/main/java/com/iluwatar/selector/SizeSelector.java
@@ -5,6 +5,11 @@
import com.iluwatar.creature.Creature;
import com.iluwatar.property.Size;
+/**
+ *
+ * Size selector.
+ *
+ */
public class SizeSelector implements Predicate {
private final Size s;