diff --git a/.travis.yml b/.travis.yml
index f3b8b46..6131e6d 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,9 +1,8 @@
 language: go
 
 go:
-  - 1.5
-  - 1.6
   - 1.7
+  - 1.8
   - tip
 
 script: make test-static
diff --git a/remote.go b/remote.go
index d3f437d..b4b1dd7 100644
--- a/remote.go
+++ b/remote.go
@@ -144,6 +144,7 @@
 type Remote struct {
 	ptr       *C.git_remote
 	callbacks RemoteCallbacks
+	repo      *Repository
 }
 
 type CertificateKind uint
@@ -370,6 +371,7 @@
 func (r *Remote) Free() {
 	runtime.SetFinalizer(r, nil)
 	C.git_remote_free(r.ptr)
+	r.ptr = nil
 }
 
 type RemoteCollection struct {
@@ -383,6 +385,7 @@
 	defer runtime.UnlockOSThread()
 
 	ecode := C.git_remote_list(&r, c.repo.ptr)
+	runtime.KeepAlive(c.repo)
 	if ecode < 0 {
 		return nil, MakeGitError(ecode)
 	}
@@ -393,7 +396,7 @@
 }
 
 func (c *RemoteCollection) Create(name string, url string) (*Remote, error) {
-	remote := &Remote{}
+	remote := &Remote{repo: c.repo}
 
 	cname := C.CString(name)
 	defer C.free(unsafe.Pointer(cname))
@@ -419,6 +422,7 @@
 	defer runtime.UnlockOSThread()
 
 	ret := C.git_remote_delete(c.repo.ptr, cname)
+	runtime.KeepAlive(c.repo)
 	if ret < 0 {
 		return MakeGitError(ret)
 	}
@@ -426,7 +430,7 @@
 }
 
 func (c *RemoteCollection) CreateWithFetchspec(name string, url string, fetch string) (*Remote, error) {
-	remote := &Remote{}
+	remote := &Remote{repo: c.repo}
 
 	cname := C.CString(name)
 	defer C.free(unsafe.Pointer(cname))
@@ -447,7 +451,7 @@
 }
 
 func (c *RemoteCollection) CreateAnonymous(url string) (*Remote, error) {
-	remote := &Remote{}
+	remote := &Remote{repo: c.repo}
 
 	curl := C.CString(url)
 	defer C.free(unsafe.Pointer(curl))
@@ -464,7 +468,7 @@
 }
 
 func (c *RemoteCollection) Lookup(name string) (*Remote, error) {
-	remote := &Remote{}
+	remote := &Remote{repo: c.repo}
 
 	cname := C.CString(name)
 	defer C.free(unsafe.Pointer(cname))
@@ -481,15 +485,21 @@
 }
 
 func (o *Remote) Name() string {
-	return C.GoString(C.git_remote_name(o.ptr))
+	s := C.git_remote_name(o.ptr)
+	runtime.KeepAlive(o)
+	return C.GoString(s)
 }
 
 func (o *Remote) Url() string {
-	return C.GoString(C.git_remote_url(o.ptr))
+	s := C.git_remote_url(o.ptr)
+	runtime.KeepAlive(o)
+	return C.GoString(s)
 }
 
 func (o *Remote) PushUrl() string {
-	return C.GoString(C.git_remote_pushurl(o.ptr))
+	s := C.git_remote_pushurl(o.ptr)
+	runtime.KeepAlive(o)
+	return C.GoString(s)
 }
 
 func (c *RemoteCollection) Rename(remote, newname string) ([]string, error) {
@@ -504,6 +514,7 @@
 	defer runtime.UnlockOSThread()
 
 	ret := C.git_remote_rename(&cproblems, c.repo.ptr, cremote, cnewname)
+	runtime.KeepAlive(c.repo)
 	if ret < 0 {
 		return []string{}, MakeGitError(ret)
 	}
@@ -522,6 +533,7 @@
 	defer runtime.UnlockOSThread()
 
 	ret := C.git_remote_set_url(c.repo.ptr, cremote, curl)
+	runtime.KeepAlive(c.repo)
 	if ret < 0 {
 		return MakeGitError(ret)
 	}
@@ -538,6 +550,7 @@
 	defer runtime.UnlockOSThread()
 
 	ret := C.git_remote_set_pushurl(c.repo.ptr, cremote, curl)
+	runtime.KeepAlive(c.repo)
 	if ret < 0 {
 		return MakeGitError(ret)
 	}
@@ -554,6 +567,7 @@
 	defer runtime.UnlockOSThread()
 
 	ret := C.git_remote_add_fetch(c.repo.ptr, cremote, crefspec)
+	runtime.KeepAlive(c.repo)
 	if ret < 0 {
 		return MakeGitError(ret)
 	}
@@ -605,6 +619,7 @@
 	defer runtime.UnlockOSThread()
 
 	ret := C.git_remote_get_fetch_refspecs(&crefspecs, o.ptr)
+	runtime.KeepAlive(o)
 	if ret < 0 {
 		return nil, MakeGitError(ret)
 	}
@@ -624,6 +639,7 @@
 	defer runtime.UnlockOSThread()
 
 	ret := C.git_remote_add_push(c.repo.ptr, cremote, crefspec)
+	runtime.KeepAlive(c.repo)
 	if ret < 0 {
 		return MakeGitError(ret)
 	}
@@ -641,12 +657,16 @@
 		return nil, MakeGitError(ret)
 	}
 	defer C.git_strarray_free(&crefspecs)
