diff --git a/TestON/drivers/component.py b/TestON/drivers/component.py
index ec94283..1e87d03 100644
--- a/TestON/drivers/component.py
+++ b/TestON/drivers/component.py
@@ -1,16 +1,16 @@
 #!/usr/bin/env python
 import logging
-'''
+"""
 Created on 24-Oct-2012
-    
-@authors: Anil Kumar (anilkumar.s@paxterrasolutions.com),
-          Raghav Kashyap(raghavkashyap@paxterrasolutions.com)
+
+author:s: Anil Kumar ( anilkumar.s@paxterrasolutions.com ),
+          Raghav Kashyap( raghavkashyap@paxterrasolutions.com )
 
 
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,99 +18,104 @@
     GNU General Public License for more details.
 
     You should have received a copy of the GNU General Public License
-    along with TestON.  If not, see <http://www.gnu.org/licenses/>.		
+    along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 
 
-          
-'''
 
+"""
 import re
 from logging import Logger
 
-class Component(object):
-    '''
+
+class Component( object ):
+
+    """
     This is the tempalte class for components
-    '''
-    def __init__(self):
+    """
+    def __init__( self ):
         self.default = ''
-        self.wrapped = sys.modules[__name__]
-        
-    def __getattr__(self, name):
-        ''' 
+        self.wrapped = sys.modules[ __name__ ]
+
+    def __getattr__( self, name ):
+        """
          This will invoke, if the attribute wasn't found the usual ways.
           Here it will look for assert_attribute and will execute when AttributeError occurs.
           It will return the result of the assert_attribute.
-        '''
+        """
         try:
-            return getattr(self.wrapped, name)
+            return getattr( self.wrapped, name )
         except AttributeError:
             try:
-                def experimentHandling(**kwargs):
+                def experimentHandling( **kwargs ):
                     if main.EXPERIMENTAL_MODE == main.TRUE:
-                        result = self.experimentRun(**kwargs)
-                        main.log.info("EXPERIMENTAL MODE. API "+str(name)+" not yet implemented. Returning dummy values")
-                        return result 
+                        result = self.experimentRun( **kwargs )
+                        main.log.info( "EXPERIMENTAL MODE. API " + str(
+                            name ) + " not yet implemented. Returning dummy values" )
+                        return result
                     else:
                         return main.FALSE
                 return experimentHandling
-            except TypeError,e:
-                main.log.error("Arguments for experimental mode does not have key 'retruns'" + e)
-        
-        
-    def connect(self):
-        
-        vars(main)[self.name+'log'] = logging.getLogger(self.name)
-                    
-        session_file = main.logdir+"/"+self.name+".session"
-        self.log_handler = logging.FileHandler(session_file)
-        self.log_handler.setLevel(logging.DEBUG)
-            
-        vars(main)[self.name+'log'].setLevel(logging.DEBUG)
-        _formatter = logging.Formatter("%(asctime)s  %(name)-10s: %(levelname)-8s: %(message)s")
-        self.log_handler.setFormatter(_formatter)
-        vars(main)[self.name+'log'].addHandler(self.log_handler)
-        # Adding header for the component log     
-        vars(main)[self.name+'log'].info(main.logHeader)
+            except TypeError as e:
+                main.log.error(
+                    "Arguments for experimental mode does not have key 'retruns'" +
+                    e )
+
+    def connect( self ):
+
+        vars( main )[ self.name + 'log' ] = logging.getLogger( self.name )
+
+        session_file = main.logdir + "/" + self.name + ".session"
+        self.log_handler = logging.FileHandler( session_file )
+        self.log_handler.setLevel( logging.DEBUG )
+
+        vars( main )[ self.name + 'log' ].setLevel( logging.DEBUG )
+        _formatter = logging.Formatter(
+            "%(asctime)s  %(name)-10s: %(levelname)-8s: %(message)s" )
+        self.log_handler.setFormatter( _formatter )
+        vars( main )[ self.name + 'log' ].addHandler( self.log_handler )
+        # Adding header for the component log
+        vars( main )[ self.name + 'log' ].info( main.logHeader )
         # Opening the session log to append command's execution output
-        self.logfile_handler = open(session_file,"a")
-        
+        self.logfile_handler = open( session_file, "a" )
+
         return "Dummy"
-    
-    def execute(self,cmd):
+
+    def execute( self, cmd ):
         return main.TRUE
-        #import commands
-        #return commands.getoutput(cmd)
-        
-    def disconnect(self):
-        return main.TRUE 
-    
-    def config(self):
+        # import commands
+        # return commands.getoutput( cmd )
+
+    def disconnect( self ):
+        return main.TRUE
+
+    def config( self ):
         self = self
         # Need to update the configuration code
-        
-    def cleanup(self):
+
+    def cleanup( self ):
         return main.TRUE
-    
-    def log(self,message):
-        '''
-        Here finding the for the component to which the 
+
+    def log( self, message ):
+        """
+        Here finding the for the component to which the
         log message based on the called child object.
-        '''
-        vars(main)[self.name+'log'].info("\n"+message+"\n")
-        
-    def close_log_handles(self) :
-        vars(main)[self.name+'log'].removeHandler(self.log_handler)
+        """
+        vars( main )[ self.name + 'log' ].info( "\n" + message + "\n" )
+
+    def close_log_handles( self ):
+        vars( main )[ self.name + 'log' ].removeHandler( self.log_handler )
         if self.logfile_handler:
             self.logfile_handler.close()
-    
-    def get_version(self):
+
+    def get_version( self ):
         return "Version unknown"
 
-    def experimentRun(self,**kwargs):
-        args = utilities.parse_args(["RETURNS"],**kwargs)
-        return  args["RETURNS"]    
+    def experimentRun( self, **kwargs ):
+        args = utilities.parse_args( [ "RETURNS" ], **kwargs )
+        return args[ "RETURNS" ]
 
 
 if __name__ != "__main__":
     import sys
-    sys.modules[__name__] = Component()
+    sys.modules[ __name__ ] = Component()
+
