Took @carlosmn PR review into account
diff --git a/git.go b/git.go
index ed891e6..e272389 100644
--- a/git.go
+++ b/git.go
@@ -50,6 +50,7 @@
 	ErrClassFilter     ErrorClass = C.GITERR_FILTER
 	ErrClassRevert     ErrorClass = C.GITERR_REVERT
 	ErrClassCallback   ErrorClass = C.GITERR_CALLBACK
+	ErrClassRebase     ErrorClass = C.GITERR_REBASE
 )
 
 type ErrorCode int
diff --git a/rebase.go b/rebase.go
index f28c7f6..8384d68 100644
--- a/rebase.go
+++ b/rebase.go
@@ -28,14 +28,14 @@
 // RebaseOperation describes a single instruction/operation to be performed during the rebase.
 type RebaseOperation struct {
 	Type RebaseOperationType
-	ID   *Oid
+	Id   *Oid
 	Exec string
 }
 
 func newRebaseOperationFromC(c *C.git_rebase_operation) *RebaseOperation {
 	operation := &RebaseOperation{}
 	operation.Type = RebaseOperationType(c._type)
-	operation.ID = newOidFromC(&c.id)
+	operation.Id = newOidFromC(&c.id)
 	operation.Exec = C.GoString(c.exec)
 
 	return operation
@@ -84,26 +84,26 @@
 		version:           C.uint(ro.Version),
 		quiet:             C.int(ro.Quiet),
 		inmemory:          C.int(ro.InMemory),
-		rewrite_notes_ref: rewriteNotesRefToC(ro.RewriteNotesRef),
+		rewrite_notes_ref: mapEmptyStringToNull(ro.RewriteNotesRef),
 		merge_options:     *ro.MergeOptions.toC(),
 		checkout_options:  *ro.CheckoutOptions.toC(),
 	}
 }
 
