diff --git a/router.go b/router.go
index bdee266..ce19f86 100644
--- a/router.go
+++ b/router.go
@@ -116,6 +116,9 @@
 	// pool to recycle Param slices
 	psPool sync.Pool
 
+	// max number of params any of the pathes contains
+	maxParams int
+
 	// Enables automatic redirection if the current route can't be matched but a
 	// handler for the path with (without) the trailing slash exists.
 	// For example if /foo/ is requested but a route only exists for /foo, the
@@ -175,12 +178,14 @@
 func (r *Router) paramsGet() *Params {
 	if vp := r.psPool.Get(); vp != nil {
 		psp := vp.(*Params)
-		*psp = (*psp)[0:0] // reset slice
-		return psp
+		if cap(*psp) >= r.maxParams {
+			*psp = (*psp)[0:0] // reset slice
+			return psp
+		}
 	}
 
 	// Allocate new slice if none is available
-	ps := make(Params, 0, 20) // TODO
+	ps := make(Params, 0, r.maxParams)
 	return &ps
 }
 
@@ -248,6 +253,11 @@
 		r.trees[method] = root
 	}
 
+	// Update maxParams
+	if pc := countParams(path); pc > r.maxParams {
+		r.maxParams = pc
+	}
+
 	root.addRoute(path, handle)
 }
 
diff --git a/tree.go b/tree.go
index f248a57..e1359ef 100644
--- a/tree.go
+++ b/tree.go
@@ -13,18 +13,14 @@
 	return b
 }
 
