diff --git a/cg/cg2100a.uml b/cg/cg2100a.uml
index 31428f853..d600b5201 100755
--- a/cg/cg2100a.uml
+++ b/cg/cg2100a.uml
@@ -1,111 +1,111 @@
-#include "cg2100.h"
-
-TOOLBAR "" 0 20 0 2
-#include <toolbar.h>
-ENDPAGE
-
-PAGE "OPERAZIONE DI PRIMA NOTA" -1 -1 77 8
-
-GROUPBOX DLG_NULL 78 3
-BEGIN
-	PROMPT 1 0 ""
-END
-
-NUMBER F_CODDITTA 5
-BEGIN
-	PROMPT 3 1 "Ditta  "
-	FLAGS "FRD"
-	USE LF_NDITTE KEY 1
-	CHECKTYPE REQUIRED
-	INPUT CODDITTA F_CODDITTA
-	DISPLAY "Codice" CODDITTA
-	DISPLAY "Ragione sociale @50" RAGSOC
-	OUTPUT F_RAGSOC RAGSOC
-END
-
-STRING F_RAGSOC 50
-BEGIN
-	PROMPT 17 1 "Ragione "
-	FLAGS "D"
-END
-
-NUMBER F_NUMREG 6
-BEGIN
-	PROMPT 1 4 "Operazione n.  "
-	FLAGS "R"
-	FIELD LF_MOV->NUMREG
-	USE LF_MOV
-	INPUT NUMREG F_NUMREG
-	DISPLAY "Numero@6" NUMREG
-	DISPLAY "Data@10" DATAREG
-	DISPLAY "Causale" CODCAUS
-	DISPLAY "Documento" NUMDOC
-	DISPLAY "Descrizione@50" DESCR
-	OUTPUT F_NUMREG NUMREG
-	KEY 1
-END
-
-DATE F_DATAREG
-BEGIN
-	PROMPT 1 6 "Data dell'operazione  "
-	CHECKTYPE REQUIRED
-	FLAGS "A"
-	WARNING "E' obbligatorio specificare la data dell'operazione"
-	HELP "Data in cui viene registrata l'operazione"
-	MESSAGE COPY,F_ANNOIVA,7,10
-END
-
-NUMBER F_ANNOIVA 4
-BEGIN
-	PROMPT 51 6 "Anno IVA          "
-	FLAGS "D"
-END
-
-DATE F_DATACOMP
-BEGIN
-	PROMPT 1 7 "Data di competenza    "
-	CHECKTYPE REQUIRED
-	WARNING "E' obbligatorio specificare la data di competenza"
-	FLAGS "A"
-END
-
-NUMBER F_ANNOES 4
-BEGIN
-	PROMPT 51 7 "Anno di esercizio "
-	FLAGS "D"
-END
-
-STRING F_CODCAUS 3
-BEGIN
-	PROMPT 1 9 "Causale        "
-	FLAGS "U"
-	FIELD LF_MOV->CODCAUS
-	USE LF_CAUSALI KEY 1
-	INPUT CODCAUS F_CODCAUS
-	DISPLAY "Codice" CODCAUS
-	DISPLAY "Descrizione@50" DESCR
-	DISPLAY "Tipo" TIPODOC
-	DISPLAY "Registro" REG
-	OUTPUT F_CODCAUS CODCAUS
-	OUTPUT F_DESCRCAUS DESCR
-	ADD RUN cg0 -4
-	CHECKTYPE REQUIRED
-END
-
-STRING F_DESCRCAUS 50
-BEGIN
-	PROMPT 23 9 ""
-	USE LF_CAUSALI KEY 2
-	CHECKTYPE NORMAL
-	INPUT DESCR F_DESCRCAUS
-	DISPLAY "Descrizione@50" DESCR
-	DISPLAY "Codice" CODCAUS
-	DISPLAY "Tipo" TIPODOC
-	DISPLAY "Registro" REG
-	COPY OUTPUT F_CODCAUS
-	ADD RUN cg0 -4
-END
-
-ENDPAGE
-
-ENDMASK
+#include "cg2100.h"
+
+TOOLBAR "" 0 20 0 2
+#include <toolbar.h>
+ENDPAGE
+
+PAGE "OPERAZIONE DI PRIMA NOTA" -1 -1 77 8
+
+GROUPBOX DLG_NULL 78 3
+BEGIN
+	PROMPT 1 0 ""
+END
+
+NUMBER F_CODDITTA 5
+BEGIN
+	PROMPT 3 1 "Ditta  "
+	FLAGS "FRD"
+	USE LF_NDITTE KEY 1
+	CHECKTYPE REQUIRED
+	INPUT CODDITTA F_CODDITTA
+	DISPLAY "Codice" CODDITTA
+	DISPLAY "Ragione sociale @50" RAGSOC
+	OUTPUT F_RAGSOC RAGSOC
+END
+
+STRING F_RAGSOC 50
+BEGIN
+	PROMPT 17 1 "Ragione "
+	FLAGS "D"
+END
+
+NUMBER F_NUMREG 6
+BEGIN
+	PROMPT 1 4 "Operazione n.  "
+	FLAGS "R"
+	FIELD LF_MOV->NUMREG
+	USE LF_MOV
+	INPUT NUMREG F_NUMREG
+	DISPLAY "Numero@6" NUMREG
+	DISPLAY "Data@10" DATAREG
+	DISPLAY "Causale" CODCAUS
+	DISPLAY "Documento" NUMDOC
+	DISPLAY "Descrizione@50" DESCR
+	OUTPUT F_NUMREG NUMREG
+	KEY 1
+END
+
+DATE F_DATAREG
+BEGIN
+	PROMPT 1 6 "Data dell'operazione  "
+	CHECKTYPE REQUIRED
+	FLAGS "A"
+	WARNING "E' obbligatorio specificare la data dell'operazione"
+	HELP "Data in cui viene registrata l'operazione"
+	MESSAGE COPY,F_ANNOIVA,7,10
+END
+
+NUMBER F_ANNOIVA 4
+BEGIN
+	PROMPT 51 6 "Anno IVA          "
+	FLAGS "D"
+END
+
+DATE F_DATACOMP
+BEGIN
+	PROMPT 1 7 "Data di competenza    "
+	CHECKTYPE REQUIRED
+	WARNING "E' obbligatorio specificare la data di competenza"
+	FLAGS "A"
+END
+
+NUMBER F_ANNOES 4
+BEGIN
+	PROMPT 51 7 "Anno di esercizio "
+	FLAGS "DRZ"
+END
+
+STRING F_CODCAUS 3
+BEGIN
+	PROMPT 1 9 "Causale        "
+	FLAGS "U"
+	FIELD LF_MOV->CODCAUS
+	USE LF_CAUSALI KEY 1
+	INPUT CODCAUS F_CODCAUS
+	DISPLAY "Codice" CODCAUS
+	DISPLAY "Descrizione@50" DESCR
+	DISPLAY "Tipo" TIPODOC
+	DISPLAY "Registro" REG
+	OUTPUT F_CODCAUS CODCAUS
+	OUTPUT F_DESCRCAUS DESCR
+	ADD RUN cg0 -4
+	CHECKTYPE REQUIRED
+END
+
+STRING F_DESCRCAUS 50
+BEGIN
+	PROMPT 23 9 ""
+	USE LF_CAUSALI KEY 2
+	CHECKTYPE NORMAL
+	INPUT DESCR F_DESCRCAUS
+	DISPLAY "Descrizione@50" DESCR
+	DISPLAY "Codice" CODCAUS
+	DISPLAY "Tipo" TIPODOC
+	DISPLAY "Registro" REG
+	COPY OUTPUT F_CODCAUS
+	ADD RUN cg0 -4
+END
+
+ENDPAGE
+
+ENDMASK
diff --git a/cg/cg2100b.uml b/cg/cg2100b.uml
index 0fa9f8819..ca6ae0d6e 100755
--- a/cg/cg2100b.uml
+++ b/cg/cg2100b.uml
@@ -55,7 +55,7 @@ NUMBER F_ANNOES 4
 BEGIN
   PROMPT 57 4 "Esercizio    "
   FIELD ANNOES
