diff --git a/.DS_Store b/.DS_Store
new file mode 100644
index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6
Binary files /dev/null and b/.DS_Store differ
diff --git a/__pycache__/tSnS.cpython-38.pyc b/__pycache__/tSnS.cpython-38.pyc
index 45462ff99d850960856b55c316c47e6591ea6ea7..18e5191016c906076dfecd7be4d8892488f30e6a 100644
Binary files a/__pycache__/tSnS.cpython-38.pyc and b/__pycache__/tSnS.cpython-38.pyc differ
diff --git a/spin_texture.py b/spin_texture.py
new file mode 100644
index 0000000000000000000000000000000000000000..a9f56354730c342089e930cdfc99902878775987
--- /dev/null
+++ b/spin_texture.py
@@ -0,0 +1,59 @@
+import numpy as np
+import matplotlib.pyplot as plt
+
+from momentum import Momentum
+from tSnS import tSnS
+
+
+def spin_texture(Nk=30, bandset=2): 
+
+    """
+    Compute Spin texture in BZ
+    """
+
+    #Pauli matrices and orbital identity
+    sigma_x_tau_0 = np.array([[0,0,1,0],[0,0,0,1],[1,0,0,0],[0,1,0,0]])
+    sigma_y_tau_0 = 1j*np.array([[0,0,-1,0],[0,0,0,-1],[1,0,0,0],[0,1,0,0]])
+    sigma_z_tau_0 = np.array([[1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,-1]])
+
+
+    #Create Mesh and compute spin polarization
+    mesh        = BZ.Bravais_mesh_simple(Nk)
+    ekf         = np.zeros((Nk**2, model.N))
+    ukf         = np.zeros((Nk**2, model.N, model.N), dtype=complex)
+    spin_pol    = np.zeros((Nk**2, 3, model.N), dtype=complex)
+
+    for i in range(len(mesh)):
+        ekf, ukf        = np.linalg.eigh(model.BH_Hamiltonian(mesh[i], bandset=bandset))
+        spin_pol[i,0,:] = (np.diagonal(ukf.T.conjugate()@sigma_x_tau_0@ukf)).real
+        spin_pol[i,1,:] = (np.diagonal(ukf.T.conjugate()@sigma_y_tau_0@ukf)).real
+        spin_pol[i,2,:] = (np.diagonal(ukf.T.conjugate()@sigma_z_tau_0@ukf)).real
+
+
+    fig, axes = plt.subplots(3, model.N, sharex=True, sharey=True, figsize=(4,3))
+    for i in range(3): 
+        for j in range(model.N): 
+            axes[i,j].scatter(mesh[:,0], mesh[:,1], c=spin_pol[:,i,j], cmap=plt.cm.RdBu, vmin=-1, vmax=1, s=1)
+            axes[i,j].axis('scaled')
+            axes[i,j].set_xticks([])
+            axes[i,j].set_yticks([])
+
+    axes[0,0].set_ylabel(r'$\langle S_x \rangle$')
+    axes[1,0].set_ylabel(r'$\langle S_y \rangle$')
+    axes[2,0].set_ylabel(r'$\langle S_z \rangle$')
+
+    axes[0,0].set_xlabel(r'$n_b = 1$', labelpad=-70)
+    axes[0,1].set_xlabel(r'$n_b = 2$', labelpad=-70)
+    axes[0,2].set_xlabel(r'$n_b = 3$', labelpad=-70)
+    axes[0,3].set_xlabel(r'$n_b = 4$', labelpad=-70)
+
+
+    plt.subplots_adjust(hspace=0, wspace=0)
+    plt.show()
+
+
+if __name__ == '__main__':
+
+    model = tSnS()
+    BZ    = Momentum(model.G1, model.G2)
+    spin_texture()
diff --git a/tSnS.py b/tSnS.py
index 7bfe6bee2a70bedac23f4f0e829702eee6fe48b9..9f1ed2fc46da2862e84ba55b12f9c28498b0936c 100644
--- a/tSnS.py
+++ b/tSnS.py
@@ -61,25 +61,15 @@ class tSnS:
 
 		if bandset == 1: 
 
-			popt = [-0.28147216773927675, 0.003966634424731179, 
-					0.0029073602294481787, -4.4983518626626615e-07, 
-					-0.004052637332926278, 0.00016072142349528914, 
-					-3.7721284264216035e-05, -0.0009141524777857822, 
-					-0.0011772772860306072, -0.0014951352789262786, 
-					0.0009438170971867384, -9.088937950755711e-05, 
-					-0.000692733427968305, 0.0002266622565665427, 
-					0.0005191476715863555]
+			popt = [-0.28159930344528794, 0.003968154118035716, 0.0030637767514870547, -0.00010069737918143397, 
+					-0.004016436852695664, -0.0008890332864148689, -0.001246870994836976, 0.000848707931621465, 
+					-0.0012602009377081112, -0.0007056692333075815, -0.0005572460653001037, -0.00045337702969447147, np.pi/30]
 
 		else: 
 
