diff --git a/ivette/src/dome/renderer/layout/forms.tsx b/ivette/src/dome/renderer/layout/forms.tsx
index bf30fccd8aa229908c3b7def7242991bebf5a2f7..ffb497983ea5e19551ed5efce66742d73100307b 100644
--- a/ivette/src/dome/renderer/layout/forms.tsx
+++ b/ivette/src/dome/renderer/layout/forms.tsx
@@ -155,6 +155,7 @@ export type BufferCallback = () => void;
 export class BufferController {
   private readonly evt = new Events();
   private errors = 0;
+  private notified = false;
 
   /** Notify all reset listener events. */
   reset(): void { this.evt.emit('reset'); }
@@ -168,6 +169,9 @@ export class BufferController {
   /** There are active listeners for Commit event. */
   hasCommit(): boolean { return this.evt.listenerCount('commit') > 0; }
 
+  /** Reset notified to false. */
+  resetNotified(): void { this.notified = false; }
+
   /** Get the number of errors */
   getErrors(): number { return this.errors; }
 
@@ -178,7 +182,12 @@ export class BufferController {
   }
 
   /** @internal */
-  protected notify(): void { this.evt.emit('update'); }
+  protected notify(): void {
+    if(!this.notified) {
+      this.evt.emit('update');
+      this.notified = true;
+    }
+  }
 
   /** @internal */
   onChange(fn: BufferCallback): void { this.evt.addListener('update', fn); }
@@ -332,11 +341,13 @@ export function useBuffer<A>(
       setModified(!isReset);
       setBuffer(newValue);
       setBerror(newError);
-      if (isReset && !compare(equal, newValue, value)) {
+      if (compare(equal, rollback, newValue)) {
+        setModified(false);
+      } else if (isReset && !compare(equal, newValue, value)) {
         setCommited(false);
         onChanged(newValue, newError, isReset);
       }
-    }, [equal, value, onChanged]);
+    }, [equal, value, rollback, onChanged]);
 
   return {
     value: modified || !commited ? buffer : value,