diff --git a/src/lang/Trail.java b/src/lang/Trail.java
index a782781..e354650 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,80 @@
  * @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(100);
+  }
+
+  /** 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) {
+    if (++top >= buffer.length) {
+      int len = buffer.length;
+      Undoable[] new_buffer = new Undoable[2 * len];
+      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();
-	}
-    }
+  }
 }
 