-			popt = [-0.32047590155917033, 0.0021542300052420408, 
-					0.001469771721045236, 9.574936436961549e-05, 
-					0.005574114270507838, -0.00026463100214217314, 
-					0.0004064637000665132, 0.0004858014275756446, 
-					0.0006724769177247459, -0.00029328415914492434, 
-					-0.0002932514194152098, 1.0106788563322311e-05, 
-					0.0007016914741439542, 0.0021456042488447995, 
-					0.0018535546929481545]
+			popt = [-0.32044985418524075,   0.002055488150036208,   0.0018580964148542333,  9.451241186629052e-05, 
+					0.0055709631952728005, 0.0005463154794551496, 0.0006627259014835454, -0.000292263072270747, 
+					-0.00029205370932945825, 0.0006839685785136236, -0.0021245180394823893, -0.0017931410640271215, np.pi/8]
 
 
 
@@ -87,11 +77,11 @@ class tSnS:
 		t_AA_0				= popt[0]
 		t_AB_0, t_AB_1 		= popt[1], popt[2]
 		t_AA_x, t_AA_y 		= popt[3], popt[4]
-		t_AB_mx, t_AB_px 	= popt[5], popt[6]
-		t_AB_my, t_AB_py 	= popt[7], popt[8]
-		t_AA_m, t_AA_p 		= popt[9], popt[10]
-		t_AA_2x, t_AA_2y 	= popt[11], popt[12]
-		tR_AB_0, tR_AB_1 	= popt[13], popt[14] 
+		t_AB_my, t_AB_py 	= popt[5], popt[6]
+		t_AA_m, t_AA_p 		= popt[7], popt[8]
+		t_AA_2y 			= popt[9]
+		tR_AB_0, tR_AB_1 	= popt[10], popt[11]
+		phi_AB 				= popt[12] 
 
 
 		##################################################
@@ -102,15 +92,6 @@ class tSnS:
 		ham[:,0,:,0] += t_AA_0*pauli[0]
 		ham[:,1,:,1] += t_AA_0*pauli[0]
 
-		#Nearest-Neighbor AB/BA coupling (1. nn)
-		hop = t_AB_0*(1.+self.phi_lm(k,0,-1))*pauli[0]
-		ham[:,0,:,1] += hop
-		ham[:,1,:,0] += np.conjugate(hop).T
-
-		hop = t_AB_1*(self.phi_lm(k,1,0)+self.phi_lm(k,1,-1))*pauli[0]
-		ham[:,0,:,1] += hop
-		ham[:,1,:,0] += np.conjugate(hop).T
-
 		#Nearest-Neighbor AA/BB coupling (2. nn)
 		hop = t_AA_x*(self.phi_lm(k,1,0))*pauli[0]
 		ham[:,0,:,0] += hop
@@ -150,12 +131,6 @@ class tSnS:
 		ham[:,1,:,1] += np.conjugate(hop)*pauli[0]
 
 		#Second shell (5. nn)
-		hop = t_AA_2x*self.phi_lm(k,2,0)*pauli[0]
-		ham[:,0,:,0] += hop
-		ham[:,0,:,0] += np.conjugate(hop).T
-		ham[:,1,:,1] += hop
-		ham[:,1,:,1] += np.conjugate(hop).T
-
 		hop = t_AA_2y*self.phi_lm(k,0,2)*pauli[0]
 		ham[:,0,:,0] += hop
 		ham[:,0,:,0] += np.conjugate(hop).T
@@ -166,18 +141,10 @@ class tSnS:
 		#AB coupling
 		################
 		#Edge states of second shell (4. nn)
-		hop = t_AB_mx*(self.phi_lm(k,2,0)+self.phi_lm(k,2,-1))*pauli[0]
-		ham[:,0,:,1] += hop
-		ham[:,1,:,0] += np.conjugate(hop).T
-
 		hop = t_AB_my*(self.phi_lm(k,1,1)+self.phi_lm(k,1,-2))*pauli[0]
 		ham[:,0,:,1] += hop
 		ham[:,1,:,0] += np.conjugate(hop).T
 
-		hop = t_AB_px*(self.phi_lm(k,-1,0)+self.phi_lm(k,-1,-1))*pauli[0]
-		ham[:,0,:,1] += hop
-		ham[:,1,:,0] += np.conjugate(hop).T
-
 		hop = t_AB_py*(self.phi_lm(k,0,1)+self.phi_lm(k,0,-2))*pauli[0]
 		ham[:,0,:,1] += hop
 		ham[:,1,:,0] += np.conjugate(hop).T			
@@ -203,6 +170,23 @@ class tSnS:
 		ham[:,0,:,1] += hop
 		ham[:,1,:,0] += np.conjugate(hop).T
 
+
+		######################################
+		#SOC Kane-Mele Coupling
+		######################################
+		#Nearest-neighbors (1. nn)
+		km = np.array([[np.exp(1j*phi_AB),0],[0,np.exp(1j*phi_AB).conjugate()]])
+		hop = t_AB_0*(1.+self.phi_lm(k,0,-1))*km
+		ham[:,0,:,1] += hop
+		ham[:,1,:,0] += np.conjugate(hop).T
+
+		km = np.array([[np.exp(-1j*phi_AB),0],[0,np.exp(-1j*phi_AB).conjugate()]])
+		hop = t_AB_1*(self.phi_lm(k,1,0)+self.phi_lm(k,1,-1))*km
+		ham[:,0,:,1] += hop
+		ham[:,1,:,0] += np.conjugate(hop).T
+
 		ham = ham.reshape((4,4))
 
+		assert np.allclose(ham, ham.conjugate().T, atol=1e-12)
+
 		return ham