diff --git a/migrations/0_29092022_create_main_tables.sql b/migrations/0_29092022_create_main_tables.sql
index 55c3316..65d0399 100644
--- a/migrations/0_29092022_create_main_tables.sql
+++ b/migrations/0_29092022_create_main_tables.sql
@@ -89,10 +89,6 @@ CREATE TABLE loan (
 	ltv 		FLOAT(5, 2) DEFAULT 0,
 	dti 		FLOAT(5, 2) DEFAULT 1,
 	hoi 			INT DEFAULT 0, /* Hazard insurance annual payments */
-	mi_name 		VARCHAR(50) NOT NULL,
-	/* Mortgage insurance title shown in menu */
-	mi_amount 		INT, /* Mortgage insurance amount */
-	lender 			VARCHAR(30) DEFAULT '',
 	name 			VARCHAR(30) DEFAULT '',
 	PRIMARY KEY (`id`),
 	FOREIGN KEY (estimate_id) REFERENCES estimate(id),
@@ -100,6 +96,22 @@ CREATE TABLE loan (
 	ON UPDATE RESTRICT
 );
 
+CREATE TABLE mi (
+	id 	INT AUTO_INCREMENT,
+	loan_id 	INT,
+	type 	VARCHAR(10) NOT NULL DEFAULT "",
+	label 	VARCHAR(30) NOT NULL DEFAULT "",
+	lender 	VARCHAR(20) NOT NULL DEFAULT "",
+	rate 	INT DEFAULT 0,
+	premium 	INT DEFAULT 0,
+	upfront 	INT DEFAULT 0,
+	five_year_total 	INT DEFAULT 0,
+	initial_premium 	INT DEFAULT 0,
+	initial_rate 	INT DEFAULT 0,
+	PRIMARY KEY (`id`),
+	FOREIGN KEY (loan_id) REFERENCES loan(id)
+);
+
 /* template = true fees are saved for users or branches. If template or default
  * are true, estimate_id should be null.*/
 CREATE TABLE fee (
diff --git a/migrations/reset.sql b/migrations/reset.sql
index e5228f8..ad69cd5 100644
--- a/migrations/reset.sql
+++ b/migrations/reset.sql
@@ -1,3 +1,4 @@
+DROP TABLE IF EXISTS mi;
 DROP TABLE IF EXISTS fee;
 DROP TABLE IF EXISTS fee_template;
 DROP TABLE IF EXISTS loan;
diff --git a/migrations/seed.sql b/migrations/seed.sql
index 40aeb25..a776b8b 100644
--- a/migrations/seed.sql
+++ b/migrations/seed.sql
@@ -222,9 +222,6 @@ INSERT INTO loan (
 	ltv,
 	dti,
 	hoi,
-	mi_name,
-	mi_amount,
-	lender,
 	name
 ) VALUES
 (
@@ -236,9 +233,6 @@ INSERT INTO loan (
 	88.00,
 	5.00,
 	0,
-	"custom mi",
-	234000,
-	"National MI",
 	"For client 1"
 ),
 (
@@ -250,9 +244,6 @@ INSERT INTO loan (
 	90.00,
 	6.70,
 	0,
-	"maybe MGIC",
-	234000,
-	"MGIC",
 	"For client 2"
 ),
 (
@@ -264,8 +255,30 @@ INSERT INTO loan (
 	95.00,
 	4.90,
 	0,
-	"custom mi",
-	234000,
-	"another lender",
 	"Random name"
 );
+
+INSERT INTO mi (
+	loan_id,
+	type,
+	label,
+	lender,
+	rate,
+	premium,
+	upfront,
+	five_year_total,
+	initial_premium,
+	initial_rate
+) VALUES
+(
+	1,
+	"BPM",
+	"National MI test loan",
+	"National MI",
+	28,
+	77000,
+	0,
+	4620000,
+	77000,
+	28
+);
diff --git a/skouter.go b/skouter.go
index c2310c0..8505cd6 100644
--- a/skouter.go
+++ b/skouter.go
@@ -69,16 +69,22 @@ type Loan struct {
 	Dti 	float32 	`json:"dti"`
 	Hoi		int 	`json:"hoi"`
 	Interest	int 	`json:"interest"`
-	Lender		string 	`json:"lender"`
-	MiName		string 	`json:"miName"`
-	MiAmount	int 	`json:"miAmount"`
-	Mi	map[string]interface{} 	`json:"mi"`
+	Mi 	MI 	`json:"mi"`
 	Fees		[]Fee 	`json:"fees"`
 	Name		string 	`json:"name"`
 }
 
 type MI struct {
-	Id int
+	Type string
+	Label string
+	Lender string
+	Rate float32
+	Premium float32
+	Upfront float32
+	FiveYearTotal float32
+	InitialAllInPremium float32
+	InitialAllInRate float32
+	InitialAmount float32
 }
 
 type Estimate struct {
@@ -299,12 +305,41 @@ func getFeesTemp(db *sql.DB, user int) ([]FeeTemplate, error) {
 	return fees, nil
 }
 
+func getMi(db *sql.DB, loan int) (MI, error) {
+	var mi MI
+
+	query := `SELECT
+	type, label, lender, rate, premium, upfront, five_year_total,
+	initial_premium, initial_rate, initial_amount
+	FROM mi WHERE loan_id = ?`
+
+	row := db.QueryRow(query, loan)
+
+	if err := row.Scan(
+		&mi.Type,
+		&mi.Label,
+		&mi.Lender,
+		&mi.Rate,
+		&mi.Premium,
+		&mi.Upfront,
+		&mi.FiveYearTotal,
+		&mi.InitialAllInPremium,
+		&mi.InitialAllInRate,
+		&mi.InitialAmount,
+		)
+	err != nil {
+		return mi, err
+	}
+
+	return mi, nil
+}
+
 func getLoans(db *sql.DB, estimate int) ([]Loan, error) {
 	var loans []Loan
 
 	query := `SELECT
-	l.id, l.amount, l.term, l.interest, l.ltv, l.dti, l.hoi, l.mi_name,
-	l.mi_amount, lt.id, lt.user_id, lt.branch_id, lt.name
+	l.id, l.amount, l.term, l.interest, l.ltv, l.dti, l.hoi,
+	lt.id, lt.user_id, lt.branch_id, lt.name
 	FROM loan l INNER JOIN loan_type lt ON l.type_id = lt.id
 	WHERE l.estimate_id = ?
 	`
@@ -327,8 +362,6 @@ func getLoans(db *sql.DB, estimate int) ([]Loan, error) {
 			&loan.Ltv,
 			&loan.Dti,
 			&loan.Hoi,
-			&loan.MiName,
-			&loan.MiAmount,
 			&loan.Type.Id,
 			&loan.Type.User,
 			&loan.Type.Branch,
@@ -337,7 +370,11 @@ func getLoans(db *sql.DB, estimate int) ([]Loan, error) {
 		err != nil {
 			return loans, fmt.Errorf("Loans scanning error: %v", err)
         }
-
+		mi, err := getMi(db, loan.Id)
+		if err != nil {
+			return loans, err
+        }
+		loan.Mi = mi
 		loans = append(loans, loan)
 	}
 	
@@ -365,7 +402,8 @@ func getBorrower(db *sql.DB, id int) (Borrower, error) {
 	return borrower, nil
 }
 
-func getMi(db *sql.DB, estimate *Estimate, pos int) (*Estimate) {
+// Query Lender APIs and parse responses into MI structs
+func fetchMi(db *sql.DB, estimate *Estimate, pos int) []MI {
 	var err error
 	var loan Loan = estimate.Loans[pos]
 
@@ -447,11 +485,10 @@ func getMi(db *sql.DB, estimate *Estimate, pos int) (*Estimate) {
 
 	if resp.StatusCode != 200 {
 		log.Printf("the status: %v\nthe resp: %v\n the req: %v\n the body: %v\n",
-		resp.Status,  resp, req.Body, bytes.NewBuffer(body))
+		resp.Status, resp, req.Body, bytes.NewBuffer(body))
 	} else {
 		json.NewDecoder(resp.Body).Decode(&res)
-		log.Printf("the valid resp: %v", res)
-		estimate.Loans[pos].Mi = res
+		// estimate.Loans[pos].Mi = res
 	}
 
 	return estimate
@@ -530,7 +567,7 @@ func api(w http.ResponseWriter, r *http.Request) {
 			break
 		}
 
-		json.NewEncoder(w).Encode(getMi(db, &est, 0))
+		json.NewEncoder(w).Encode(fetchMi(db, &est, 0).Loans[0].Mi)
 
 		// if err != nil {
 		// 	json.NewEncoder(w).Encode(err)