diff --git a/tests/afrouter/tester.go b/tests/afrouter/tester.go
index fafbbbe..c7c89f4 100644
--- a/tests/afrouter/tester.go
+++ b/tests/afrouter/tester.go
@@ -18,71 +18,69 @@
 package main
 
 import (
-	"os"
-	"fmt"
-	"flag"
-	"path"
-	"math"
-	//"bufio"
-	"errors"
-	"regexp"
-	"os/exec"
-	"strconv"
-	"io/ioutil"
 	"encoding/json"
-	"text/template"
+	"errors"
+	"flag"
+	"fmt"
 	"github.com/golang/protobuf/proto"
-	"github.com/opencord/voltha-go/common/log"
 	pb "github.com/golang/protobuf/protoc-gen-go/descriptor"
+	"github.com/opencord/voltha-go/common/log"
+	"io/ioutil"
+	"math"
+	"os"
+	"os/exec"
+	"path"
+	"regexp"
+	"strconv"
+	"text/template"
 )
 
 const MAX_CT = 500
 
 type TestConfig struct {
 	configFile *string
-	logLevel *int
-	grpcLog *bool
-	Suites []string `json:"suites"`
+	logLevel   *int
+	grpcLog    *bool
+	Suites     []string `json:"suites"`
 }
 
-
 type Connection struct {
 	Name string `json:"name"`
 	Port string `json:"port"`
 }
 
 type EndpointList struct {
-	Imports []string `json:"imports"`
+	Imports   []string     `json:"imports"`
 	Endpoints []Connection `json:"endPoints"`
 }
 
 type ProtoFile struct {
 	ImportPath string `json:"importPath"`
-	Service string `json:"service"`
-	Package string `json:"package"`
+	Service    string `json:"service"`
+	Package    string `json:"package"`
 }
 
 type ProtoSubst struct {
 	From string `json:"from"`
-	To string `json:"to"`
+	To   string `json:"to"`
 }
 
 type Environment struct {
-	Command string `json:"cmdLine"`
-	ProtoFiles []ProtoFile `json:"protoFiles"`
-	ProtoDesc string `json:"protoDesc"`
-	Clients EndpointList `json:"clients"`
-	Servers EndpointList `json:"servers"`
-	Imports []string `json:"imports"`
+	Command     string       `json:"cmdLine"`
+	ProtoFiles  []ProtoFile  `json:"protoFiles"`
+	ProtoDesc   string       `json:"protoDesc"`
+	Clients     EndpointList `json:"clients"`
+	Servers     EndpointList `json:"servers"`
+	Imports     []string     `json:"imports"`
 	ProtoSubsts []ProtoSubst `json:"protoSubst"`
 }
 
 type Rpc struct {
-	Client string `json:"client"`
-	Method string `json:"method"`
-	Param string `json:"param"`
-	Expect string `json:"expect"`
-	MetaData []MetaD `json:"meta"`
+	Client     string  `json:"client"`
+	Method     string  `json:"method"`
+	Param      string  `json:"param"`
+	Expect     string  `json:"expect"`
+	MetaData   []MetaD `json:"meta"`
 	ExpectMeta []MetaD `json:"expectMeta"`
 }
 
