diff --git a/guarded-suspension/README.md b/guarded-suspension/README.md
index 01c03f192..35044f9b2 100644
--- a/guarded-suspension/README.md
+++ b/guarded-suspension/README.md
@@ -10,12 +10,12 @@ tags:
---
## Intent
-Use Guareded suspension pattern to handle a situation when you want to execute a method on object which is not in a proper state.
+Use Guarded suspension pattern to handle a situation when you want to execute a method on object which is not in a proper state.

## Applicability
-Use Guareded Suspension pattern when:
-
-* the developer knows that the method execution will be blocked for a finite period of time
+Use Guarded Suspension pattern when the developer knows that the method execution will be blocked for a finite period of time
+## Related patterns
+* Balking
diff --git a/guarded-suspension/etc/guarded-suspension.png b/guarded-suspension/etc/guarded-suspension.png
index db962e539..bd3fa5661 100644
Binary files a/guarded-suspension/etc/guarded-suspension.png and b/guarded-suspension/etc/guarded-suspension.png differ
diff --git a/guarded-suspension/pom.xml b/guarded-suspension/pom.xml
index 9e44d410b..e3a13f2c8 100644
--- a/guarded-suspension/pom.xml
+++ b/guarded-suspension/pom.xml
@@ -38,6 +38,7 @@
+ * Implementation is based on GuardedQueue, which has two methods: get and put,
+ * the condition is that we cannot get from empty queue so when thread attempt
+ * to break the condition we invoke Object's wait method on him and when other thread put an element
+ * to the queue he notify the waiting one that now he can get from queue.
+ */
+package com.iluwatar.guarded.suspension;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Created by robertt240 on 1/26/17.
+ */
+public class App {
+ /**
+ * Example pattern execution
+ *
+ * @param args - command line args
+ */
+ public static void main(String[] args) {
+ GuardedQueue guardedQueue = new GuardedQueue();
+ ExecutorService executorService = Executors.newFixedThreadPool(3);
+
+ //here we create first thread which is supposed to get from guardedQueue
+ executorService.execute(() -> {
+ guardedQueue.get();
+ }
+ );
+
+ //here we wait two seconds to show that the thread which is trying to get from guardedQueue will be waiting
+ try {
+ Thread.sleep(2000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ //now we execute second thread which will put number to guardedQueue and notify first thread that it could get
+ executorService.execute(() -> {
+ guardedQueue.put(20);
+ }
+ );
+ executorService.shutdown();
+ try {
+ executorService.awaitTermination(30, TimeUnit.SECONDS);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+}
diff --git a/guarded-suspension/src/main/java/com/iluwatar/guarded/suspension/GuardedQueue.java b/guarded-suspension/src/main/java/com/iluwatar/guarded/suspension/GuardedQueue.java
index 47939141f..89b330bfb 100644
--- a/guarded-suspension/src/main/java/com/iluwatar/guarded/suspension/GuardedQueue.java
+++ b/guarded-suspension/src/main/java/com/iluwatar/guarded/suspension/GuardedQueue.java
@@ -31,7 +31,7 @@ import java.util.Queue;
public class GuardedQueue {
private static final Logger LOGGER = LoggerFactory.getLogger(GuardedQueue.class);
- private Queue