diff --git a/src/gofabric/main.go b/src/gofabric/main.go
index 58dc6ba623039fa1fcc237f86e40fea45310cd48..0dc7dce5b67fdcca512303613d562ead4ef079f0 100644
--- a/src/gofabric/main.go
+++ b/src/gofabric/main.go
@@ -6,49 +6,61 @@ import (
 )
 
 const (
-	MESSAGES  = 10
-	PRODUCERS = 3
-	CONSUMERS = 5
+	MESSAGES  = 6
+	PRODUCERS = 2
+	CONSUMERS = 4
 )
 
 var (
-	ch chan string
-	wg sync.WaitGroup
+	done        chan struct{}
+	ch          chan string
+	wgProducers sync.WaitGroup
+	wgConsumers sync.WaitGroup
 )
 
 func main() {
 	ch = make(chan string)
+	done = make(chan struct{})
 	for i := 1; i <= PRODUCERS; i++ {
-		createProducer(i, MESSAGES/PRODUCERS)
+		if i != PRODUCERS {
+			createProducer(i, MESSAGES/PRODUCERS)
+		} else {
+			createProducer(i, MESSAGES/PRODUCERS+MESSAGES%PRODUCERS)
+		}
 	}
-	createProducer(0, MESSAGES%PRODUCERS)
 	for i := 1; i <= CONSUMERS; i++ {
-		createConsumer(i, MESSAGES/CONSUMERS)
+		createConsumer(i)
 	}
-	createProducer(0, MESSAGES%CONSUMERS)
-	// wait for producer and consumers
-	wg.Wait()
+	// wait for producers
+	wgProducers.Wait()
+	close(done)
+	// wait for consumers
+	wgConsumers.Wait()
 	fmt.Println("Consumers and producers are finished.")
 }
 
-func createConsumer(i, messages int) {
+func createConsumer(i int) {
 	fmt.Printf("Starting consumer %d\n", i)
-	wg.Add(1)
+	wgConsumers.Add(1)
 	go func() {
-		defer wg.Done()
-		for m := 1; m <= messages; m++ {
-			msg := <-ch
-			fmt.Printf("Consumer %d received message: %v\n", i, msg)
+		defer wgConsumers.Done()
+		for {
+			select {
+			case <-done:
+				fmt.Printf("Consumer %d done\n", i)
+				return
+			case msg := <-ch:
+				fmt.Printf("Consumer %d received message: %v\n", i, msg)
+			}
 		}
-		fmt.Printf("Consumer %d done\n", i)
 	}()
 }
 
 func createProducer(i, messages int) {
 	fmt.Printf("Starting producer %d\n", i)
-	wg.Add(1)
+	wgProducers.Add(1)
 	go func() {
-		defer wg.Done()
+		defer wgProducers.Done()
 		for m := 1; m <= messages; m++ {
 			ch <- fmt.Sprintf("Msg %d from producer %d", m, i)
 		}