     
     typealias Edges = [Character: DawgNode]
     
-    internal lazy var edges = Edges()
+    private lazy var edges = Edges()
     internal var final: Bool = false
     internal var id: Int
-    private var descr: String = ""
     
     public init() {
         self.id = self.dynamicType.nextId
         self.dynamicType.nextId += 1
-        updateDescription()
     }
     
     private init(withId id: Int, final: Bool, edges: Edges?) {
+        self.dynamicType.nextId = max(self.dynamicType.nextId, id)
         self.id = id
         self.final = final
         if edges?.count > 0 { self.edges = edges! }
-        updateDescription()
     }
     
     public class func deserialize(serialized: NSArray, inout cached: [Int: DawgNode]) -> DawgNode {
         let id = serialized.firstObject! as! Int
         guard let cache = cached[id] else {
-            var edges: Edges?
+            var edges = Edges()
             if serialized.count == 3 {
                 edges = Edges()
                 if let serializedEdges = serialized.objectAtIndex(2) as? [String: NSArray] {
                     for (letter, array) in serializedEdges {
-                        edges?[Character(letter)] = DawgNode.deserialize(array, cached: &cached)
+                        edges[Character(letter)] = DawgNode.deserialize(array, cached: &cached)
                     }
                 }
             }

    /// - parameter downTo: Iterate from count to this number (truncates these items).
    private func minimize(downTo: Int) {
        for i in (downTo..<uncheckedNodes.count).reverse() {
            let (_, letter, child) = uncheckedNodes[i]
            if let minNode = minimizedNodes[child] {
                uncheckedNodes[i].parent.setEdge(letter, node: minNode)
            } else {
                minimizedNodes[child] = child
            }

    /// Insert a word into the graph, words must be inserted in order.
    /// - parameter word: Word to insert.
    public func insert(word: String) {
        assert(previousWord == "" || (previousWord != "" && previousWord < word))
        
        // Find common prefix for word and previous word.
        let chars = Array(word.characters)
        var commonPrefix = 0
        for i in 0..<min(chars.count, previousChars.count) {
            if chars[i] != previousChars[i] { break }
            commonPrefix++