+	runtime.KeepAlive(o)
+
 	refspecs := makeStringsFromCStrings(crefspecs.strings, int(crefspecs.count))
 	return refspecs, nil
 }
 
 func (o *Remote) RefspecCount() uint {
-	return uint(C.git_remote_refspec_count(o.ptr))
+	count := C.git_remote_refspec_count(o.ptr)
+	runtime.KeepAlive(o)
+	return uint(count)
 }
 
 func populateFetchOptions(options *C.git_fetch_options, opts *FetchOptions) {
@@ -706,6 +726,7 @@
 	defer runtime.UnlockOSThread()
 
 	ret := C.git_remote_fetch(o.ptr, &crefspecs, coptions, cmsg)
+	runtime.KeepAlive(o)
 	if ret < 0 {
 		return MakeGitError(ret)
 	}
@@ -734,17 +755,18 @@
 	var cproxy C.git_proxy_options
 	populateProxyOptions(&cproxy, proxyOpts)
 	defer freeProxyOptions(&cproxy)
-	
+
 	cheaders := C.git_strarray{}
 	cheaders.count = C.size_t(len(headers))
 	cheaders.strings = makeCStringsFromStrings(headers)
 	defer freeStrarray(&cheaders)
 
-
 	runtime.LockOSThread()
 	defer runtime.UnlockOSThread()
 
-	if ret := C.git_remote_connect(o.ptr, C.git_direction(direction), &ccallbacks, &cproxy, &cheaders); ret != 0 {
+	ret := C.git_remote_connect(o.ptr, C.git_direction(direction), &ccallbacks, &cproxy, &cheaders)
+	runtime.KeepAlive(o)
+	if ret != 0 {
 		return MakeGitError(ret)
 	}
 	return nil
@@ -755,6 +777,7 @@
 	defer runtime.UnlockOSThread()
 
 	C.git_remote_disconnect(o.ptr)
+	runtime.KeepAlive(o)
 }
 
 func (o *Remote) Ls(filterRefs ...string) ([]RemoteHead, error) {
@@ -765,7 +788,9 @@
 	runtime.LockOSThread()
 	defer runtime.UnlockOSThread()
 
-	if ret := C.git_remote_ls(&refs, &length, o.ptr); ret != 0 {
+	ret := C.git_remote_ls(&refs, &length, o.ptr)
+	runtime.KeepAlive(o)
+	if ret != 0 {
 		return nil, MakeGitError(ret)
 	}
 
@@ -820,6 +845,7 @@
 	defer runtime.UnlockOSThread()
 
 	ret := C.git_remote_push(o.ptr, &crefspecs, coptions)
+	runtime.KeepAlive(o)
 	if ret < 0 {
 		return MakeGitError(ret)
 	}
@@ -838,6 +864,7 @@
 	defer runtime.UnlockOSThread()
 
 	ret := C.git_remote_prune(o.ptr, &ccallbacks)
+	runtime.KeepAlive(o)
 	if ret < 0 {
 		return MakeGitError(ret)
 	}
