diff --git a/src/gofabric/main.go b/src/gofabric/main.go
index 4d95bda1994c28f30e5e884e5421d70cc1634fe4..58dc6ba623039fa1fcc237f86e40fea45310cd48 100644
--- a/src/gofabric/main.go
+++ b/src/gofabric/main.go
@@ -6,8 +6,9 @@ import (
 )
 
 const (
-	PRODUCERS = 10
-	CONSUMERS = 10
+	MESSAGES  = 10
+	PRODUCERS = 3
+	CONSUMERS = 5
 )
 
 var (
@@ -17,33 +18,40 @@ var (
 
 func main() {
 	ch = make(chan string)
-	for i := 1; i < PRODUCERS; i++ {
-		createProducer(i)
+	for i := 1; i <= PRODUCERS; i++ {
+		createProducer(i, MESSAGES/PRODUCERS)
 	}
-	for i := 1; i < CONSUMERS; i++ {
-		createConsumer(i)
+	createProducer(0, MESSAGES%PRODUCERS)
+	for i := 1; i <= CONSUMERS; i++ {
+		createConsumer(i, MESSAGES/CONSUMERS)
 	}
+	createProducer(0, MESSAGES%CONSUMERS)
 	// wait for producer and consumers
 	wg.Wait()
 	fmt.Println("Consumers and producers are finished.")
 }
 
-func createConsumer(i int) {
+func createConsumer(i, messages int) {
 	fmt.Printf("Starting consumer %d\n", i)
 	wg.Add(1)
 	go func() {
 		defer wg.Done()
-		msg := <-ch
-		fmt.Printf("Consumer %d received message: %v\n", i, msg)
+		for m := 1; m <= messages; m++ {
+			msg := <-ch
+			fmt.Printf("Consumer %d received message: %v\n", i, msg)
+		}
+		fmt.Printf("Consumer %d done\n", i)
 	}()
 }
 
-func createProducer(i int) {
+func createProducer(i, messages int) {
 	fmt.Printf("Starting producer %d\n", i)
 	wg.Add(1)
 	go func() {
 		defer wg.Done()
-		ch <- fmt.Sprintf("Hi from producer %d", i)
+		for m := 1; m <= messages; m++ {
+			ch <- fmt.Sprintf("Msg %d from producer %d", m, i)
+		}
 		fmt.Printf("Producer %d done\n", i)
 	}()
 }