diff --git a/discovered.go b/discovered.go
index 19399c4f3047aa58f49e4e7e4563441c1990e133..8fb2e9a7cd8f485c37497a42a1401207a58327da 100644
--- a/discovered.go
+++ b/discovered.go
@@ -31,48 +31,54 @@ type Details struct {
 
 func Discover(d Discovered) error {
 	for _, ip := range d.IPs {
-		resp, e := http.Get(fmt.Sprintf("http://[%s]:8080/describe", ip))
-		if e != nil {
-			log.Println("host is ded", ip)
-			log.Println(e)
-			continue
-		}
-
-		var det Details
-		dec := json.NewDecoder(resp.Body)
-		e = dec.Decode(&det)
-		if e != nil {
-			log.Println(e)
-			continue
-		}
+		go func(ip string) {
+			resp, e := http.Get(fmt.Sprintf("http://[%s]:8080/describe", ip))
+			if e != nil {
+				log.Println("host is ded", ip)
+				log.Println(e)
+				return
+			}
 
-		if det.Score < -10 {
-			log.Println("Shitty host detected, baiting...")
-			e := tutter.SendIPs([]string{ip})
+			var det Details
+			dec := json.NewDecoder(resp.Body)
+			e = dec.Decode(&det)
 			if e != nil {
 				log.Println(e)
+				return
 			}
-			continue
-		}
 
-		str := ""
-		if det.Properties.TokenCharacterGroups.AsciiLowercase {
-			str = strings.Repeat("z", det.Properties.MaxTokenLength)
-		} else if det.Properties.TokenCharacterGroups.AsciiUppercase {
-			str = strings.Repeat("Z", det.Properties.MaxTokenLength)
-		} else if det.Properties.TokenCharacterGroups.Punctuation {
-			str = strings.Repeat(".", det.Properties.MaxTokenLength)
-		} else if det.Properties.TokenCharacterGroups.Digits {
-			str = strings.Repeat("9", det.Properties.MaxTokenLength)
-		}
+			if det.Score < -10 {
+				log.Println("Shitty host detected, baiting...")
+				e := tutter.SendIPs([]string{ip})
+				if e != nil {
+					log.Println(e)
+				}
+				return
+			}
 
-		go submit(ip, str)
+			str := ""
+			if det.Properties.TokenCharacterGroups.AsciiLowercase {
+				str = strings.Repeat("z", det.Properties.MaxTokenLength)
+			} else if det.Properties.TokenCharacterGroups.AsciiUppercase {
+				str = strings.Repeat("Z", det.Properties.MaxTokenLength)
+			} else if det.Properties.TokenCharacterGroups.Punctuation {
+				str = strings.Repeat(".", det.Properties.MaxTokenLength)
+			} else if det.Properties.TokenCharacterGroups.Digits {
+				str = strings.Repeat("9", det.Properties.MaxTokenLength)
+			}
 
-		if !nosleep {
-			t := time.Duration(rand.Intn(10)) * time.Second
-			fmt.Println("Sleeping for", t)
-			time.Sleep(t)
-		}
+			_, e = submit(ip, str)
+			if e != nil {
+				log.Println(e)
+				return
+			}
+
+			if !nosleep {
+				t := time.Duration(rand.Intn(10)) * time.Second
+				fmt.Println("Sleeping for", t)
+				time.Sleep(t)
+			}
+		}(ip)
 	}
 	return nil
 }
diff --git a/main.go b/main.go
index d345bad3da54d9d7fc08b1711fb51ca5ffebf5e7..72827e5d0eadba866512597712b4a29977f5db5d 100644
--- a/main.go
+++ b/main.go
@@ -36,7 +36,7 @@ func init() {
 }
 
 func init() {
-	http.DefaultClient.Timeout = time.Second * 10
+	http.DefaultClient.Timeout = time.Second * 4
 }
 
 func main() {
@@ -51,6 +51,8 @@ func main() {
 		panic(e)
 	}
 
+	time.Sleep(time.Second)
+
 	go func() {
 		for m := range connCh {
 			e := c.WriteJSON(m)
@@ -87,11 +89,12 @@ func main() {
 				log.Println(e)
 				continue
 			}
-			e = Discover(d)
-			if e != nil {
-				log.Println(e)
-				continue
-			}
+			go func() {
+				e = Discover(d)
+				if e != nil {
+					log.Println(e)
+				}
+			}()
 		case "submitted":
 			var s Submitted
 			e = json.Unmarshal(msg, &s)
@@ -99,11 +102,12 @@ func main() {
 				log.Println(e)
 				continue
 			}
-			e = Submit(s)
-			if e != nil {
-				log.Println(e)
-				continue
-			}
+			go func() {
+				e = Submit(s)
+				if e != nil {
+					log.Println(e)
+				}
+			}()
 		case "ack":
 			log.Println("ack")
 
diff --git a/sendMeme.go b/sendMeme.go
index 99299274fadbcd06feeb9d4b2638ca8db5d53756..bbb3dbdb739a55459da6c8349074bbedcf02ca0d 100644
--- a/sendMeme.go
+++ b/sendMeme.go
@@ -7,7 +7,6 @@ import (
 	"math/rand"
 	"net/http"
 	"strings"
-	"time"
 )
 
 var cache = make(map[string]bool)
@@ -18,15 +17,6 @@ func submit(ip, pass string) ([]string, error) {
 	}
 
 	resp, e := http.Post(fmt.Sprintf("http://[%s]:8080/attempt", ip), "text/plain", strings.NewReader(pass+"\n"))
-	if e != nil {
-		time.Sleep(time.Second * time.Duration(rand.Intn(5)))
-		resp, e = http.Post(fmt.Sprintf("http://[%s]:8080/attempt", ip), "text/plain", strings.NewReader(pass+"\n"))
-		if e != nil {
-			time.Sleep(time.Second * time.Duration(rand.Intn(5)))
-			resp, e = http.Post(fmt.Sprintf("http://[%s]:8080/attempt", ip), "text/plain", strings.NewReader(pass+"\n"))
-		}
-	}
-
 	if e != nil {
 		log.Println("host is ded", ip)
 		return nil, e
@@ -52,6 +42,7 @@ func submit(ip, pass string) ([]string, error) {
 		}
 		return nil, e
 	case 200:
+		cache[ip] = true
 		var ips []string
 		dec := json.NewDecoder(resp.Body)
 		e = dec.Decode(&ips)
diff --git a/submitted.go b/submitted.go
index a566f8ed776ed6f3e2a8b87058545b0946c5618e..a71e616e59bb5b9da782e9e8b06d8db54458b398 100644
--- a/submitted.go
+++ b/submitted.go
@@ -13,7 +13,7 @@ func Submit(s Submitted) error {
 		time.Sleep(t)
 	}
 
-	go submit(s.IP, s.Text)
+	_, e := submit(s.IP, s.Text)
 
-	return nil
+	return e
 }