diff -urN versao_6D/stoqdrivers/stoqdrivers/exceptions.py trunk/stoqdrivers/exceptions.py
--- versao_6D/stoqdrivers/stoqdrivers/exceptions.py	2017-01-23 17:08:44.000000000 -0200
+++ trunk/stoqdrivers/exceptions.py	2016-10-13 16:22:19.428310956 -0300
@@ -86,6 +86,9 @@
 class BlockZ(DriverError):
     "Bloqueio por RZ"
 
+class SummerTime(DriverError):
+    "Trocar horario de verao apenas apos RZ"
+
 class PendingReadX(DriverError):
     "A Read X is pending"
 
diff -urN versao_6D/stoqdrivers/stoqdrivers/__init__.py trunk/stoqdrivers/__init__.py
--- versao_6D/stoqdrivers/stoqdrivers/__init__.py	2017-01-23 17:08:44.000000000 -0200
+++ trunk/stoqdrivers/__init__.py	2016-10-13 16:22:19.012318467 -0300
@@ -25,7 +25,7 @@
              Johan Dahlin <henrique@async.com.br>
 """
 
-__version__ = (0,9,11,'6d')
+__version__ = (0,9,11,'~trunk')
 
 # from kiwi.environ import Library
 #
diff -urN versao_6D/stoqdrivers/stoqdrivers/printers/bematech/MP25.py trunk/stoqdrivers/printers/bematech/MP25.py
--- versao_6D/stoqdrivers/stoqdrivers/printers/bematech/MP25.py	2017-01-23 17:08:44.000000000 -0200
+++ trunk/stoqdrivers/printers/bematech/MP25.py	2017-01-23 16:54:44.669415181 -0200
@@ -1025,8 +1025,15 @@
         MP25Status(res).check_error()
         return True
 
-    def get_corta_papel(self): # as MPs 4000 e 2100 nao possuem comando para cortar papel
-        return False
+    def get_corta_papel(self): # a MP 2100 nao possuem comando para cortar papel
+        try: # 62, 75 => corta papel, 7 = linhas a avancar, 1=corte parcial
+            res = self._send_command(62, 75, 7, 1, raw=True)
+            MP25Status(res).check_error()
+        except Exception as e:
+            log.error("Erro ao cortar papel: %s" % str(e))
+            return False
+
+        return True
 
     def payment_receipt_print(self, text):
         imprime_linha = ''
diff -urN versao_6D/stoqdrivers/stoqdrivers/printers/daruma/FS2100.py trunk/stoqdrivers/printers/daruma/FS2100.py
--- versao_6D/stoqdrivers/stoqdrivers/printers/daruma/FS2100.py	2017-01-23 17:08:44.000000000 -0200
+++ trunk/stoqdrivers/printers/daruma/FS2100.py	2016-10-13 16:22:19.344312473 -0300
@@ -483,7 +483,7 @@
                 return self.parent.status_check(status, 1, 2)
             @property
             def out_paper(self):
-                return self.parent.status_check(status, 1, 0)
+                return self.parent.status_check(status, 2, 0)
             @property
             def block_z(self):
                 return self.parent.status_check(status, 2, 1)
diff -urN versao_6D/stoqdrivers/stoqdrivers/printers/daruma/FS345.py trunk/stoqdrivers/printers/daruma/FS345.py
--- versao_6D/stoqdrivers/stoqdrivers/printers/daruma/FS345.py	2017-01-23 17:08:44.000000000 -0200
+++ trunk/stoqdrivers/printers/daruma/FS345.py	2017-01-23 16:54:44.617415511 -0200
@@ -124,6 +124,68 @@
 
 RETRIES_BEFORE_TIMEOUT = 5
 
+DICT_ERROS = {
+         1: 'Comando habilitado apenas em MIT',
+         2: 'Erro na gravação da MF',
+         3: 'Capacidade da MF esgotada',
+         4: 'Erro no relógio',
+         5: 'Erro Drástico',
+         6: 'Erro de leitura na MF',
+         7: 'Comando habilitado apenas em modo fiscal',
+        10: 'Documento aberto',
+        11: 'Documento não aberto',
+        12: 'Não há documento',
+        13: 'Caracter numérico inválido',
+        14: 'Capacidade da MT esgotada',
+        15: 'Item não encontrado na MT',
+        16: 'Erro de Sintaxe',
+        17: 'Overflow na acumulação',
+        18: 'Selecionado totalizador sem alíquota programada',
+        19: 'MF vazia',
+        20: 'Nenhum campo requer atualização',
+        21: 'Pouco papel',
+        22: 'RZ já emitida',
+        23: 'RZ do movimento anterior ainda pendente',
+        24: 'Desconto ou acréscimo de valor inválido',
+        25: 'Caracter inválido',
+        27: 'Impressora de cheques não disponível',
+        28: 'Valor zero não permitido',
+        29: 'Último documento não foi CF',
+        30: 'Totalizador NF inválido',
+        31: 'Autenticação não permitida neste momento',
+        32: 'Cupom Adicional inibido por comando',
+        35: 'Relógio inoperante',
+        36: 'Versão incorreta do SB',
+        38: 'Meio de pagamento inválido',
+        39: 'Erro na seqüência de fechamento de documento',
+        40: 'Dia fiscal aberto',
+        41: 'Data inválida',
+        42: 'Dia fiscal não aberto',
+        43: 'Não pode emitir CCD',
+        44: 'Operação inválida',
+        45: 'Campo em branco não permitido',
+        48: 'Estorno não é possível',
+        49: 'Pagamento não encontrado na MT',
+        50: 'Fim do papel',
+        51: 'Nenhum usuário cadastrado',
+        52: 'Memória Fiscal não encontrada',
+        61: 'Queda de energia',
+        74: 'Operação com ICMS não permitida',
+        75: 'Operação com ISS não permitida',
+        76: 'Desconto em ISS inibido',
+        77: 'IOF inibido',
+        78: 'Deve ajustar o relógio',
+        79: 'Comando de subtotal não mais suportado',
+        81: 'Banco não cadastrado',
+        82: 'Texto inválido',
+        83: 'Extenso do cheque não cabe',
+        84: 'Impressão do verso não permitida no momento',
+        85: 'Erro de leitura',
+        86: 'Erro na carga',
+        87: 'Parâmetro inválido',
+        90: 'Erro na comunicação',
+}
+
 def isbitset(value, bit):
     # BCD crap
     return (int(value, 16) >> bit) & 1 == 1
@@ -415,9 +477,13 @@
         status = self._check_status()
         if self._is_open(status):
             raise CouponOpenError(_("Coupon already open"))
-        self.send_command(CMD_OPEN_COUPON)
-        status = self._check_status()
-        return self._is_open(status)
+        res = self.send_command(CMD_OPEN_COUPON)
+        if res[:1] == 'A':
+            return True
+
+        log.error("Erro 'coupon_open()': %s" % DICT_ERROS.get(int(res[1:])))
+        return False
+
     def coupon_add_item(self, code, description, price, taxcode,
                         quantity=Decimal("1.0"), unit=UnitType.EMPTY,
                         discount=Decimal("0.0"),
diff -urN versao_6D/stoqdrivers/stoqdrivers/printers/fiscal.py trunk/stoqdrivers/printers/fiscal.py
--- versao_6D/stoqdrivers/stoqdrivers/printers/fiscal.py	2017-01-23 17:07:26.000000000 -0200
+++ trunk/stoqdrivers/printers/fiscal.py	2017-01-23 16:54:44.689415054 -0200
@@ -361,7 +361,7 @@
         log.info('> CMD: till_read_memory(start=%r, end=%r)' % (start, end))
 
         res = self._driver.till_read_memory_to_serial(start, end, full)
-        log.info('< RET: %s' % str(res))
+        log.info('< RET: %s' % res)
         return res
 
     @capcheck(int, int, bool)
@@ -378,7 +378,7 @@
         assert end >= start > 0, ("start must be less then end and both must be positive")
         log.info('> CMD: till_read_memory_by_reductions(start=%r, end=%r)' % (start, end))
         res = self._driver.till_read_memory_by_reductions_to_serial(start, end, full)
-        log.info('< RET: %s' % str(res))
+        log.info('< RET: %s' % res)
         return res
 
     def gerencial_report_open(self, id=0):
diff -urN versao_6D/stoqdrivers/stoqdrivers/printers/fiscnet/FiscNetECF.py trunk/stoqdrivers/printers/fiscnet/FiscNetECF.py
--- versao_6D/stoqdrivers/stoqdrivers/printers/fiscnet/FiscNetECF.py	2017-01-23 17:08:44.000000000 -0200
+++ trunk/stoqdrivers/printers/fiscnet/FiscNetECF.py	2017-01-23 16:54:44.641415359 -0200
@@ -43,7 +43,7 @@
 from stoqdrivers.enum import PaymentMethodType, TaxType, UnitType
 from stoqdrivers.exceptions import (DriverError, PendingReduceZ,
     CommandParametersError, CommandError, ReadXError, OutofPaperError,
-    CouponTotalizeError, PaymentAdditionError, CancelItemError,
+    CouponTotalizeError, PaymentAdditionError, CancelItemError, SummerTime,
     CouponOpenError, InvalidState, PendingReadX, CloseCouponError,
     CouponNotOpenError, PrinterOfflineError, BlockZ)
 from stoqdrivers.interfaces import ICouponPrinter, IChequePrinter
@@ -145,6 +145,8 @@
         8013: CouponTotalizeError,
         8014: PaymentAdditionError,
         8017: CloseCouponError,
+        8023: SummerTime,
+        8024: SummerTime,
         8044: CancelItemError,
         8045: CancelItemError,
         8068: PaymentAdditionError,
@@ -540,22 +542,20 @@
             else: # Recepcao Serial
                 res = self._send_command('EmiteLeituraFitaDetalhe', DataFinal=DataFinal, DataInicial=DataInicial,
                                          Destino=Destino, TipoDocumento=TipoDocumento)
-
-
-        res = texto = self._le_impressao().get('TextoImpressao')
-        # enquanto houver texto a ser lido, chama a funcao le_impressao()
-        while texto:
-            texto = self._le_impressao().get('TextoImpressao')
-            res += texto
-
-        return res
+        return self._le_impressao()
 
     def _le_impressao(self):
         '''
-        Le os ultimos 4000 caracters nao lidos impressos da impressora
+        (TextoImpressao) Le os ultimos 4000 caracters nao lidos impressos da impressora
         :return: dicionario de chave 'TextoImpressao' e o valor a string da leitura
         '''
-        return self._send_command('LeImpressao')
+        res = texto = self._send_command('LeImpressao').get('TextoImpressao')
+        # enquanto houver texto a ser lido, chama a funcao le_impressao()
+        while texto:
+            texto = self._send_command('LeImpressao').get('TextoImpressao')
+            res += texto
+
+        return res.decode('cp850')
 
     def _get_coupon_remainder_value(self):
         value = self._read_register('TotalDocValorPago', Decimal)
@@ -992,23 +992,42 @@
         self._send_command('EncerraDocumento', TextoPromocional=text)
         self.get_corta_papel()
 
-    def till_read_memory(self, start=None, end=None, full=False):
+    def till_read_memory(self, start=None, end=None, full=False, destino='I'):
         try:
             self._send_command('EmiteLeituraMF',
+                               Destino=destino,
                                LeituraSimplificada=not full,
                                DataInicial=start,
                                DataFinal=end)
-            self.get_corta_papel()
+            if destino == 'I': # impressora
+                self.get_corta_papel()
+            else: # serial
+                return self._le_impressao()
+
         except DriverError, e:
             if e.code == 8089:
                 return
 
-    def till_read_memory_by_reductions(self, start=None, end=None, full=False):
+
+    def till_read_memory_by_reductions(self, start=None, end=None, full=False, destino='I'):
+        '''
+        :param destino: I = impressora, S = serial
+        '''
         self._send_command('EmiteLeituraMF',
+                           Destino=destino,
                            LeituraSimplificada=not full,
                            ReducaoInicial=start,
                            ReducaoFinal=end)
-        self.get_corta_papel()
+        if destino == 'I':
+            self.get_corta_papel()
+        else:
+            return self._le_impressao()
+
+    def till_read_memory_to_serial(self, start=None, end=None, full=False):
+        return self.till_read_memory(start, end, full, 'S')
+
+    def till_read_memory_by_reductions_to_serial(self, start=None, end=None, full=False):
+        return self.till_read_memory_by_reductions(start, end, full, 'S')
 
     def get_capabilities(self):
         return dict(item_code=Capability(max_len=48),
@@ -1071,7 +1090,7 @@
     def get_payment_constants(self):
         constants = [('Dinheiro', '-2')]
 
-        for reg in range(16):
+        for reg in range(15):
             try:
                 retdict = self._send_command(
                     'LeMeioPagamento', CodMeioPagamentoProgram=reg)
diff -urN versao_6D/stoqdrivers/stoqdrivers/printers/sweda/IFS9000I.py trunk/stoqdrivers/printers/sweda/IFS9000I.py
--- versao_6D/stoqdrivers/stoqdrivers/printers/sweda/IFS9000I.py	2017-01-23 17:08:44.000000000 -0200
+++ trunk/stoqdrivers/printers/sweda/IFS9000I.py	2017-01-23 16:54:44.657415257 -0200
@@ -691,8 +691,8 @@
                 self.send_command(self.CMD_COUPON_TOTALIZE)
                 break
             except Exception as e:
-                time.sleep(1)
                 log.error("Erro ao totalizar o cupom: %s" % str(e))
+                time.sleep(1)
 
         return self.get_totalized_value()
 
