diff --git a/tcutils/__init__.py b/tcutils/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tcutils/__init__.py
diff --git a/src/amassprotocol.py b/tcutils/amassprotocol.py
similarity index 100%
rename from src/amassprotocol.py
rename to tcutils/amassprotocol.py
diff --git a/src/pbocfunc.py b/tcutils/pbocfunc.py
similarity index 100%
rename from src/pbocfunc.py
rename to tcutils/pbocfunc.py
diff --git a/src/performance.py b/tcutils/performance.py
similarity index 100%
rename from src/performance.py
rename to tcutils/performance.py
diff --git a/tcutils/pyDecard.py b/tcutils/pyDecard.py
new file mode 100644
index 0000000..22e9daf
--- /dev/null
+++ b/tcutils/pyDecard.py
@@ -0,0 +1,193 @@
+# -*- coding: utf-8 -*-
+'''
+Created on 2011-9-29
+
+@author: cheng.tang
+'''
+from ctypes import *
+import codecs
+
+class CardOperatorError(Exception):
+    def __init__(self,msg):
+        Exception.__init__(self,msg)
+        
+class py_decard:
+    MODE_ALL = 1
+    MODE_IDLE = 0
+    ERROR_RET_NONE = 0
+    ERROR_RAISE_EXP = 1
+    dll_handle = None
+    dll_name = 'dcrf32.dll'
+    device_handle = None
+    error_method = ERROR_RET_NONE
+
+    @staticmethod
+    def _do_load_dll():
+        if py_decard.dll_handle <> None:
+            return
+        py_decard.dll_handle = windll.LoadLibrary(py_decard.dll_name)
+
+    @staticmethod
+    def setup(**kwdargs):
+        if kwdargs.has_key("error_method"):
+            py_decard.error_method = kwdargs["error_method"]
+
+    #################################################################### 
+    def __init__(self):
+        py_decard._do_load_dll()
+        self.card_mode = 'contactless'
+        self.ic_port = 0
+        
+    def set_card_mode(self,mode='cotactless',icport=-1):
+        self.card_mode = mode
+        if self.card_mode <> 'contactless':
+            self.ic_port = icport
+        
+    def setsamport(self,port):
+        self.sam_port = self._get_sam_port(port)
+        ats_buffer = create_string_buffer('\000' * 256)
+        ats_len = c_char('\000')
+        
+        py_decard.dll_handle.dc_setcpu(py_decard.device_handle,self.sam_port)
+        ret = py_decard.dll_handle.dc_cpureset(py_decard.device_handle,byref(ats_len),ats_buffer)
+        if ret <> 0:
+            return self.error('CPUCard ats error')
+        l = ord(ats_len.value)
+        r = ats_buffer.raw[:l]
+        #print codecs.encode(r,'hex')
+        return r
+        
+    def error(self,error):
+        if py_decard.error_method == py_decard.ERROR_RET_NONE:
+            return None
+        raise CardOperatorError(error)
+    
+    
+    def open_port(self,port,baud):
+        if py_decard.dll_handle == None:
+            raise RuntimeError( py_decard.dll_name + ' not load ')
+        if py_decard.device_handle <> None:
+            return True
+        
+        dev_handle = py_decard.dll_handle.dc_init(port,baud)
+        if dev_handle <= 0:
+            return False
+        py_decard.device_handle = dev_handle
+        return True
+    
+    def close_port(self):
+        if py_decard.device_handle == None:
+            return
+        py_decard.dll_handle.dc_exit(py_decard.device_handle)
+        py_decard.device_handle = None
+        
+    def request_card(self):
+        if self.card_mode == 'contactless':
+            py_decard.dll_handle.dc_reset(py_decard.device_handle,1)
+            cardphyno = create_string_buffer('\000' * 64)
+            ret = py_decard.dll_handle.dc_card_hex(py_decard.device_handle,
+                                                   py_decard.MODE_ALL,
+                                                   cardphyno)
+            if ret == 0:
+                return cardphyno.value
+            return self.error('Request Card Error')
+        else:
+            return ''
+    
+    def cpucard_ats(self):
+        ats_buffer = create_string_buffer('\000' * 256)
+        ats_len = c_char('\000')
+        if self.card_mode == 'contactless':
+            py_decard.dll_handle.dc_pro_reset.restype = c_short
+            ret = py_decard.dll_handle.dc_pro_reset(py_decard.device_handle,byref(ats_len),ats_buffer)
+            if ret <> 0:
+                return self.error('CPUCard ats error')
+            l = ord(ats_len.value)
+            r = ats_buffer.raw[:l]
+            #print codecs.encode(r,'hex')
+            return r
+        else:
+            py_decard.dll_handle.dc_setcpu(py_decard.device_handle,self._get_sam_port(self.ic_port))
+            ret = py_decard.dll_handle.dc_cpureset(py_decard.device_handle,byref(ats_len),ats_buffer)
+            if ret <> 0:
+                return self.error('CPUCard ats error')
+            l = ord(ats_len.value)
+            r = ats_buffer.raw[:l]
+            #print codecs.encode(r,'hex')
+            return r 
+    
+    def _get_sam_port(self,port):
+        if port == 1:
+            return 0x0c
+        elif port == 2:
+            return 0x0d
+        elif port == 3:
+            return 0x0e
+        elif port == 4:
+            return 0x0f
+        else:
+            self.error('samport error')
+            
+    def _do_apdu(self,command):
+        response = create_string_buffer('\000' * 256)
+        resplen = c_char('\000')
+        if self.card_mode == 'contactless':
+            py_decard.dll_handle.dc_pro_commandlink.restype = c_short
+            ret = py_decard.dll_handle.dc_pro_commandlink(py_decard.device_handle,len(command),
+                                                  command,byref(resplen),response,7,56)
+        else:
+            ret = py_decard.dll_handle.dc_cpuapdu(py_decard.device_handle,len(command),
+                                                  command,byref(resplen),response)
+        
+        if ret <> 0:
+            command_header = codecs.encode(command,'hex')
+            return self.error('CPUCard apdu command : %s ,ret=%d' % (command_header,ret))
+        return  response.raw[:ord(resplen.value)]
+
+    def cpucard_apdu(self,command):
+        current_resp = self._do_apdu(command)
+        if ord(current_resp[-2]) == 0x61 and ord(current_resp[-1]) > 0x00:
+            cmd = '\x00\xC0\x00\x00' + current_resp[-1]
+            #print "get response : %s" % codecs.encode(cmd,'hex')
+            return self._do_apdu(cmd)
+        else:
+            return current_resp
+    
+    def cpucard_apdu_hex(self,command):
+        cmd_result = command.replace(' ','')
+        resp = self.cpucard_apdu(codecs.decode(cmd_result,'hex'))
+        if resp == None:
+            return None
+        return codecs.encode(resp,'hex').upper()
+        
+    def _do_sam_apdu(self,command):
+        response = create_string_buffer('\000' * 256)
+        resplen = c_char('\000')
+        ret = py_decard.dll_handle.dc_cpuapdu(py_decard.device_handle,len(command),
+                                                  command,byref(resplen),response)
+        
+        if ret <> 0:
+            command_header = codecs.encode(command,'hex')
+            return self.error('CPUCard apdu command : %s ,ret=%d' % (command_header,ret))
+        return  response.raw[:ord(resplen.value)]
+        
+    def sam_apdu(self,command):
+        current_resp = self._do_sam_apdu(command)
+        if ord(current_resp[-2]) == 0x61 and ord(current_resp[-1]) > 0x00:
+            cmd = '\x00\xC0\x00\x00' + current_resp[-1]
+            #print "get response : %s" % codecs.encode(cmd,'hex')
+            return self._do_sam_apdu(cmd)
+        else:
+            return current_resp
+            
+    def sam_apdu_hex(self,command):
+        cmd_result = command.replace(' ','')
+        resp = self.sam_apdu(codecs.decode(cmd_result,'hex'))
+        if resp == None:
+            return None
+        return codecs.encode(resp,'hex').upper()
+        
+    
+    def beep(self):
+        py_decard.dll_handle.dc_beep(py_decard.device_handle,10)
+    
diff --git a/src/pybccclt.py b/tcutils/pybccclt.py
similarity index 100%
rename from src/pybccclt.py
rename to tcutils/pybccclt.py