@@ -92,117 +90,116 @@
 }
 
 type Server struct {
-	Name string `json:"name"`
+	Name string  `json:"name"`
 	Meta []MetaD `json:"meta"`
 }
 
 type Test struct {
-	Name string `json:"name"`
-	InfoOnly bool `json:"infoOnly"`
-	Send Rpc `json:"send"`
-	Servers []Server `json:"servers"`
+	Name     string   `json:"name"`
+	InfoOnly bool     `json:"infoOnly"`
+	Send     Rpc      `json:"send"`
+	Servers  []Server `json:"servers"`
 }
 
 type TestSuite struct {
-	Env Environment `json:"environment"`
-	Tests []Test `json:"tests"`
+	Env   Environment `json:"environment"`
+	Tests []Test      `json:"tests"`
 }
 
 type ProtoImport struct {
 	Service string
-	Short string
+	Short   string
 	Package string
-	Used bool
+	Used    bool
 }
 
 type SendItem struct {
-	Client string
-	Method string
-	Param string
-	ParamType string
-	Expect string
+	Client     string
+	Method     string
+	Param      string
+	ParamType  string
+	Expect     string
 	ExpectType string
-	MetaData []MetaD
+	MetaData   []MetaD
 	ExpectMeta []MetaD
 }
 
 type TestCase struct {
-	Name string
+	Name     string
 	InfoOnly bool
-	Send SendItem
-	Srvr []Server
+	Send     SendItem
+	Srvr     []Server
 }
 
 type MethodTypes struct {
-	ParamType string
-	ReturnType string
+	ParamType     string
+	ReturnType    string
 	CodeGenerated bool
 }
 
 type Import struct {
 	Package string
-	Used bool
+	Used    bool
 }
 
 type TestList struct {
-	ProtoImports []ProtoImport
-	Imports []Import
-	Tests []TestCase
-	Funcs map[string]MethodTypes
+	ProtoImports     []ProtoImport
+	Imports          []Import
+	Tests            []TestCase
+	Funcs            map[string]MethodTypes
 	RunTestsCallList []string
-	FileNum int
+	FileNum          int
 	//NextFile int
 	HasFuncs bool
-	Offset int
+	Offset   int
 }
 
 type ClientConfig struct {
-	Ct int
-	Name string
-	Port string
-	Imports []string
-	Methods map[string]*mthd
+	Ct           int
+	Name         string
+	Port         string
+	Imports      []string
+	Methods      map[string]*mthd
 	ProtoImports []ProtoImport
 }
 
 type ServerConfig struct {
-	Ct int
-	Name string
-	Port string
-	Imports []string
-	Methods map[string]*mthd
+	Ct           int
+	Name         string
+	Port         string
+	Imports      []string
+	Methods      map[string]*mthd
 	ProtoImports []ProtoImport
 }
 
 type mthd struct {
-	Pkg string
-	Svc string
-	Name string
+	Pkg   string
+	Svc   string
+	Name  string
 	Param string
-	Rtrn string
-	Ss bool // Server streaming 
-	Cs bool // Clieent streaming 
+	Rtrn  string
+	Ss    bool // Server streaming
+	Cs    bool // Clieent streaming
 }
 
-
 func parseCmd() (*TestConfig, error) {
 	config := &TestConfig{}
-	cmdParse := flag.NewFlagSet(path.Base(os.Args[0]), flag.ContinueOnError);
+	cmdParse := flag.NewFlagSet(path.Base(os.Args[0]), flag.ContinueOnError)
 	config.configFile = cmdParse.String("config", "suites.json", "The configuration file for the affinity router tester")
 	config.logLevel = cmdParse.Int("logLevel", 0, "The log level for the affinity router tester")
 	config.grpcLog = cmdParse.Bool("grpclog", false, "Enable GRPC logging")
 
-	err := cmdParse.Parse(os.Args[1:]);
+	err := cmdParse.Parse(os.Args[1:])
 	if err != nil {
 		//return err
-		return nil, errors.New("Error parsing the command line");
+		return nil, errors.New("Error parsing the command line")
 	}
 	return config, nil
 }
 