-  FLAGS "D"
+  FLAGS "DRZ"
 END
 
 DATE F_DATADOC
diff --git a/cg/cg2100c.uml b/cg/cg2100c.uml
index 860cc59e4..115dc2e7a 100755
--- a/cg/cg2100c.uml
+++ b/cg/cg2100c.uml
@@ -95,7 +95,7 @@ NUMBER F_ANNOES 4
 BEGIN
   PROMPT 32 4 "Anno esercizio "
   FIELD LF_MOV->ANNOES
-  FLAGS "DG"
+  FLAGS "DGRZ"
   MESSAGE COPY,H_ANNOES
 END
 
@@ -202,7 +202,7 @@ BEGIN
   PROMPT 51 9 "Riepilogo fino al n. "
   FIELD LF_MOV->UPROTIVA
   NUM_EXPR (#F_RIEPILOGO==0)||(#F_RIEPILOGO>=#F_PROTIVA)
-  WARNING "Il riepilogo non puo' essere inferiore al protocollo IVA"
+  WARNING "Inserire un riepilogo non inferiore al protocollo IVA"
 END
 
 STRING F_CLIFO 1
@@ -504,7 +504,7 @@ END
 NUMBER H_ANNOES 4
 BEGIN
   PROMPT 61 1 "Esercizio "
-  FLAGS "D"
+  FLAGS "DRZ"
 END
 
 STRING H_CODCAUS 3
diff --git a/cg/cg2101.cpp b/cg/cg2101.cpp
index 4bfe2da2f..a53537420 100755
--- a/cg/cg2101.cpp
+++ b/cg/cg2101.cpp
@@ -20,7 +20,8 @@ int date2esc(const TDate& d, int* prevesc)
   {
     const TDate ia(esc.get("D0"));   // Data inizio esercizio
     const TDate fa(esc.get("D1"));   // Data fine esercizio
-    const anno = esc.get_int("CODTAB");  
+    TString16 sanno(esc.get_int("CODTAB")); sanno.cut(4);
+    const int anno = atoi(sanno);
     if (d >= ia && d <= fa)
       return anno;
     if (prevesc) *prevesc = anno; 
diff --git a/cg/cg2102.cpp b/cg/cg2102.cpp
index 087329664..d2d238f90 100755
--- a/cg/cg2102.cpp
+++ b/cg/cg2102.cpp
@@ -427,18 +427,22 @@ real TPrimanota_application::calcola_saldo() const
 // Certified 90%
 bool TPrimanota_application::cg_handler(TMask_field& f, KEY k)
 {          
-  if (k == K_ENTER)
+  if ((k == K_TAB && !f.mask().is_running()) || k == K_ENTER)
   {
     TSheet_field& cg = app().cgs();
-    real saldo = app().calcola_saldo();
-    if (saldo != ZERO)
+    const real saldo = app().calcola_saldo();
+    
+    if (k == K_ENTER)
     {
-      const char* ss = saldo.string("."); 
-      return f.error_box("Il movimento e' sbilanciato di %s lire.", ss);
-    } 
-    else
-      if (app().get_cgs_imp(0).valore() == ZERO)
-        return f.error_box("Il movimento non ha una prima riga contabile valida!");
+      if (saldo != ZERO)
+      {
+        const char* ss = saldo.string("."); 
+        return f.error_box("Il movimento e' sbilanciato di %s lire.", ss);
+      } 
+      else
+        if (app().get_cgs_imp(0).valore() == ZERO)
+          return f.error_box("Il movimento non ha una prima riga contabile valida!");
+    }      
   }
   return TRUE;
 }
@@ -712,20 +716,22 @@ bool TPrimanota_application::iva_notify(int r, KEY k)
 // Handler dello sheet di contabilita'
 // Certified 90%
 bool TPrimanota_application::iva_handler(TMask_field& f, KEY k)
-{
-  if (k != K_ENTER) return TRUE;
-  
-  const real imp = app().calcola_imp();
-  const real tot = app().totale_documento();
-  
-  if (imp != tot)
+{  
+  if ((k == K_TAB && !f.mask().is_running()) || k == K_ENTER)
   {
-    TString16 t(tot.string("."));
-    TString16 i(imp.string("."));
-    return error_box("La somma del totale documento e delle ritenute (%s) e' diverso dalla " 
-                     "somma degli imponibili e delle imposte (%s)", (const char*)t, (const char*)i);
-  }  
-  
+    const real imp = app().calcola_imp();
+    const real tot = app().totale_documento();
+    if (k == K_ENTER)
+    {
+      if (imp != tot)
+      {
+        TString16 t(tot.string("."));
+        TString16 i(imp.string("."));
+        return error_box("La somma del totale documento e delle ritenute (%s) e' diverso dalla " 
+                         "somma degli imponibili e delle imposte (%s)", (const char*)t, (const char*)i);
+      }  
+    }  
+  }
   return TRUE;
 }
 
@@ -1197,6 +1203,7 @@ bool TPrimanota_application::solaiva_handler(TMask_field& f, KEY key)
         pi.setstatus(i+1);
       }
       app().fill_sheet(m);
