For the first part, you might not be correctly adding the speed of the sticky object to the speed of the character when the player is moving him.
To start with, you can do a simple vector addition so that any player-controlled movement is synced with the surfaces (assuming both are Vector3 values, which then you can just do...
playerSpeed = playerMovement+colliderMovement).
For the second part, it might be that your character gets into a situation where it stops colliding with the surface. To fix this, you can assign the speed of the surface to a variable, use that variable as the value for the character's movement, and only reset it to 0 if there's no collision for more than N frames. Such as...
if collider == Null:
timer += 1
timer = 0
if timer > 10:
surfaceSpeed = Vector3(0,0,0)
Hope this gives some good direction.