diff --git a/lib_lista.c b/lib_lista.c
index 7da6c0b8eb0988c2f55413f86e77274dc267bc08..e7c4b38f67f381518d832afe1275f1d805b2a9b1 100644
--- a/lib_lista.c
+++ b/lib_lista.c
@@ -7,7 +7,6 @@ int inicializa_lista(t_lista *l)
 {
 	t_nodo *sentinel;
 
-	/* Insert beginning sentinel */
 	sentinel = (t_nodo*) malloc (sizeof (t_nodo));
 	if (sentinel == NULL)
 		return 0;
@@ -15,7 +14,6 @@ int inicializa_lista(t_lista *l)
 	sentinel->prev = l->ini;
 	l->ini = sentinel;
 	
-	/* Insert end sentinel */
 	sentinel = (t_nodo*) malloc (sizeof (t_nodo));
 	if (sentinel == NULL)
 		return 0;
@@ -135,10 +133,7 @@ int insere_ordenado_lista(int item, t_lista *l)
 int remove_inicio_lista(int *item, t_lista *l)
 {
 	if (lista_vazia(l))
-	{
-		item = NULL;
 		return 0;
-	}
 
 	t_nodo *p = l->ini->prox;
 
@@ -156,10 +151,7 @@ int remove_inicio_lista(int *item, t_lista *l)
 int remove_fim_lista(int *item, t_lista *l)
 {
 	if (lista_vazia(l))
-	{
-		item = NULL;
 		return 0;
-	}
 	
 	t_nodo *p = l->fim->prev;
 
@@ -174,54 +166,127 @@ int remove_fim_lista(int *item, t_lista *l)
 	return 1;
 }
 
-/*
-  Se o elemento chave existir na lista, o retorna em *item.
-  Retorna 1 se a operação foi bem sucedida e zero caso contrário
-  (elemento não encontrado também retorna zero).
-*/
-int remove_item_lista(int chave, int *item, t_lista *l){return 1;}
+int remove_item_lista(int chave, int *item, t_lista *l)
+{
+	if (lista_vazia(l))
+		return 0;
 
-/*
-  Retorna 1 se o elemento contendo a chave chave existe na lista,
-  caso contrário retorna zero.
-*/
-int pertence_lista(int chave, t_lista *l){return 1;}
+	t_nodo *p = l->ini->prox;
+	while (p->prox != NULL && p->chave != chave)
+		p = p->prox;
+
+	if (p->prox == NULL)
+		return 0;
+
+	*item = p->chave;
+	p->prev->prox = p->prox;
+	p->prox->prev = p->prev;
+	free (p);
+
+	return 1;
+}
+
+int pertence_lista(int chave, t_lista *l)
+{
+	if (lista_vazia(l))
+		return 0;
+
+	t_nodo *p = l->ini->prox;
+	while (p->prox != NULL && p->chave != chave)
+		p = p->prox;
+
+	if (p->prox == NULL)
+		return 0;
+
+	return 1;
+}
 
 /* 
-  Inicializa o ponteiro atual para o primeiro elemento da lista.
-  Retorna 1 se a operação foi bem sucedida e zero caso contrário.
+	Para poder retornar o ponteiro de atual, foi necessário 
+	alterar o tipo do retorno de void para t_nodo*.
 */
-int inicializa_atual_inicio(t_lista *l){return 1;}
+t_nodo* inicializa_atual_inicio(t_lista *l)
+{
+	if (lista_vazia(l))
+		return NULL;
+
+	l->atual = l->ini->prox;
+	return l->atual;
+}
 
 /* 
-  Inicializa o ponteiro atual para o ultimo elemento da lista.
-  Retorna 1 se a operação foi bem sucedida e zero caso contrário.
+	Para poder retornar o ponteiro de atual, foi necessário 
+	alterar o tipo do retorno de void para t_nodo*.
 */
-int inicializa_atual_fim(t_lista *l){return 1;}
+t_nodo* inicializa_atual_fim(t_lista *l)
+{
+	if (lista_vazia(l))
+		return NULL;
 
-/*
-  Faz o ponteiro atual apontar para o próximo nodo da lista l e retorna 
-  este ponteiro. Se atual estiver apontando para o último, isto é, não 
-  tem próximo, retorna NULL.
-*/
-void incrementa_atual(t_lista *l){}
+	l->atual = l->fim->prev;
+	return l->atual;
+}
 
-/*
-  Faz o ponteiro atual apontar para o nodo anterior da lista l e retorna 
-  este ponteiro. Se atual estiver apontando para o primeiro, isto é, não 
-  tem anterior, retorna NULL.
+/* 
+	Para poder retornar o ponteiro de atual, foi necessário 
+	alterar o tipo do retorno de void para t_nodo*.
 */
-void decrementa_atual(t_lista *l){}
+t_nodo* incrementa_atual(t_lista *l)
+{
+	if (lista_vazia(l) || l->atual == NULL) 
+		return NULL;
 
-/*
-  Retorna em *item o valor contido na chave apontada pelo ponteiro atual. 
-  Se atual não for válido a função retorna zero senão retorna 1.
-*/
-int consulta_item_atual(int *item, t_lista *atual){return 1;}
+	if (l->atual->prox == l->fim)
+		return NULL;
+
+	l->atual = l->atual->prox;
+
+	return l->atual;	
+}
 
-/*
-  Remove o elemento apontado por atual da lista l e o retorna em *item.
-  Faz o atual apontar para o sucessor do nodo removido.
-  Retorna 1 se houve sucesso e zero caso contrário.
+/* 
+	Para poder retornar o ponteiro de atual, foi necessário 
+	alterar o tipo do retorno de void para t_nodo*.
 */
-int remove_item_atual(int *item, t_lista *l){return 1;}
+t_nodo* decrementa_atual(t_lista *l)
+{
+	if (lista_vazia(l) || l->atual == NULL) 
+		return NULL;
+
+	if (l->atual->prev == l->ini)
+		return NULL;
+
+	l->atual = l->atual->prev;
+
+	return l->atual;	
+}
+
+int consulta_item_atual(int *item, t_nodo *atual)
+{
+	if (atual == NULL) 
+		return 0;
+
+	*item = atual->chave;
+	return 1;
+}
+
+int remove_item_atual(int *item, t_lista *l)
+{
+	if (l->atual == NULL)
+		return 0;
+
+	t_nodo *p = l->atual;
+	p->prev->prox = p->prox;
+	p->prox->prev = p->prev;
+
+	if (p->prox->prox == NULL)
+		l->atual = p->prev;
+
+	else
+		l->atual = p->prox;
+
+	*item = p->chave;
+	free (p);
+
+	return 1;
+}
diff --git a/lib_lista.h b/lib_lista.h
index 0a74103f85fdb9f3f9cd3416587399446d09c531..0821c3e41fab648ac541a73e3249ba97fe6a1f6e 100644
--- a/lib_lista.h
+++ b/lib_lista.h
@@ -93,33 +93,33 @@ int pertence_lista(int chave, t_lista *l);
   Inicializa o ponteiro atual para o primeiro elemento da lista.
   Retorna 1 se a operação foi bem sucedida e zero caso contrário.
 */
-int inicializa_atual_inicio(t_lista *l);
+t_nodo* inicializa_atual_inicio(t_lista *l);
 
 /* 
   Inicializa o ponteiro atual para o ultimo elemento da lista.
   Retorna 1 se a operação foi bem sucedida e zero caso contrário.
 */
-int inicializa_atual_fim(t_lista *l);
+t_nodo* inicializa_atual_fim(t_lista *l);
 
 /*
   Faz o ponteiro atual apontar para o próximo nodo da lista l e retorna 
   este ponteiro. Se atual estiver apontando para o último, isto é, não 
   tem próximo, retorna NULL.
 */
-void incrementa_atual(t_lista *l);
+t_nodo* incrementa_atual(t_lista *l);
 
 /*
   Faz o ponteiro atual apontar para o nodo anterior da lista l e retorna 
   este ponteiro. Se atual estiver apontando para o primeiro, isto é, não 
   tem anterior, retorna NULL.
 */
-void decrementa_atual(t_lista *l);
+t_nodo* decrementa_atual(t_lista *l);
 
 /*
   Retorna em *item o valor contido na chave apontada pelo ponteiro atual. 
   Se atual não for válido a função retorna zero senão retorna 1.
 */
-int consulta_item_atual(int *item, t_lista *atual);
+int consulta_item_atual(int *item, t_nodo *atual);
 
 /*
   Remove o elemento apontado por atual da lista l e o retorna em *item.
diff --git a/main.c b/main.c
index 746655df85c78ea8210c45f2bc7f9f877b7cf948..10b84f578410ea6eb329074a4005719491a1600c 100644
--- a/main.c
+++ b/main.c
@@ -21,6 +21,7 @@ int main ()
 {
 	t_lista l;
 	int item;
+	t_nodo* atual;
 
 	inicializa_lista(&l);
 	insere_ordenado_lista(7, &l);
@@ -29,9 +30,18 @@ int main ()
 	insere_ordenado_lista(3, &l);
 	insere_ordenado_lista(2, &l);
 	imprime (&l);
-	remove_fim_lista(&item, &l);
-	remove_fim_lista(&item, &l);
-	imprime (&l);	
+	atual = inicializa_atual_inicio(&l);
+	atual = incrementa_atual(&l);
+	atual = incrementa_atual(&l);
+	atual = incrementa_atual(&l);
+	atual = incrementa_atual(&l);
+	remove_item_atual (&item, &l);
+	printf ("%d\n", item);
+	imprime (&l);
+	atual = decrementa_atual(&l);
+	atual = incrementa_atual(&l);
+	consulta_item_atual (&item, atual);
+	printf ("%d\n", item);
 
 	return 0;
 }