First, we focus on the Index Coding problem, which is one of the basic problems in wireless Network Coding. In this problem the objective is to reduce the number of transmissions from server (relay) by taking advantage of the side information available at the clients due to the broadcast nature of wireless medium. Since the Index Coding problem is NP-hard we propose several heuristic solutions. We also consider the Complementary Index Coding Problem, whose goal is to maximize the number of saved transmissions, i.e., the number of transmissions that are saved by using the Index Coding technique compared to the traditional solution that does not involve coding. It turns out that the complementary problem can be approximated in certain cases of practical importance. Accordingly, we provide approximation algorithms for scalar and vector versions of the Complementary Index Coding Problem. Second, we focus on the design of efficient multicast Network Codes for dynamic networks. We consider the problem of maintaining the feasibility of a given Network Code upon a change in the network topology or the addition of a new user. Our goal is to minimize the number of encoding coefficients that needs to be modified to keep the Network Code feasible. We analyze the complexity of this problem and provide efficient solutions. Third, we propose algorithms for Distributed Data Retrieval problem, where parts of a file are stored in either original or encoded form across multiple network locations. The objective is to find a set of disjoint paths of minimum total cost that connect the client with a set of servers such that the client is able to download sufficient data to decode the required file. Finally, we consider the problem of establishing reliable unicast connections over communication networks with unequal edge capacities in the presence of edge failures (crash and Byzantine).