diff --git a/gitea/gitea.go b/gitea/gitea.go
index 111e15c5cfa9c5cf27521cc5a60510455d598a7b..25c036dc6f366c2be7c9c54f92c9f2979c1fb2cf 100644
--- a/gitea/gitea.go
+++ b/gitea/gitea.go
@@ -3,6 +3,7 @@ package gitea
 import (
 	"code.gitea.io/gitea/modules/structs"
 	"code.gitea.io/sdk/gitea"
+	"fmt"
 	"log"
 	"net/url" // to check URL init vars
 	"reflect" // to compare structs
@@ -10,21 +11,31 @@ import (
 
 // Gitea holds the gitea functionality config vars
 type Gitea struct {
-	GiteaURL, Token, CloneAddr, WebhookRepoURL, WebhookRepoSecret, WebhookURL, WebhookSecret, Repo string
+	giteaURL          string
+	token             string
+	cloneAddr         string
+	webhookRepoURL    string
+	webhookRepoSecret string
+	webhookURL        string
+	webhookSecret     string
+}
+
+type Repo struct {
+	user              string
+	repo              string
+	cloneAddr         string
+	webhookRepoURL    string
+	webhookRepoSecret string
+	client            *gitea.Client
 }
 
 func isValidURL(toTest string) bool {
 	_, err := url.ParseRequestURI(toTest)
-	if err != nil {
-		return false
-	} else {
-		return true
-	}
+	return err == nil
 }
 
 // Init gitea config vars
 func Init(giteaURL, token, cloneAddr, webhookRepoURL, webhookRepoSecret, webhookURL, webhookSecret string) *Gitea {
-
 	// check URL values
 	if !isValidURL(giteaURL) || !isValidURL(cloneAddr) || !isValidURL(webhookRepoURL) || !isValidURL(webhookURL) {
 		giteaURL = "" // to avoid process
@@ -32,26 +43,34 @@ func Init(giteaURL, token, cloneAddr, webhookRepoURL, webhookRepoSecret, webhook
 	}
 
 	return &Gitea{
-		GiteaURL:          giteaURL,
-		Token:             token,
-		CloneAddr:         cloneAddr,
-		WebhookRepoURL:    webhookRepoURL,
-		WebhookRepoSecret: webhookRepoSecret,
-		WebhookURL:        webhookURL,
-		WebhookSecret:     webhookSecret,
+		giteaURL:          giteaURL,
+		token:             token,
+		cloneAddr:         cloneAddr,
+		webhookRepoURL:    webhookRepoURL,
+		webhookRepoSecret: webhookRepoSecret,
+		webhookURL:        webhookURL,
+		webhookSecret:     webhookSecret,
 	}
 
 }
 
-func GiteaNewClient(giteaURL, token string) *gitea.Client {
-	client := gitea.NewClient(giteaURL, token)
-	return client
-
+func (g *Gitea) Repo(user string, repo string) (*Repo, error) {
+	if g.giteaURL == "" || g.token == "" || g.webhookRepoSecret == "" || g.webhookSecret == "" {
+		return nil, fmt.Errorf("Gitea config isn't right, some fields are empty.")
+	}
+	return &Repo{
+		user:              user,
+		repo:              repo,
+		cloneAddr:         g.cloneAddr,
+		webhookRepoURL:    g.webhookRepoURL,
+		webhookRepoSecret: g.webhookRepoSecret,
+		client:            gitea.NewClient(g.giteaURL, g.token),
+	}, nil
 }
 
-func GiteaUserID(user string, client *gitea.Client) (int, error) {
-	// check users exists and return user id
-	userexist, err := client.SearchUsers(user, 1)
+// userID check users exists and return user id
+func (r *Repo) userID() (int, error) {
+	userexist, err := r.client.SearchUsers(r.user, 1)
 	if err != nil {
 		return -1, err
 	}
@@ -64,70 +83,64 @@ func GiteaUserID(user string, client *gitea.Client) (int, error) {
 	return uid, nil
 }
 
-func RepoExists(user string, repo string, client *gitea.Client) bool {
-	// check repo exists.
-	repoexists, err := client.GetRepo(user, repo)
+// Exists checks if the repo exists.
+func (r *Repo) Exists() bool {
+	repoexists, err := r.client.GetRepo(r.user, r.repo)
 	if err != nil && err.Error() != "404 Not Found" {
 		return false
 	}
 	// (API responses with empty repo if doesn't exist.)
 	emptyrepo := &gitea.Repository{}
-	if reflect.DeepEqual(repoexists, emptyrepo) == true {
-		return false
-	} else {
-		return true
-	}
+	return !reflect.DeepEqual(repoexists, emptyrepo)
+}
+
+// Delete the repo
+func (r *Repo) Delete() error {
+	return r.client.DeleteRepo(r.user, r.repo)
 }
 
-func RepoDelete(user string, repo string, client *gitea.Client) error {
-	// delete repo
-	err := client.DeleteRepo(user, repo)
+// Migrate template repo to new user repo
+func (r *Repo) Migrate() error {
+	uid, err := r.userID()
 	if err != nil {
-		log.Printf("Error on delete repo.")
 		return err
 	}
-	return nil
-}
 
-func RepoMigrate(cloneAddr string, uid int, repo string, client *gitea.Client) error {
-	// migrate template repo to new user repo
-	migrateRepoOption := structs.MigrateRepoOption{CloneAddr: cloneAddr,
+	migrateRepoOption := structs.MigrateRepoOption{
+		CloneAddr:   r.cloneAddr,
 		Description: "Basic hugo site repo",
 		UID:         uid,
-		RepoName:    repo,
+		RepoName:    r.repo,
 		Private:     true}
 
-	_, err := client.MigrateRepo(migrateRepoOption)
-	if err != nil {
-		return err
-	}
-	return nil
+	_, err = r.client.MigrateRepo(migrateRepoOption)
+	return err
 }
 
-func RepoDeployKey(keypub, user, repo string, client *gitea.Client) error {
-	// put a deploy key on user repo
+// DeployKey put a deploy key on the user repo
+func (r *Repo) DeployKey(keypub string) error {
 	deployKeyOption := structs.CreateKeyOption{
 		Key:      keypub,
 		ReadOnly: true,
 		Title:    "Web deploy key"}
-	_, err := client.CreateDeployKey(user, repo, deployKeyOption)
+	_, err := r.client.CreateDeployKey(r.user, r.repo, deployKeyOption)
 	if err != nil {
 		return err
 	}
 	return nil
 }
 
-func RepoCreateWebhook(webhookRepoURL, webhookRepoSecret, user, repo string, client *gitea.Client) error {
-	// create a webhook on user repo
+// CreateWebhook create a webhook on the user repo
+func (r *Repo) CreateWebhook() error {
 	webHookOption := structs.CreateHookOption{
 		Active: true,
 		Config: map[string]string{"content_type": "json",
-			"url":    webhookRepoURL,
-			"secret": webhookRepoSecret},
+			"url":    r.webhookRepoURL,
+			"secret": r.webhookRepoSecret},
 		Events: []string{"push"},
 		Type:   "gitea"}
 
-	_, err := client.CreateRepoHook(user, repo, webHookOption)
+	_, err := r.client.CreateRepoHook(r.user, r.repo, webHookOption)
 	// TODO: <nil> no vale pa na
 	if err != nil && err.Error() != "<nil>" {
 		log.Printf("API Error on migrate.")
diff --git a/gitea/webhook.go b/gitea/webhook.go
index 2235d8ea4abe88750831f74398a1817ef482af19..461f2e1f263c400fb1b8e3e86aa119f4bdfaab4b 100644
--- a/gitea/webhook.go
+++ b/gitea/webhook.go
@@ -9,8 +9,7 @@ import (
 	"strings"
 )
 
-func WebhookDeploy(user, repo, keypriv, keypub, webhookURL, webhookSecret string) error {
-
+func (g *Gitea) WebhookDeploy(user, repo, keypriv, keypub string) error {
 	type WebhookData struct {
 		USER   string
 		REPO   string
@@ -19,14 +18,14 @@ func WebhookDeploy(user, repo, keypriv, keypub, webhookURL, webhookSecret string
 		SECRET string
 	}
 	keypriv = strings.Replace(keypriv, "\n", "|", -1) // key to oneline string, no breaks, '|' (pipe) is newline.
-	whData := WebhookData{user, repo, keypub, keypriv, webhookSecret}
+	whData := WebhookData{user, repo, keypub, keypriv, g.webhookSecret}
 	jsonData, err := json.Marshal(whData)
 	if err != nil && err.Error() != "<nil>" {
 		log.Printf("Error marshaling data for webhook.")
 		return err
 	}
 
-	req, err := http.NewRequest("POST", webhookURL, bytes.NewBuffer(jsonData))
+	req, err := http.NewRequest("POST", g.webhookURL, bytes.NewBuffer(jsonData))
 	req.Header.Set("Content-Type", "application/json")
 
 	client := &http.Client{}
diff --git a/server/gitea.go b/server/gitea.go
index c314a830da2314ef45a5e8366272157c2ad916a6..e41ecc760f672707591e39ba3e0590b19a76877f 100644
--- a/server/gitea.go
+++ b/server/gitea.go
@@ -14,33 +14,18 @@ func (s *server) giteaHandler(w http.ResponseWriter, r *http.Request) {
 		return
 	}
 
-	var (
-		giteaURL          = s.gitea.GiteaURL
-		token             = s.gitea.Token
-		cloneAddr         = s.gitea.CloneAddr
-		webhookRepoURL    = s.gitea.WebhookRepoURL
-		webhookRepoSecret = s.gitea.WebhookRepoSecret
-		webhookURL        = s.gitea.WebhookURL
-		webhookSecret     = s.gitea.WebhookSecret
-		usergitea         = response.User
-		repo              = r.FormValue("reponame")
-	)
-
-	// check config vars. giteaURL is empty if any URL fields are empty, init (gitea package) cares about it.
-	if giteaURL == "" || token == "" || webhookRepoSecret == "" || webhookSecret == "" {
+	usergitea := response.User
+	reponame := r.FormValue("reponame")
+	repo, err := s.gitea.Repo(usergitea, reponame)
+	if err != nil {
 		response.execute("ErrorGiteaInit")
-		log.Printf("Gitea config isn't right, some fields are empty.")
+		log.Printf("Error loading the repo: %v", err)
 		return
 	}
 
-	// create client connection to gitea
-	client := gitea.GiteaNewClient(giteaURL, token)
-
-	uid, err := gitea.GiteaUserID(usergitea, client)
-
 	// clean existing repo
-	if gitea.RepoExists(usergitea, repo, client) {
-		if err := gitea.RepoDelete(usergitea, repo, client); err != nil {
+	if repo.Exists() {
+		if err := repo.Delete(); err != nil {
 			log.Printf("Error deleting gitea repo: %v ", err)
 			response.execute("Error")
 			return
@@ -48,7 +33,7 @@ func (s *server) giteaHandler(w http.ResponseWriter, r *http.Request) {
 	}
 
 	// create repo from template repo
-	if err = gitea.RepoMigrate(cloneAddr, uid, repo, client); err != nil {
+	if err := repo.Migrate(); err != nil {
 		log.Printf("Error migrating template repo: %v", err)
 		response.execute("Error")
 		return
@@ -58,7 +43,7 @@ func (s *server) giteaHandler(w http.ResponseWriter, r *http.Request) {
 	keypriv, keypub, err := gitea.GenerateRSAKeyPair(4096)
 	if err != nil {
 		log.Printf("Error generating key pair: ", err)
-		if err := gitea.RepoDelete(usergitea, repo, client); err != nil {
+		if err := repo.Delete(); err != nil {
 			log.Printf("Error deleting gitea repo: %v", err)
 		}
 		response.execute("Error")
@@ -66,9 +51,9 @@ func (s *server) giteaHandler(w http.ResponseWriter, r *http.Request) {
 	}
 
 	// create deploy key on repo
-	if err = gitea.RepoDeployKey(keypub, usergitea, repo, client); err != nil {
+	if err = repo.DeployKey(keypub); err != nil {
 		log.Printf("Error deploying key on gitea repo: %v", err)
-		if err := gitea.RepoDelete(usergitea, repo, client); err != nil {
+		if err := repo.Delete(); err != nil {
 			log.Printf("Error deleting gitea repo: %v", err)
 		}
 		response.execute("Error")
@@ -76,9 +61,9 @@ func (s *server) giteaHandler(w http.ResponseWriter, r *http.Request) {
 	}
 
 	// create gitea webhook on repo
-	if err = gitea.RepoCreateWebhook(webhookRepoURL, webhookRepoSecret, usergitea, repo, client); err != nil {
+	if err = repo.CreateWebhook(); err != nil {
 		log.Printf("Error creating webhook on gitea repo: %v", err)
-		if err := gitea.RepoDelete(usergitea, repo, client); err != nil {
+		if err := repo.Delete(); err != nil {
 			log.Printf("Error deleting gitea repo: %v", err)
 		}
 		response.execute("Error")
@@ -86,9 +71,9 @@ func (s *server) giteaHandler(w http.ResponseWriter, r *http.Request) {
 	}
 
 	// send keys to web host via webhook.
-	if err = gitea.WebhookDeploy(usergitea, repo, keypriv, keypub, webhookURL, webhookSecret); err != nil {
+	if err = s.gitea.WebhookDeploy(usergitea, reponame, keypriv, keypub); err != nil {
 		log.Printf("Error passing keys to webserver host: %v", err)
-		if err = gitea.RepoDelete(usergitea, repo, client); err != nil {
+		if err = repo.Delete(); err != nil {
 			log.Printf("Error deleting gitea repo: %v", err)
 		}
 		response.execute("Error")
@@ -97,5 +82,4 @@ func (s *server) giteaHandler(w http.ResponseWriter, r *http.Request) {
 
 	log.Printf("Gitea repo deployed and keys sent to webhook listener.")
 	response.execute("RepoDeployed")
-
 }