+      app().cgs().force_update();
     }
   }  
   return TRUE;  
diff --git a/cg/cg2103.cpp b/cg/cg2103.cpp
index 98219cd0a..5831cd03a 100755
--- a/cg/cg2103.cpp
+++ b/cg/cg2103.cpp
@@ -5,7 +5,6 @@
 
 #include <causali.h>
 
-
 const char* iva2name(TipoIVA iva)
 {
   const char* i;
@@ -48,8 +47,7 @@ bool TRegistro::read(const char* cod, int year)
   TTable reg("REG");
   if (cod && *cod > ' ')
   {
-    TString16 chiave;
-    chiave << year << cod;
+    TString16 chiave; chiave.format("%04d%s", year, cod);
     reg.put("CODTAB", chiave);
     err = reg.read(); 
   }
@@ -64,7 +62,15 @@ bool TRegistro::read(const char* cod, int year)
 
 
 int TRegistro::year() const 
-{ return ok() ? atoi(_rec.get("CODTAB")) : 0; }
+{                
+  int anno = 0;
+  if (ok())
+  { 
+    TString16 sanno(_rec.get("CODTAB")); sanno.cut(4);
+    anno = atoi(sanno);
+  } 
+  return anno;
+}   
 
 
 
@@ -120,12 +126,9 @@ bool TRegistro::read_att()
 
 bool TRegistro::agenzia_viaggi()
 {                             
-  if (iva() != iva_vendite)
-    return FALSE;
-
   bool av = FALSE;
-  if (read_att()) av = _att.get_bool("REG74TER");
-  
+  if (iva() == iva_vendite && read_att()) 
+    av = _att.get_bool("REG74TER");
   return av;
 }
 
@@ -176,7 +179,7 @@ bool TLibro_giornale::read(int y)
   TTable reg("REG");
   bool found = FALSE;                 
   
-  TString16 anno; anno.format("%4d", y);
+  TString16 anno; anno.format("%04d", y);
   
   reg.setkey(1);                                  
   reg.put("CODTAB", anno);                    // Cerca il primo registro dell'anno y
@@ -197,22 +200,24 @@ bool TLibro_giornale::read(int y)
   return found;
 }
 
-TDate TLibro_giornale::global_last_print() const
-{
-  TTable reg("REG");
-  reg.setkey(1);                                  
+/*
+   TDate TLibro_giornale::global_last_print() const
+   {
+   TTable reg("REG");
+   reg.setkey(1);                                  
 
-  TDate last(botime);
-  for (int err = reg.first(); err == NOERR; err = reg.next())
-  {
-    if (reg.get_int("I0") == libro_giornale)
-    {       
-      const TDate l(reg.get("D3"));
-      if (l > last) last = l;
-    }  
-  }
-  return last;
-}
+   TDate last(botime);
+   for (int err = reg.first(); err == NOERR; err = reg.next())
+   {
+   if (reg.get_int("I0") == libro_giornale)
+   {       
+   const TDate l(reg.get("D3"));
+   if (l > last) last = l;
+   }  
+   }
+   return last;
+   } 
+   */
 
 TLibro_giornale::TLibro_giornale(int y)
 {