diff --git a/src/lang/Trail.java b/src/lang/Trail.java
index a782781..83937a9 100644
--- a/src/lang/Trail.java
+++ b/src/lang/Trail.java
@@ -1,4 +1,5 @@
 package com.googlecode.prolog_cafe.lang;
+
 /**
  * Trail stack.<br>
  * The class <code>Trail</code> represents a trail stack.<br>
@@ -10,76 +11,82 @@
  * @version 1.0
  */
 public final class Trail {
-    /** An array of <code>Undoable</code> entries. */
-    private Undoable[] buffer;
+  /** An array of <code>Undoable</code> entries. */
+  private Undoable[] buffer;
 
-    /** the top index of this <code>Trail</code>. */
-    private int top;
+  /** the top index of this <code>Trail</code>. */
+  private int top;
 
-    /** Current timestamp of the top of {@link ChoicePointStack}. */
-    long timeStamp;
+  /** Current timestamp of the top of {@link ChoicePointStack}. */
+  long timeStamp;
 
-    /** Constructs a new trail stack. */
-    public Trail() {
-	this(20000);
+  /** Constructs a new trail stack. */
+  public Trail() {
+    this(20000);
+  }
+
+  /** Constructs a new trail stack with the given size. */
+  public Trail(int n) {
+    buffer = new Undoable[n];
+    top = -1;
+  }
+
+  /** Discards all entries. */
+  public void init() {
+    deleteAll();
+  }
+
+  /** Pushes an entry to this <code>Trail</code>. */
+  public void push(Undoable t) {
+    try {
+      buffer[++top] = t;
+    } catch (ArrayIndexOutOfBoundsException e) {
+      int len = buffer.length;
+      Undoable[] new_buffer = new Undoable[len+20000];
+      System.arraycopy(buffer, 0, new_buffer, 0, len);
+      buffer = new_buffer;
+      buffer[top] = t;
     }
+  }
 
-    /** Constructs a new trail stack with the given size. */
-    public Trail(int n) {
-	buffer = new Undoable[n];
-	top = -1;
+  /** Pops an entry from this <code>Trail</code>. */
+  public Undoable pop() {
+    Undoable t = buffer[top];
+    buffer[top--] = null;
+    return t;
+  }
+
+  /** Discards all entries. */
+  protected void deleteAll() {
+    while (!empty()) {
+      buffer[top--] = null;
     }
+  }
 
-    /** Discards all entries. */
-    public void init() { deleteAll(); }
+  /** Tests if this stack has no entry. */
+  public boolean empty() {
+    return top == -1;
+  }
 
-    /** Pushs an entry to this <code>Trail</code>. */
-    public void push(Undoable t) {
-	try {
-	    buffer[++top] = t;
-	} catch (ArrayIndexOutOfBoundsException e) {
-	    int len = buffer.length;
-	    Undoable[] new_buffer = new Undoable[len+20000];
-		System.arraycopy(buffer, 0, new_buffer, 0, len);
-	    buffer = new_buffer;
-	    buffer[top] = t;
-	}
+  /** Current allocation of the trail storage array.  */
+  public int max() {
+    return buffer.length;
+  }
+
+  /** Returns the value of <code>top</code>.
+   * @see #top
+   */
+  public int top() {
+    return top;
+  }
+
+  /** Unwinds all entries after the value of <code>i</code>. */
+  public void unwind(int i) {
+    Undoable t;
+    while (top > i) {
+      t = pop();
+      t.undo();
     }
-
-    /** Pops an entry from this <code>Trail</code>. */
-    public Undoable pop() {
-	Undoable t = buffer[top];
-	buffer[top--] = null;
-	return t;
-    }
-
-    /** Discards all entries. */
-    protected void deleteAll() {
-	while (! empty()) {
-	    buffer[top--] = null;
-	}	
-    }
-
-    /** Tests if this stack has no entry. */
-    public boolean empty() {
-	return top == -1;
-    }
-
-    /** Current allocation of the trail storage array.  */
-    public int max() { return buffer.length; }
-
-    /** Returns the value of <code>top</code>. 
-     * @see #top
-     */
-    public int top() { return top; }
-
-    /** Unwinds all entries after the value of <code>i</code>. */
-    public void unwind(int i) {
-	Undoable t;
-	while (top > i) {
-	    t = pop();
-	    t.undo();
-	}
-    }
+  }
 }
 