-func countParams(path string) uint8 {
-	var n uint
+func countParams(path string) (n int) {
 	for i := 0; i < len(path); i++ {
 		if path[i] != ':' && path[i] != '*' {
 			continue
 		}
 		n++
 	}
-	if n >= 255 {
-		return 255
-	}
-	return uint8(n)
+	return n
 }
 
 func toLower(b byte) byte {
@@ -46,7 +42,6 @@
 	pfx       string // first len(children) bytes are indices, rest is path prefix
 	wildChild bool
 	nType     nodeType
-	maxParams uint8
 	priority  uint32
 	children  []*node
 	handle    Handle
@@ -83,18 +78,12 @@
 func (n *node) addRoute(path string, handle Handle) {
 	fullPath := path
 	n.priority++
-	numParams := countParams(path)
 
 	// non-empty tree
 	if len(n.pfx) > 0 {
 		prefix := n.pfx[len(n.children):]
 	walk:
 		for {
-			// Update maxParams of the current node
-			if numParams > n.maxParams {
-				n.maxParams = numParams
-			}
-
 			// Find the longest common prefix.
 			// This also implies that the common prefix contains no ':' or '*'
 			// since the existing key can't contain those chars.
@@ -109,16 +98,9 @@
 				child := node{
 					pfx:       n.pfx[:len(n.children)] + prefix[i:],
 					wildChild: n.wildChild,
+					priority:  n.priority - 1,
 					children:  n.children,
 					handle:    n.handle,
-					priority:  n.priority - 1,
-				}
-
-				// Update maxParams (max of all children)
-				for i := range child.children {
-					if child.children[i].maxParams > child.maxParams {
-						child.maxParams = child.children[i].maxParams
-					}
 				}
 
 				n.children = []*node{&child}
@@ -137,12 +119,6 @@
 					n.priority++
 					prefix = n.pfx[len(n.children):]
 
-					// Update maxParams of the child node
-					if numParams > n.maxParams {
-						n.maxParams = numParams
-					}
-					numParams--
-
 					// Check if the wildcard matches
 					if len(path) >= len(prefix) && prefix == path[:len(prefix)] {
 						// check for longer wildcard, e.g. :name and :names
@@ -180,14 +156,12 @@
 				if c != ':' && c != '*' {
 					// []byte for proper unicode char conversion, see #65
 					n.pfx = n.pfx[:len(n.children)] + string([]byte{c}) + n.pfx[len(n.children):]
-					child := &node{
-						maxParams: numParams,
-					}
+					child := new(node)
 					n.children = append(n.children, child)
 					n.incrementChildPrio(len(n.children) - 1)
 					n = child
 				}
-				n.insertChild(numParams, path, fullPath, handle)
+				n.insertChild(path, fullPath, handle)
 				return
 
 			} else if i == len(path) { // Make node a (in-path) leaf
@@ -199,15 +173,15 @@
 			return
 		}
 	} else { // Empty tree
-		n.insertChild(numParams, path, fullPath, handle)
+		n.insertChild(path, fullPath, handle)
 	}
 }
 
-func (n *node) insertChild(numParams uint8, path, fullPath string, handle Handle) {
+func (n *node) insertChild(path, fullPath string, handle Handle) {
 	var offset int // already handled bytes of the path
 
 	// find prefix until first wildcard (beginning with ':'' or '*'')
-	for i, max := 0, len(path); numParams > 0; i++ {
+	for i, max := 0, len(path); i < max; i++ {
 		c := path[i]
 		if c != ':' && c != '*' {
 			continue
@@ -248,14 +222,12 @@
 			}
 
 			child := &node{
-				nType:     param,
-				maxParams: numParams,
+				nType: param,
 			}
 			n.children = []*node{child}
 			n.wildChild = true
 			n = child
 			n.priority++
-			numParams--
 
 			// if the path doesn't end with the wildcard, then there
 			// will be another non-wildcard subpath starting with '/'
@@ -264,15 +236,14 @@
 				offset = end
 
 				child := &node{
-					maxParams: numParams,
-					priority:  1,
+					priority: 1,
 				}
 				n.children = []*node{child}
 				n = child
 			}
 
 		} else { // catchAll
-			if end != max || numParams > 1 {
+			if end != max {
 				panic("catch-all routes are only allowed at the end of the path in path '" + fullPath + "'")
 			}
 
@@ -293,7 +264,6 @@
 				pfx:       "/",
 				wildChild: true,
 				nType:     catchAll,
-				maxParams: 1,
 			}
 			n.children = []*node{child}
 			n = child
@@ -301,11 +271,10 @@
 
 			// second node: node holding the variable
 			child = &node{
-				pfx:       path[i:],
-				nType:     catchAll,
-				maxParams: 1,
-				handle:    handle,
-				priority:  1,
+				pfx:      path[i:],
+				nType:    catchAll,
+				priority: 1,
+				handle:   handle,
 			}
 			n.children = []*node{child}
 
diff --git a/tree_test.go b/tree_test.go
index eb83499..87ccdc6 100644
--- a/tree_test.go
+++ b/tree_test.go
@@ -15,7 +15,7 @@
 func printChildren(n *node, prefix string) {
 	indices := n.pfx[:len(n.children)]
 	path := n.pfx[len(n.children):]
-	fmt.Printf(" %02d:%02d %s%s [%d:%s] %v %t %d \r\n", n.priority, n.maxParams, prefix, path, len(n.children), indices, n.handle, n.wildChild, n.nType)
+	fmt.Printf(" %02d %s%s [%d:%s] %v %t %d \r\n", n.priority, prefix, path, len(n.children), indices, n.handle, n.wildChild, n.nType)
 	for l := len(path); l > 0; l-- {
 		prefix += " "
 	}
@@ -89,33 +89,11 @@
 	return prio
 }
 
-func checkMaxParams(t *testing.T, n *node) uint8 {
-	var maxParams uint8
-	for i := range n.children {
-		params := checkMaxParams(t, n.children[i])
-		if params > maxParams {
-			maxParams = params
-		}
-	}
-	if n.nType != static && !n.wildChild {
-		maxParams++
-	}
-
-	if n.maxParams != maxParams {
-		t.Errorf(
-			"maxParams mismatch for node '%s': is %d, should be %d",
-			n.pfx[:len(n.children)], n.maxParams, maxParams,
-		)
-	}
-
-	return maxParams
-}
-
 func TestCountParams(t *testing.T) {
 	if countParams("/path/:param1/static/*catch-all") != 2 {
 		t.Fail()
 	}
-	if countParams(strings.Repeat("/:param", 256)) != 255 {
+	if countParams(strings.Repeat("/:param", 256)) != 256 {
 		t.Fail()
 	}
 }
@@ -157,7 +135,6 @@
 	})
 
 	checkPriorities(t, tree)
-	checkMaxParams(t, tree)
 }
 
 func TestTreeWildcard(t *testing.T) {
@@ -203,7 +180,6 @@
 	})
 
 	checkPriorities(t, tree)
-	checkMaxParams(t, tree)
 }
 
 func catchPanic(testFunc func()) (recv interface{}) {
