import (
        "fmt"
-       "github.com/gohugoio/hugo/tpl/internal/go_templates/fmtsort"
-       "github.com/gohugoio/hugo/tpl/internal/go_templates/texttemplate/parse"
        "io"
        "reflect"
        "runtime"
        "strings"
+
+       "github.com/gohugoio/hugo/tpl/internal/go_templates/fmtsort"
+       "github.com/gohugoio/hugo/tpl/internal/go_templates/texttemplate/parse"
 )
 
 // maxExecDepth specifies the maximum stack depth of templates within
 // A template may be executed safely in parallel, although if parallel
 // executions share a Writer the output may be interleaved.
 func (t *Template) ExecuteTemplate(wr io.Writer, name string, data interface{}) error {
-       var tmpl *Template
-       if t.common != nil {
-               tmpl = t.tmpl[name]
-       }
+       tmpl := t.Lookup(name)
        if tmpl == nil {
                return fmt.Errorf("template: no template %q associated with template %q", name, t.name)
        }
                return ""
        }
        var b strings.Builder
+       // temporary Hugo-fix
+       t.muTmpl.RLock()
+       defer t.muTmpl.RUnlock()
        for name, tmpl := range t.tmpl {
                if tmpl.Tree == nil || tmpl.Root == nil {
                        continue
 
 func (s *state) walkTemplate(dot reflect.Value, t *parse.TemplateNode) {
        s.at(t)
-       tmpl := s.tmpl.tmpl[t.Name]
+       tmpl := s.tmpl.Lookup(t.Name)
        if tmpl == nil {
                s.errorf("template %q not defined", t.Name)
        }
 
 package template
 
 import (
-       "github.com/gohugoio/hugo/tpl/internal/go_templates/texttemplate/parse"
        "reflect"
        "sync"
+
+       "github.com/gohugoio/hugo/tpl/internal/go_templates/texttemplate/parse"
 )
 
 // common holds the information shared by related templates.
 type common struct {
+       muTmpl sync.RWMutex         // protects tmpl (temporary Hugo-fix)
        tmpl   map[string]*Template // Map from name to defined templates.
        option option
        // We use two maps, one for parsing and one for execution.
        if t.common == nil {
                return nt, nil
        }
+       // temporary Hugo-fix
+       t.muTmpl.RLock()
+       defer t.muTmpl.RUnlock()
        for k, v := range t.tmpl {
                if k == t.name {
                        nt.tmpl[t.name] = nt
 // its definition. If it has been defined and already has that name, the existing
 // definition is replaced; otherwise a new template is created, defined, and returned.
 func (t *Template) AddParseTree(name string, tree *parse.Tree) (*Template, error) {
+       // temporary Hugo-fix
+       t.muTmpl.Lock()
+       defer t.muTmpl.Unlock()
        t.init()
        nt := t
        if name != t.name {
                return nil
        }
        // Return a slice so we don't expose the map.
+       // temporary Hugo-fix
+       t.muTmpl.RLock()
+       defer t.muTmpl.RUnlock()
        m := make([]*Template, 0, len(t.tmpl))
        for _, v := range t.tmpl {
                m = append(m, v)
        if t.common == nil {
                return nil
        }
+       // temporary Hugo-fix
+       t.muTmpl.RLock()
+       defer t.muTmpl.RUnlock()
        return t.tmpl[name]
 }