diff --git a/data/model.py b/data/model.py
index 13021fd..e8b232c 100755
--- a/data/model.py
+++ b/data/model.py
@@ -5,55 +5,57 @@
 import string
 
 
-
 def get_sensor(module_name, value):
-	m = imp.load_source('module.name', module_name)
+    m = imp.load_source('module.name', module_name)
 
-	for i in m.ID_LOOKUP['SENSOR']:
+    for i in m.ID_LOOKUP['SENSOR']:
 
-		if m.ID_LOOKUP['SENSOR'][i] == value:
-			return i
+        if m.ID_LOOKUP['SENSOR'][i] == value:
+            return i
 
-	return 0xFF
-	
-def get_inventory_sensor (module_name, value):
-	m = imp.load_source('module.name', module_name)
+    return 0xFF
 
-	value = string.replace(value, m.INVENTORY_ROOT, '<inventory_root>')
 
-	for i in m.ID_LOOKUP['SENSOR']:
+def get_inventory_sensor(module_name, value):
+    m = imp.load_source('module.name', module_name)
 
-		if m.ID_LOOKUP['SENSOR'][i] == value:
-			return i
+    value = string.replace(value, m.INVENTORY_ROOT, '<inventory_root>')
 
-	return 0xFF
+    for i in m.ID_LOOKUP['SENSOR']:
+
+        if m.ID_LOOKUP['SENSOR'][i] == value:
+            return i
+
+    return 0xFF
 
 
 def get_inventory_list(module_name):
 
-	l = []
-	m = imp.load_source('module.name', module_name)
+    l = []
+    m = imp.load_source('module.name', module_name)
 
-	for i in m.ID_LOOKUP['FRU']:
-		s = m.ID_LOOKUP['FRU'][i]
-		s = s.replace('<inventory_root>',m.INVENTORY_ROOT)
-		l.append(s)
+    for i in m.ID_LOOKUP['FRU']:
+        s = m.ID_LOOKUP['FRU'][i]
+        s = s.replace('<inventory_root>', m.INVENTORY_ROOT)
+        l.append(s)
 
-	return l
+    return l
+
 
 def get_inventory_fru_type_list(module_name, fru_type):
 
-	l = []
-	m = imp.load_source('module.name', module_name)
+    l = []
+    m = imp.load_source('module.name', module_name)
 
-	for i in m.FRU_INSTANCES.keys():
-		if m.FRU_INSTANCES[i]['fru_type'] == fru_type:
-			print 'found one'
+    for i in m.FRU_INSTANCES.keys():
+        if m.FRU_INSTANCES[i]['fru_type'] == fru_type:
+            print 'found one'
 
-			s = i.replace('<inventory_root>',m.INVENTORY_ROOT)
-			l.append(s)
+            s = i.replace('<inventory_root>', m.INVENTORY_ROOT)
+            l.append(s)
 
-	return l
+    return l
+
 
 def call_keyword(keyword):
-    return BuiltIn().run_keyword(keyword)
\ No newline at end of file
+    return BuiltIn().run_keyword(keyword)