-func rewriteNotesRefToC(ref string) *C.char {
+func mapEmptyStringToNull(ref string) *C.char {
 	if ref == "" {
 		return nil
 	}
 	return C.CString(ref)
 }
 
-// Rebase object wrapper for C pointer
+// Rebase is the struct representing a Rebase object.
 type Rebase struct {
 	ptr *C.git_rebase
 }
 
-//RebaseInit initializes a rebase operation to rebase the changes in branch relative to upstream onto another branch.
-func (r *Repository) RebaseInit(branch *AnnotatedCommit, upstream *AnnotatedCommit, onto *AnnotatedCommit, opts *RebaseOptions) (*Rebase, error) {
+// InitRebase initializes a rebase operation to rebase the changes in branch relative to upstream onto another branch.
+func (r *Repository) InitRebase(branch *AnnotatedCommit, upstream *AnnotatedCommit, onto *AnnotatedCommit, opts *RebaseOptions) (*Rebase, error) {
 	runtime.LockOSThread()
 	defer runtime.UnlockOSThread()
 
@@ -128,8 +128,8 @@
 	return newRebaseFromC(ptr), nil
 }
 
-//RebaseOpen opens an existing rebase that was previously started by either an invocation of git_rebase_init or by another client.
-func (r *Repository) RebaseOpen(opts *RebaseOptions) (*Rebase, error) {
+// OpenRebase opens an existing rebase that was previously started by either an invocation of InitRebase or by another client.
+func (r *Repository) OpenRebase(opts *RebaseOptions) (*Rebase, error) {
 	runtime.LockOSThread()
 	defer runtime.UnlockOSThread()
 
@@ -149,9 +149,13 @@
 }
 
 // CurrentOperationIndex gets the index of the rebase operation that is currently being applied.
-// If the first operation has not yet been applied then this returns -1 (C.GIT_REBASE_NO_OPERATION).
-func (rebase *Rebase) CurrentOperationIndex() int {
-	return int(C.git_rebase_operation_current(rebase.ptr))
+// Returns an error if no rebase operation is currently applied.
+func (rebase *Rebase) CurrentOperationIndex() (uint, error) {
+	operationIndex := int(C.git_rebase_operation_current(rebase.ptr))
+	if operationIndex == C.GIT_REBASE_NO_OPERATION {
+		return 0, MakeGitError(C.GIT_REBASE_NO_OPERATION)
+	}
+	return uint(operationIndex), nil
 }
 
 // OperationCount gets the count of rebase operations that are to be applied.
@@ -160,7 +164,7 @@
 }
 
 // Next performs the next rebase operation and returns the information about it.
-// If the operation is one that applies a patch (which is any operation except GIT_REBASE_OPERATION_EXEC)
+// If the operation is one that applies a patch (which is any operation except RebaseOperationExec)
 // then the patch will be applied and the index and working directory will be updated with the changes.
 // If there are conflicts, you will need to address those before committing the changes.
 func (rebase *Rebase) Next() (*RebaseOperation, error) {
@@ -177,7 +181,7 @@
 }
 
 // Commit commits the current patch.
-// You must have resolved any conflicts that were introduced during the patch application from the git_rebase_next invocation.
+// You must have resolved any conflicts that were introduced during the patch application from the Next() invocation.
 func (rebase *Rebase) Commit(ID *Oid, author, committer *Signature, message string) error {
 	runtime.LockOSThread()
 	defer runtime.UnlockOSThread()
@@ -192,6 +196,7 @@
 	if err != nil {
 		return err
 	}
+	defer C.git_signature_free(committerSig)
 
 	cmsg := C.CString(message)
 	defer C.free(unsafe.Pointer(cmsg))
@@ -229,7 +234,7 @@
 	return nil
 }
 
-//Free frees the Rebase object and underlying git_rebase C pointer.
+// Free frees the Rebase object.
 func (rebase *Rebase) Free() {
 	runtime.SetFinalizer(rebase, nil)
 	C.git_rebase_free(rebase.ptr)
diff --git a/rebase_test.go b/rebase_test.go
index 38d6868..9c8e0c2 100644
--- a/rebase_test.go
+++ b/rebase_test.go
@@ -111,7 +111,7 @@
 	seedTestRepo(t, repo)
 
 	// Try to open existing rebase
-	oRebase, err := repo.RebaseOpen(nil)
+	oRebase, err := repo.OpenRebase(nil)
 	if err == nil {
 		t.Fatal("Did not expect to find a rebase in progress")
 	}
@@ -132,7 +132,7 @@
 	defer rebase.Free()
 
 	// Open existing rebase
-	oRebase, err = repo.RebaseOpen(nil)
+	oRebase, err = repo.OpenRebase(nil)
 	checkFatal(t, err)
 	defer oRebase.Free()
 	if oRebase == nil {
@@ -144,7 +144,7 @@
 	checkFatal(t, err)
 
 	// Check no more rebase is in progress
-	oRebase, err = repo.RebaseOpen(nil)
+	oRebase, err = repo.OpenRebase(nil)
 	if err == nil {
 		t.Fatal("Did not expect to find a rebase in progress")
 	}
@@ -198,13 +198,14 @@
 	defer onto.Free()
 
 	// Init rebase
-	rebase, err := repo.RebaseInit(nil, nil, onto, nil)
+	rebase, err := repo.InitRebase(nil, nil, onto, nil)
 	if err != nil {
 		return nil, err
 	}
 
 	// Check no operation has been started yet
-	if rebase.CurrentOperationIndex() != -1 { // -1 == GIT_REBASE_NO_OPERATION
+	rebaseOperationIndex, err := rebase.CurrentOperationIndex()
+	if err == nil {
 		return nil, errors.New("No operation should have been started yet")
 	}
 
@@ -217,7 +218,8 @@
 		}
 
 		// Check operation index is correct
-		if rebase.CurrentOperationIndex() != op {
+		rebaseOperationIndex, err = rebase.CurrentOperationIndex()
+		if int(rebaseOperationIndex) != op {
 			return nil, errors.New("Bad operation index")
 		}
 		if !operationsAreEqual(rebase.OperationAt(uint(op)), operation) {
@@ -225,14 +227,14 @@
 		}
 
 		// Get current rebase operation created commit
-		commit, err := repo.LookupCommit(operation.ID)
+		commit, err := repo.LookupCommit(operation.Id)
 		if err != nil {
 			return nil, err
 		}
 		defer commit.Free()
 
 		// Apply commit
-		err = rebase.Commit(operation.ID, signature(), signature(), commit.Message())
+		err = rebase.Commit(operation.Id, signature(), signature(), commit.Message())
 		if err != nil {
 			return nil, err
 		}
@@ -242,7 +244,7 @@
 }
 
 func operationsAreEqual(l, r *RebaseOperation) bool {
-	return l.Exec == r.Exec && l.Type == r.Type && l.ID.String() == r.ID.String()
+	return l.Exec == r.Exec && l.Type == r.Type && l.Id.String() == r.Id.String()
 }
 
 func createBranch(repo *Repository, branch string) error {