-func (conf * TestConfig) loadConfig() error {
+func (conf *TestConfig) loadConfig() error {
 
-	configF, err := os.Open(*conf.configFile);
+	configF, err := os.Open(*conf.configFile)
 	log.Info("Loading configuration from: ", *conf.configFile)
 	if err != nil {
 		log.Error(err)
@@ -222,12 +219,12 @@
 	return nil
 }
 
-func (suite * TestSuite) loadSuite(suiteN string)  error {
+func (suite *TestSuite) loadSuite(suiteN string) error {
 	// Check if there's a corresponding go file for the suite.
 	// If it is present then the json test suite file is a
 	// template. Compile the go file and run it to process
 	// the template.
-	if _,err := os.Stat(suiteN+".go"); err == nil {
+	if _, err := os.Stat(suiteN + ".go"); err == nil {
 		// Compile and run the the go file
 		log.Infof("Suite '%s' is a template, compiling '%s'", suiteN, suiteN+".go")
 		cmd := exec.Command("go", "build", "-o", suiteN+".te", suiteN+".go")
@@ -237,7 +234,7 @@
 		if err := cmd.Run(); err != nil {
 			log.Errorf("Error running the compile command:%v", err)
 		}
-		cmd = exec.Command("./"+suiteN+".te")
+		cmd = exec.Command("./" + suiteN + ".te")
 		cmd.Stdin = os.Stdin
 		cmd.Stdout = os.Stdout
 		cmd.Stderr = os.Stderr
@@ -245,7 +242,7 @@
 			log.Errorf("Error running the %s command:%v", suiteN+".te", err)
 		}
 	}
-	suiteF, err := os.Open(suiteN+".json");
+	suiteF, err := os.Open(suiteN + ".json")
 	log.Infof("Loading test suite from: %s", suiteN+".json")
 	if err != nil {
 		log.Error(err)
@@ -271,9 +268,9 @@
 
 	// Load the protobuf descriptor file
 	protoDescriptor := &pb.FileDescriptorSet{}
-	fb, err := ioutil.ReadFile(fileName);
+	fb, err := ioutil.ReadFile(fileName)
 	if err != nil {
-		log.Errorf("Could not open proto file '%s'",fileName)
+		log.Errorf("Could not open proto file '%s'", fileName)
 		rtrn_err = true
 	}
 	err = proto.Unmarshal(fb, protoDescriptor)
@@ -282,31 +279,30 @@
 		rtrn_err = true
 	}
 
-	var substM  map[string]string = make(map[string]string)
+	var substM map[string]string = make(map[string]string)
 	// Create a substitution map
 	log.Debugf("Creating import map")
-	for _,v := range substs {
+	for _, v := range substs {
 		log.Debugf("Mapping from %s to %s", v.From, v.To)
 		substM[v.From] = v.To
 	}
 
-
 	// Build the a map containing the method as the key
 	// and the paramter and return types as the fields
-	for _,f := range protoDescriptor.File {
+	for _, f := range protoDescriptor.File {
 		if *f.Package == pkg {
-			for _, s:= range f.Service {
+			for _, s := range f.Service {
 				if *s.Name == svc {
 					log.Debugf("Loading package data '%s' for service '%s'", *f.Package, *s.Name)
 					// Now create a map keyed by method name with the value being the
 					// field number of the route selector.
 					//var ok bool
-					for _,m := range s.Method {
+					for _, m := range s.Method {
 						// Find the input type in the messages and extract the
 						// field number and save it for future reference.
-						log.Debugf("Processing method (%s(%s) (%s){}",*m.Name, (*m.InputType)[1:], (*m.OutputType)[1:])
-						mthds[*m.Name] = &mthd{Pkg:pkg, Svc:svc, Name:*m.Name, Param:(*m.InputType)[1:],
-												Rtrn:(*m.OutputType)[1:]}
+						log.Debugf("Processing method (%s(%s) (%s){}", *m.Name, (*m.InputType)[1:], (*m.OutputType)[1:])
+						mthds[*m.Name] = &mthd{Pkg: pkg, Svc: svc, Name: *m.Name, Param: (*m.InputType)[1:],
+							Rtrn: (*m.OutputType)[1:]}
 						if m.ClientStreaming != nil && *m.ClientStreaming == true {
 							log.Debugf("Method %s is a client streaming method", *m.Name)
 							mthds[*m.Name].Cs = true
@@ -316,10 +312,10 @@
 							mthds[*m.Name].Ss = true
 						}
 						// Perform the required substitutions
-						if _,ok := substM[mthds[*m.Name].Param]; ok == true {
+						if _, ok := substM[mthds[*m.Name].Param]; ok == true {
 							mthds[*m.Name].Param = substM[mthds[*m.Name].Param]
 						}
-						if _,ok := substM[mthds[*m.Name].Rtrn]; ok == true {
+						if _, ok := substM[mthds[*m.Name].Rtrn]; ok == true {
 							mthds[*m.Name].Rtrn = substM[mthds[*m.Name].Rtrn]
 						}
 					}
@@ -328,40 +324,40 @@
 		}
 	}
 	if rtrn_err {
-		return nil,errors.New(fmt.Sprintf("Failed to load protobuf descriptor file '%s'",fileName))
+		return nil, errors.New(fmt.Sprintf("Failed to load protobuf descriptor file '%s'", fileName))
 	}
 	return mthds, nil
 }
 
 // Server source code generation
-func generateServers(conf *TestConfig, suiteDir string, ts * TestSuite,
-						t *template.Template) error {
+func generateServers(conf *TestConfig, suiteDir string, ts *TestSuite,
+	t *template.Template) error {
 	var servers []ServerConfig
 
-	for k,v := range ts.Env.Servers.Endpoints {
+	for k, v := range ts.Env.Servers.Endpoints {
 		log.Infof("Generating the code for server[%d]: %s", k, v.Name)
-		sc := &ServerConfig{Name:v.Name, Port:v.Port, Ct:k, Imports:ts.Env.Servers.Imports,
-							Methods:make(map[string]*mthd)}
-		for k1,v1 := range ts.Env.ProtoFiles {
-			imp := &ProtoImport{Short:"pb"+strconv.Itoa(k1),
-								Package:v1.ImportPath+v1.Package,
-								Service:v1.Service,
-								Used:true}
-			imp = &ProtoImport{Short:v1.Package,
-								Package:v1.ImportPath+v1.Package,
-								Service:v1.Service,
-								Used:true}
+		sc := &ServerConfig{Name: v.Name, Port: v.Port, Ct: k, Imports: ts.Env.Servers.Imports,
+			Methods: make(map[string]*mthd)}
+		for k1, v1 := range ts.Env.ProtoFiles {
+			imp := &ProtoImport{Short: "pb" + strconv.Itoa(k1),
+				Package: v1.ImportPath + v1.Package,
+				Service: v1.Service,
+				Used:    true}
+			imp = &ProtoImport{Short: v1.Package,
+				Package: v1.ImportPath + v1.Package,
+				Service: v1.Service,
+				Used:    true}
 			sc.ProtoImports = append(sc.ProtoImports, *imp)
 			// Compile the template from the file
 			log.Debugf("Proto substs: %v", ts.Env.ProtoSubsts)
 			if mthds, err := loadProtoMap(ts.Env.ProtoDesc, v1.Package,
-											v1.Service, ts.Env.ProtoSubsts); err != nil {
+				v1.Service, ts.Env.ProtoSubsts); err != nil {
 				log.Errorf("Unable to process proto descriptor file %s for package: %s, service: %s",
-						ts.Env.ProtoDesc, v1.Package, v1.Service)
+					ts.Env.ProtoDesc, v1.Package, v1.Service)
 				return err
 			} else {
-				//Generate all the function calls required by the 
-				for k,v := range mthds {
+				//Generate all the function calls required by the
+				for k, v := range mthds {
 					sc.Methods[k] = v
 				}
 				//sc.Methods = mthds
@@ -371,20 +367,20 @@
 		// Save this server for the next steop
 		servers = append(servers, *sc)
 		// Open an output file to put the output in.
-		if f,err := os.Create(suiteDir+"/"+v.Name+".go"); err == nil {
+		if f, err := os.Create(suiteDir + "/" + v.Name + ".go"); err == nil {
 			defer f.Close()
-			//if err := t.ExecuteTemplate(os.Stdout, "server.go", *sc); err != nil {}
-			if err := t.ExecuteTemplate(f, "server.go", *sc); err != nil {
+			//if err := t.ExecuteTemplate(os.Stdout, "server.go.tmpl", *sc); err != nil {}
+			if err := t.ExecuteTemplate(f, "server.go.tmpl", *sc); err != nil {
 				log.Errorf("Unable to execute template for server[%d]: %s: %v", k, v.Name, err)
 				return err
 			}
 		}
 	}
 	// Generate the server initialization code
-	if f,err := os.Create(suiteDir+"/serverInit.go"); err == nil {
+	if f, err := os.Create(suiteDir + "/serverInit.go"); err == nil {
 		defer f.Close()
-		//if err := t.ExecuteTemplate(os.Stdout, "server.go", *sc); err != nil {}
-		if err := t.ExecuteTemplate(f, "serverInit.go", servers); err != nil {
+		//if err := t.ExecuteTemplate(os.Stdout, "server.go.tmpl", *sc); err != nil {}
+		if err := t.ExecuteTemplate(f, "serverInit.go.tmpl", servers); err != nil {
 			log.Errorf("Unable to execute template for serverInit.go: %v", err)
 			return err
 		}
@@ -393,37 +389,37 @@
 	return nil
 }
 
-func generateClients(conf *TestConfig, suiteDir string, ts * TestSuite,
-						t *template.Template) error {
+func generateClients(conf *TestConfig, suiteDir string, ts *TestSuite,
+	t *template.Template) error {
 	var clients []ClientConfig
-	for k,v := range ts.Env.Clients.Endpoints {
+	for k, v := range ts.Env.Clients.Endpoints {
 		log.Infof("Generating the code for client[%d]: %s", k, v.Name)
-		cc := &ClientConfig{Name:v.Name, Port:v.Port, Ct:k, Imports:ts.Env.Clients.Imports,
-							Methods:make(map[string]*mthd)}
-		for _,v1 := range ts.Env.ProtoFiles {
-			imp := &ProtoImport{Short:v1.Package,
-								Package:v1.ImportPath+v1.Package,
-								Service:v1.Service}
+		cc := &ClientConfig{Name: v.Name, Port: v.Port, Ct: k, Imports: ts.Env.Clients.Imports,
+			Methods: make(map[string]*mthd)}
+		for _, v1 := range ts.Env.ProtoFiles {
+			imp := &ProtoImport{Short: v1.Package,
+				Package: v1.ImportPath + v1.Package,
+				Service: v1.Service}
 			cc.ProtoImports = append(cc.ProtoImports, *imp)
 			// Compile the template from the file
 			log.Debugf("Proto substs: %v", ts.Env.ProtoSubsts)
 			if mthds, err := loadProtoMap(ts.Env.ProtoDesc, v1.Package,
-											v1.Service, ts.Env.ProtoSubsts); err != nil {
+				v1.Service, ts.Env.ProtoSubsts); err != nil {
 				log.Errorf("Unable to process proto descriptor file %s for package: %s, service: %s",
-						ts.Env.ProtoDesc, v1.Package, v1.Service)
+					ts.Env.ProtoDesc, v1.Package, v1.Service)
 				return err
 			} else {
 				// Add to the known methods
-				for k,v := range mthds {
+				for k, v := range mthds {
 					cc.Methods[k] = v
 				}
 			}
 		}
 		clients = append(clients, *cc)
-		if f,err := os.Create(suiteDir+"/"+v.Name+"_client.go"); err == nil {
-			_=f
+		if f, err := os.Create(suiteDir + "/" + v.Name + "_client.go"); err == nil {
+			_ = f
 			defer f.Close()
-			if err := t.ExecuteTemplate(f, "client.go", cc); err != nil {
+			if err := t.ExecuteTemplate(f, "client.go.tmpl", cc); err != nil {
 				log.Errorf("Unable to execute template for client.go: %v", err)
 				return err
 			}
@@ -432,10 +428,10 @@
 			return err
 		}
 	}
-	if f,err := os.Create(suiteDir+"/clientInit.go"); err == nil {
+	if f, err := os.Create(suiteDir + "/clientInit.go"); err == nil {
 		defer f.Close()
-		//if err := t.ExecuteTemplate(os.Stdout, "server.go", *sc); err != nil {}
-		if err := t.ExecuteTemplate(f, "clientInit.go", clients); err != nil {
+		//if err := t.ExecuteTemplate(os.Stdout, "server.go.tmpl", *sc); err != nil {}
+		if err := t.ExecuteTemplate(f, "clientInit.go.tmpl", clients); err != nil {
 			log.Errorf("Unable to execute template for clientInit.go: %v", err)
 			return err
 		}
@@ -443,8 +439,8 @@
 	return nil
 }
 
-func serverExists(srvr string, ts * TestSuite) bool {
-	for _,v := range ts.Env.Servers.Endpoints {
+func serverExists(srvr string, ts *TestSuite) bool {
+	for _, v := range ts.Env.Servers.Endpoints {
 		if v.Name == srvr {
 			return true
 		}
@@ -457,7 +453,7 @@
 	var p string
 	var e string
 	r := regexp.MustCompile(`^([^.]+)\..*$`)
-	for _,v := range tests {
+	for _, v := range tests {
 		pa := r.FindStringSubmatch(v.Send.ParamType)
 		if len(pa) == 2 {
 			p = pa[1]
@@ -470,10 +466,10 @@
 		} else {
 			log.Errorf("Internal error regexp returned %v", pa)
 		}
-		if _,ok := rtrn[p]; ok == false {
+		if _, ok := rtrn[p]; ok == false {
 			rtrn[p] = struct{}{}
 		}
-		if _,ok := rtrn[e]; ok == false {
+		if _, ok := rtrn[e]; ok == false {
 			rtrn[e] = struct{}{}
 		}
 	}
@@ -483,21 +479,21 @@
 func fixupProtoImports(protoImports []ProtoImport, used map[string]struct{}) []ProtoImport {
 	var rtrn []ProtoImport
 	//log.Infof("Updating imports %v, using %v", protoImports, used)
-	for _,v := range protoImports {
+	for _, v := range protoImports {
 		//log.Infof("Looking for package %s", v.Package)
-		if _,ok := used[v.Short]; ok == true {
-			rtrn = append(rtrn, ProtoImport {
+		if _, ok := used[v.Short]; ok == true {
+			rtrn = append(rtrn, ProtoImport{
 				Service: v.Service,
-				Short: v.Short,
+				Short:   v.Short,
 				Package: v.Package,
-				Used: true,
+				Used:    true,
 			})
 		} else {
-			rtrn = append(rtrn, ProtoImport {
+			rtrn = append(rtrn, ProtoImport{
 				Service: v.Service,
-				Short: v.Short,
+				Short:   v.Short,
 				Package: v.Package,
-				Used: false,
+				Used:    false,
 			})
 		}
 	}
@@ -510,7 +506,7 @@
 	var p string
 	re := regexp.MustCompile(`^.*/([^/]+)$`)
 	//log.Infof("Updating imports %v, using %v", protoImports, used)
-	for _,v := range imports {
+	for _, v := range imports {
 		//log.Infof("Looking for match in %s", v.Package)
 		pa := re.FindStringSubmatch(v.Package)
 		if len(pa) == 2 {
@@ -519,15 +515,15 @@
 			log.Errorf("Substring match failed, regexp returned %v", pa)
 		}
 		//log.Infof("Looking for package %s", v.Package)
-		if _,ok := used[p]; ok == true {
-			rtrn = append(rtrn, Import {
+		if _, ok := used[p]; ok == true {
+			rtrn = append(rtrn, Import{
 				Package: v.Package,
-				Used: true,
+				Used:    true,
 			})
 		} else {
-			rtrn = append(rtrn, Import {
+			rtrn = append(rtrn, Import{
 				Package: v.Package,
-				Used: false,
+				Used:    false,
 			})
 		}
 	}
@@ -535,37 +531,36 @@
 	return rtrn
 }
 
-
-func generateTestCases(conf *TestConfig, suiteDir string, ts * TestSuite,
-						t *template.Template) error {
+func generateTestCases(conf *TestConfig, suiteDir string, ts *TestSuite,
+	t *template.Template) error {
 	var mthdMap map[string]*mthd
 	mthdMap = make(map[string]*mthd)
 	// Generate the test cases
 	log.Info("Generating the test cases: runTests.go")
-	tc := &TestList{Funcs:make(map[string]MethodTypes),
-					FileNum:0, HasFuncs: false,
-					Offset:0}
-	for _,v := range ts.Env.Imports {
-		tc.Imports = append(tc.Imports,Import{Package:v, Used:true})
+	tc := &TestList{Funcs: make(map[string]MethodTypes),
+		FileNum: 0, HasFuncs: false,
+		Offset: 0}
+	for _, v := range ts.Env.Imports {
+		tc.Imports = append(tc.Imports, Import{Package: v, Used: true})
 	}
 
 	// Load the proto descriptor file
-	for _,v := range ts.Env.ProtoFiles {
-		imp := &ProtoImport{Short:v.Package,
-							Package:v.ImportPath+v.Package,
-							Service:v.Service,
-							Used:true}
+	for _, v := range ts.Env.ProtoFiles {
+		imp := &ProtoImport{Short: v.Package,
+			Package: v.ImportPath + v.Package,
+			Service: v.Service,
+			Used:    true}
 		tc.ProtoImports = append(tc.ProtoImports, *imp)
 		// Compile the template from the file
 		log.Debugf("Proto substs: %v", ts.Env.ProtoSubsts)
 		if mthds, err := loadProtoMap(ts.Env.ProtoDesc, v.Package,
-										v.Service, ts.Env.ProtoSubsts); err != nil {
+			v.Service, ts.Env.ProtoSubsts); err != nil {
 			log.Errorf("Unable to process proto descriptor file %s for package: %s, service: %s",
-					ts.Env.ProtoDesc, v.Package, v.Service)
+				ts.Env.ProtoDesc, v.Package, v.Service)
 			return err
 		} else {
 			// Add to the known methods
-			for k,v := range mthds {
+			for k, v := range mthds {
 				mthdMap[k] = v
 			}
 		}
@@ -600,18 +595,18 @@
 	//											  ReturnType:mthdMap[v.Send.Method].Rtrn}
 	//	}
 	//}
-	for i:=1; i<int(math.Ceil(float64(len(ts.Tests))/float64(MAX_CT))); i++ {
+	for i := 1; i < int(math.Ceil(float64(len(ts.Tests))/float64(MAX_CT))); i++ {
 		tc.RunTestsCallList = append(tc.RunTestsCallList, "runTests"+strconv.Itoa(i))
 	}
 
 	// Create the test data structure for the template
-	for _,v := range ts.Tests {
+	for _, v := range ts.Tests {
 		var test TestCase
 
-		if _,ok := tc.Funcs[v.Send.Method]; ok == false {
-			tc.Funcs[v.Send.Method] = MethodTypes{ParamType:mthdMap[v.Send.Method].Param,
-												  ReturnType:mthdMap[v.Send.Method].Rtrn,
-												  CodeGenerated:false}
+		if _, ok := tc.Funcs[v.Send.Method]; ok == false {
+			tc.Funcs[v.Send.Method] = MethodTypes{ParamType: mthdMap[v.Send.Method].Param,
+				ReturnType:    mthdMap[v.Send.Method].Rtrn,
+				CodeGenerated: false}
 			tc.HasFuncs = true
 		}
 
@@ -623,13 +618,13 @@
 		test.Send.ParamType = mthdMap[test.Send.Method].Param
 		test.Send.Expect = v.Send.Expect
 		test.Send.ExpectType = mthdMap[test.Send.Method].Rtrn
-		for _,v1 := range v.Send.MetaData {
-			test.Send.MetaData = append(test.Send.MetaData,v1)
+		for _, v1 := range v.Send.MetaData {
+			test.Send.MetaData = append(test.Send.MetaData, v1)
 		}
-		for _,v1 := range v.Send.ExpectMeta {
-			test.Send.ExpectMeta = append(test.Send.ExpectMeta,v1)
+		for _, v1 := range v.Send.ExpectMeta {
+			test.Send.ExpectMeta = append(test.Send.ExpectMeta, v1)
 		}
-		for _,v1 := range v.Servers {
+		for _, v1 := range v.Servers {
 			var srvr Server
 			if serverExists(v1.Name, ts) == false {
 				log.Errorf("Server '%s' is not defined!!", v1.Name)
@@ -647,24 +642,24 @@
 			tc.ProtoImports = fixupProtoImports(tc.ProtoImports, pkgs)
 			tc.Imports = fixupImports(tc.Imports, pkgs)
 			//log.Infof("The packages needed are: %v", pkgs)
-			if f,err := os.Create(suiteDir+"/runTests"+strconv.Itoa(tc.FileNum)+".go"); err == nil {
-				if err := t.ExecuteTemplate(f, "runTests.go", tc); err != nil {
-						log.Errorf("Unable to execute template for runTests.go: %v", err)
+			if f, err := os.Create(suiteDir + "/runTests" + strconv.Itoa(tc.FileNum) + ".go"); err == nil {
+				if err := t.ExecuteTemplate(f, "runTests.go.tmpl", tc); err != nil {
+					log.Errorf("Unable to execute template for runTests.go: %v", err)
 				}
 				f.Close()
 			} else {
 				log.Errorf("Couldn't create file %s : %v",
-						suiteDir+"/runTests"+strconv.Itoa(tc.FileNum)+".go", err)
+					suiteDir+"/runTests"+strconv.Itoa(tc.FileNum)+".go", err)
 			}
 			tc.FileNum++
 			//tc.NextFile++
 			maxCt = MAX_CT
 			// Mark the functions as generated.
 			tc.Tests = []TestCase{}
-			for k,v := range tc.Funcs {
-				tc.Funcs[k] = MethodTypes{ParamType:v.ParamType,
-										 ReturnType:v.ReturnType,
-										 CodeGenerated:true}
+			for k, v := range tc.Funcs {
+				tc.Funcs[k] = MethodTypes{ParamType: v.ParamType,
+					ReturnType:    v.ReturnType,
+					CodeGenerated: true}
 			}
 			tc.HasFuncs = false
 			tc.Offset += MAX_CT
@@ -679,18 +674,18 @@
 	tc.ProtoImports = fixupProtoImports(tc.ProtoImports, pkgs)
 	tc.Imports = fixupImports(tc.Imports, pkgs)
 	//log.Infof("The packages needed are: %v", pkgs)
-	if f,err := os.Create(suiteDir+"/runTests"+strconv.Itoa(tc.FileNum)+".go"); err == nil {
-		if err := t.ExecuteTemplate(f, "runTests.go", tc); err != nil {
-				log.Errorf("Unable to execute template for runTests.go: %v", err)
+	if f, err := os.Create(suiteDir + "/runTests" + strconv.Itoa(tc.FileNum) + ".go"); err == nil {
+		if err := t.ExecuteTemplate(f, "runTests.go.tmpl", tc); err != nil {
+			log.Errorf("Unable to execute template for runTests.go: %v", err)
 		}
 		f.Close()
 	} else {
 		log.Errorf("Couldn't create file %s : %v",
-				suiteDir+"/runTests"+strconv.Itoa(tc.FileNum)+".go", err)
+			suiteDir+"/runTests"+strconv.Itoa(tc.FileNum)+".go", err)
 	}
 
 	//if f,err := os.Create(suiteDir+"/runTests.go"); err == nil {
-	//	if err := t.ExecuteTemplate(f, "runTests.go", tc); err != nil {
+	//	if err := t.ExecuteTemplate(f, "runTests.go.tmpl", tc); err != nil {
 	//			log.Errorf("Unable to execute template for runTests.go: %v", err)
 	//	}
 	//	f.Close()
@@ -708,21 +703,21 @@
 		return err
 	}
 
-	for k,v := range conf.Suites {
-	    var suiteDir string = srcDir+"/"+v
+	for k, v := range conf.Suites {
+		var suiteDir string = srcDir + "/" + v
 		log.Debugf("Suite[%d] - %s", k, v)
 		ts := &TestSuite{}
 		ts.loadSuite(v)
 		log.Debugf("Suite %s: %v", v, ts)
 		log.Infof("Processing test suite %s", v)
 
-		t := template.Must(template.New("").ParseFiles("../templates/server.go",
-														"../templates/serverInit.go",
-														"../templates/client.go",
-														"../templates/clientInit.go",
-														"../templates/runTests.go",
-														"../templates/stats.go",
-														"../templates/main.go"))
+		t := template.Must(template.New("").ParseFiles("../templates/server.go.tmpl",
+			"../templates/serverInit.go.tmpl",
+			"../templates/client.go.tmpl",
+			"../templates/clientInit.go.tmpl",
+			"../templates/runTests.go.tmpl",
+			"../templates/stats.go.tmpl",
+			"../templates/main.go.tmpl"))
 		// Create a directory for he source code for this test suite
 		if err := os.Mkdir(suiteDir, 0777); err != nil {
 			log.Errorf("Unable to create directory '%s':%v\n", v, err)
@@ -746,9 +741,9 @@
 
 		// Finally generate the main file
 		log.Info("Generating main.go")
-		if f,err := os.Create(suiteDir+"/main.go"); err == nil {
-			if err := t.ExecuteTemplate(f, "main.go", ts.Env); err != nil {
-					log.Errorf("Unable to execute template for main.go: %v", err)
+		if f, err := os.Create(suiteDir + "/main.go"); err == nil {
+			if err := t.ExecuteTemplate(f, "main.go.tmpl", ts.Env); err != nil {
+				log.Errorf("Unable to execute template for main.go: %v", err)
 			}
 			f.Close()
 		} else {
@@ -756,19 +751,18 @@
 		}
 
 		log.Infof("Copying over common modules")
-		if f,err := os.Create(suiteDir+"/stats.go"); err == nil {
-			if err := t.ExecuteTemplate(f, "stats.go", ts.Env); err != nil {
-					log.Errorf("Unable to execute template for stats.go: %v", err)
+		if f, err := os.Create(suiteDir + "/stats.go"); err == nil {
+			if err := t.ExecuteTemplate(f, "stats.go.tmpl", ts.Env); err != nil {
+				log.Errorf("Unable to execute template for stats.go: %v", err)
 			}
 			f.Close()
 		} else {
 			log.Errorf("Couldn't create file %s : %v", suiteDir+"/stats.go", err)
 		}
 
-
 		log.Infof("Compiling test suite: %s in directory %s", v, suiteDir)
 		if err := os.Chdir(suiteDir); err != nil {
-			log.Errorf("Could not change to directory '%s':%v",suiteDir, err)
+			log.Errorf("Could not change to directory '%s':%v", suiteDir, err)
 		}
 		cmd := exec.Command("go", "build", "-o", outDir+"/"+v+".e")
 		cmd.Stdin = os.Stdin
@@ -778,7 +772,7 @@
 			log.Errorf("Error running the compile command:%v", err)
 		}
 		if err := os.Chdir("../../suites"); err != nil {
-			log.Errorf("Could not change to directory '%s':%v","../../suites", err)
+			log.Errorf("Could not change to directory '%s':%v", "../../suites", err)
 		}
 	}
 	return nil
@@ -791,19 +785,19 @@
 		log.Errorf("Unable to create directory 'driver':%v\n", err)
 		return err
 	}
-	t := template.Must(template.New("").ParseFiles("../templates/runAll.go",
-					"../templates/stats.go"))
-	if f,err := os.Create(srcDir+"/runAll.go"); err == nil {
-		if err := t.ExecuteTemplate(f, "runAll.go", conf.Suites); err != nil {
-				log.Errorf("Unable to execute template for runAll.go: %v", err)
+	t := template.Must(template.New("").ParseFiles("../templates/runAll.go.tmpl",
+		"../templates/stats.go.tmpl"))
+	if f, err := os.Create(srcDir + "/runAll.go"); err == nil {
+		if err := t.ExecuteTemplate(f, "runAll.go.tmpl", conf.Suites); err != nil {
+			log.Errorf("Unable to execute template for runAll.go: %v", err)
 		}
 		f.Close()
 	} else {
 		log.Errorf("Couldn't create file %s : %v", srcDir+"/runAll.go", err)
 	}
-	if f,err := os.Create(srcDir+"/stats.go"); err == nil {
-		if err := t.ExecuteTemplate(f, "stats.go", conf.Suites); err != nil {
-				log.Errorf("Unable to execute template for stats.go: %v", err)
+	if f, err := os.Create(srcDir + "/stats.go"); err == nil {
+		if err := t.ExecuteTemplate(f, "stats.go.tmpl", conf.Suites); err != nil {
+			log.Errorf("Unable to execute template for stats.go: %v", err)
 		}
 		f.Close()
 	} else {
@@ -823,16 +817,15 @@
 		log.Errorf("Error running the compile command:%v", err)
 	}
 	if err := os.Chdir("../../suites"); err != nil {
-		log.Errorf("Could not change to directory 'driver':%v",err)
+		log.Errorf("Could not change to directory 'driver':%v", err)
 	}
 
 	return nil
 }
 
-
 func main() {
 
-	conf,err := parseCmd()
+	conf, err := parseCmd()
 	if err != nil {
 		fmt.Printf("Error: %v\n", err)
 		return
@@ -854,4 +847,3 @@
 	generateTestDriver(conf, "../tests/driver", "/src/tests")
 	return
 }
-
