diff --git a/CMakeLists.txt b/CMakeLists.txt
index 605ab76..7fad325 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -12,6 +12,7 @@ OPTION (ENABLE_TCL "Build the Tcl bindings?" OFF)
 
 OPTION (USE_VENDORDIRS "Install the bindings in vendor directories?" OFF)
 
+OPTION (ENABLE_RPMDB_LMDB "Build with rpm db as lmdb?" OFF)
 OPTION (ENABLE_RPMDB "Build with rpm database support?" OFF)
 OPTION (ENABLE_RPMPKG "Build with rpm package support?" OFF)
 OPTION (ENABLE_PUBKEY "Build with pubkey support?" OFF)
@@ -83,6 +84,17 @@ INCLUDE (${CMAKE_SOURCE_DIR}/VERSION.cmake)
 
 SET (have_system x)
 
+IF (PHOTON)
+MESSAGE(STATUS "Building for Photon")
+ADD_DEFINITIONS (-DPHOTON)
+SET (RPM5 ON)
+SET (ENABLE_RPMDB ON)
+SET (ENABLE_RPMMD ON)
+SET (ENABLE_RPMDB_LMDB ON)
+SET (ENABLE_COMPLEX_DEPS ON)
+SET (have_system ${have_system}x)
+ENDIF (PHOTON)
+
 IF (FEDORA)
 MESSAGE(STATUS "Building for Fedora")
 ADD_DEFINITIONS (-DFEDORA)
@@ -220,17 +232,25 @@ IF (ENABLE_RPMDB)
     ENDIF (RPMMISC_LIBRARY)
   ENDIF (RPM5)
 
-  # check if rpm contains a bundled berkeley db
-  CHECK_INCLUDE_FILE(rpm/db.h HAVE_RPM_DB_H)
-  IF (NOT HAVE_RPM_DB_H)
-    FIND_LIBRARY (DB_LIBRARY NAMES db)
+  IF (NOT ENABLE_RPMDB_LMDB)
+    # check if rpm contains a bundled berkeley db
+    CHECK_INCLUDE_FILE(rpm/db.h HAVE_RPM_DB_H)
+    IF (NOT HAVE_RPM_DB_H)
+      FIND_LIBRARY (DB_LIBRARY NAMES db)
+      IF (DB_LIBRARY)
+        SET (RPMDB_LIBRARY ${DB_LIBRARY} ${RPMDB_LIBRARY})
+      ENDIF (DB_LIBRARY)
+      IF (DB_INCLUDE_DIR)
+        INCLUDE_DIRECTORIES (${DB_INCLUDE_DIR})
+      ENDIF (DB_INCLUDE_DIR)
+    ENDIF (NOT HAVE_RPM_DB_H)
+  ELSE (NOT ENABLE_RPMDB_LMDB)
+    FIND_LIBRARY (DB_LIBRARY NAMES lmdb)
     IF (DB_LIBRARY)
       SET (RPMDB_LIBRARY ${DB_LIBRARY} ${RPMDB_LIBRARY})
     ENDIF (DB_LIBRARY)
-    IF (DB_INCLUDE_DIR)
-      INCLUDE_DIRECTORIES (${DB_INCLUDE_DIR})
-    ENDIF (DB_INCLUDE_DIR)
-  ENDIF (NOT HAVE_RPM_DB_H)
+  ENDIF (NOT ENABLE_RPMDB_LMDB)
+
   INCLUDE (CheckLibraryExists)
   CHECK_LIBRARY_EXISTS(rpmio pgpDigGetParams "" HAVE_PGPDIGGETPARAMS)
 ENDIF (ENABLE_RPMDB)
diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt
index 703796c..d56184f 100644
--- a/examples/CMakeLists.txt
+++ b/examples/CMakeLists.txt
@@ -1,5 +1,5 @@
-IF (SUSE OR FEDORA OR DEBIAN OR MANDRIVA OR MAGEIA)
+IF (PHOTON OR SUSE OR FEDORA OR DEBIAN OR MANDRIVA OR MAGEIA)
 
 ADD_SUBDIRECTORY (solv)
 
-ENDIF (SUSE OR FEDORA OR DEBIAN OR MANDRIVA OR MAGEIA)
+ENDIF (PHOTON OR SUSE OR FEDORA OR DEBIAN OR MANDRIVA OR MAGEIA)
diff --git a/ext/CMakeLists.txt b/ext/CMakeLists.txt
index b8917a2..5d75c3f 100644
--- a/ext/CMakeLists.txt
+++ b/ext/CMakeLists.txt
@@ -11,6 +11,13 @@ IF (ENABLE_RPMDB OR ENABLE_RPMPKG)
         pool_fileconflicts.h repo_rpmdb.h)
 ENDIF (ENABLE_RPMDB OR ENABLE_RPMPKG)
 
+IF (ENABLE_RPMDB_LMDB)
+    SET (libsolvext_SRCS ${libsolvext_SRCS}
+        db_lmdb.c)
+    SET (libsolvext_HEADERS ${libsolvext_HEADERS}
+        db_lmdb.h)
+ENDIF (ENABLE_RPMDB_LMDB)
+
 IF (ENABLE_PUBKEY)
     SET (libsolvext_SRCS ${libsolvext_SRCS}
 	repo_pubkey.c)
diff --git a/ext/db_lmdb.c b/ext/db_lmdb.c
new file mode 100644
index 0000000..c3941b0
--- /dev/null
+++ b/ext/db_lmdb.c
@@ -0,0 +1,258 @@
+/*
+ * Copyright (c) 2007-2012, Novell Inc.
+ *
+ * This program is licensed under the BSD license, read LICENSE.BSD
+ * for further information
+ */
+
+/*
+ * db_lmdb
+ *
+ * bridge for db to lmdb calls
+ *
+ */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <limits.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <assert.h>
+#include <stdint.h>
+#include <errno.h>
+
+#include "db_lmdb.h"
+#include "util.h"
+
+int db_env_open(struct _DB_ENV_ *dbenv, const char *dbpath, u_int32_t flags, int naccess)
+{
+  int err = 0;
+
+  err = mdb_env_open(dbenv->env, dbpath, 0, naccess);
+  bail_on_error(err);
+
+error:
+  return err;  
+}
+
+int db_env_close(struct _DB_ENV_ *dbenv, u_int32_t flags)
+{
+  int err = 0;
+
+  if(dbenv && dbenv->env)
+    mdb_env_close(dbenv->env);
+
+  return err;
+}
+
+int db_env_get_open_flags(struct _DB_ENV_ *dbenv, u_int32_t *flags)
+{
+  *flags = 0;
+  return 0;
+}
+
+int db_env_create (DB_ENV **dbenvp, u_int32_t flags)
+{
+  DB_ENV *dbenv = NULL;
+  MDB_env *mdbenv = NULL;
+  int err = 0;
+
+  dbenv = solv_malloc(sizeof(DB_ENV));
+  if(!dbenv)
+    err = ENOMEM;
+  bail_on_error(err);
+
+  err = mdb_env_create(&mdbenv);
+  bail_on_error(err);
+
+  err = mdb_env_set_maxreaders(mdbenv, 16);
+  bail_on_error(err);
+
+  err = mdb_env_set_maxdbs(mdbenv, 32);
+  bail_on_error(err);
+
+  err = mdb_env_set_mapsize(mdbenv, 50*1024*1024);
+  bail_on_error(err);
+
+  dbenv->env = mdbenv;
+  dbenv->open = db_env_open;
+  dbenv->close = db_env_close;
+  dbenv->get_open_flags = db_env_get_open_flags;
+
+  *dbenvp = dbenv;
+cleanup:
+  return err;
+
+error:
+  if(mdbenv)
+    mdb_env_close(mdbenv);
+  solv_free(dbenv);
+  goto cleanup;
+}
+
+//db
+int db_close(struct _DB_ *db, u_int32_t flags)
+{
+  return 0;
+}
+
+int dbc_close(struct _DBC_ *dbc)
+{
+/*
+  if(dbc->txn)
+  {
+    if(dbc->txn->txn)
+      mdb_txn_abort(dbc->txn->txn);
+    dbc->txn->txn = NULL;
+    solv_free(dbc->txn);
+  }
+  dbc->txn = NULL;
+*/
+  return 0;
+}
+
+int dbc_c_close(struct _DBC_ *dbc)
+{
+  if(dbc->cursor)
+    mdb_cursor_close(dbc->cursor);
+  dbc->cursor = NULL;
+  return 0;
+}
+
+int dbc_c_get(struct _DBC_ *dbc, struct _DBT_ *key, struct _DBT_ *value, u_int32_t flags)
+{
+  int err = 0;
+  u_int32_t flagsin = flags == DB_SET ? MDB_SET : MDB_NEXT;
+  MDB_val mkey, mval;
+
+  if(flagsin == MDB_SET)
+  {
+    mkey.mv_size = key->size;
+    mkey.mv_data = key->data;
+  }
+
+  err = mdb_cursor_get(dbc->cursor, &mkey, &mval, flagsin);
+  bail_on_error(err);
+
+  if(flagsin == MDB_NEXT)
+  {
+    key->size = mkey.mv_size;
+    key->data = mkey.mv_data;
+  }
+  value->size = mval.mv_size;
+  value->data = mval.mv_data;
+
+cleanup:
+  return err;
+error:
+  goto cleanup;
+}
+
+int db_cursor(struct _DB_ *db, struct _DB_TXN_ *txn,
+              struct _DBC_ **dbcp, u_int32_t flags)
+{
+  int err = 0;
+  DBC *dbc = NULL;
+
+  DB_TXN *txncurrent = txn ? txn : db->txn;
+
+  if(!txncurrent || !txncurrent->txn)
+    err = EINVAL;
+  bail_on_error(err);
+
+  dbc = solv_malloc(sizeof(DBC));
+  if(!dbc)
+    err = ENOMEM;    
+  bail_on_error(err);
+
+  err = mdb_cursor_open(txncurrent->txn, db->db, &dbc->cursor);
+  bail_on_error(err);
+
+  dbc->close = dbc_close;
+  dbc->c_close = dbc_c_close;
+  dbc->c_get = dbc_c_get;
+
+  *dbcp = dbc;
+cleanup:
+  return err;
+error:
+  solv_free(dbc);
+  goto cleanup;
+}
+ 
+int db_get(struct _DB_ *db, struct _DB_TXN_ *txn,
+           struct _DBT_ *key, struct _DBT_ *value, u_int32_t flags)
+{
+  return 0;
+}
+
+int db_open(struct _DB_ *db, struct _DB_TXN_ *txn,
+            const char *file, const char *database,
+            DBTYPE dbtype, u_int32_t flags, int mode)
+{
+  int err = 0;
+  DB_TXN *txnp = NULL;
+  MDB_dbi dbi = -1;
+  DB_TXN *txncurrent = txn;
+
+  if(!txn)
+  {
+    u_int32_t txnflags = flags & DB_RDONLY ? MDB_RDONLY : 0;
+    txnp = solv_malloc(sizeof(DB_TXN));
+    if(!txnp)
+      err = ENOMEM;    
+    bail_on_error(err);
+
+    err = mdb_txn_begin(db->env, NULL, txnflags, &txnp->txn);
+    bail_on_error(err);
+
+    txncurrent = txnp;
+  }
+
+  err = mdb_dbi_open(txncurrent->txn, file, 0, &dbi);
+  bail_on_error(err);
+  
+  db->txn = txnp;
+  db->db = dbi;
+
+cleanup:
+  return err;
+error:
+  solv_free(txnp);
+  goto cleanup;
+}
+
+int db_get_byteswapped(struct _DB_ *db, int *byteswapped)
+{
+  *byteswapped = 0;
+  return 0;
+}
+
+int db_create (DB **db, DB_ENV *dbenv, u_int32_t flags)
+{
+  int err = 0;
+  DB *dbp = NULL;
+
+  dbp = solv_malloc(sizeof(DB));
+  if(!dbp)
+    err = ENOMEM;
+  bail_on_error(err);
+
+
+  dbp->env = dbenv->env;
+  dbp->close = db_close;
+  dbp->cursor = db_cursor;
+  dbp->get = db_get;
+  dbp->get_byteswapped = db_get_byteswapped;
+  dbp->open = db_open;
+  *db = dbp;
+
+cleanup:
+  return err;
+error:
+  solv_free(dbp);
+  goto cleanup;
+}
diff --git a/ext/db_lmdb.h b/ext/db_lmdb.h
new file mode 100644
index 0000000..4eb197d
--- /dev/null
+++ b/ext/db_lmdb.h
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 2007-2008, Novell Inc.
+ *
+ * This program is licensed under the BSD license, read LICENSE.BSD
+ * for further information
+ */
+
+#ifndef RPM_LMDB_H
+#define RPM_LMDB_H
+
+#include <lmdb.h>
+
+typedef enum
+{
+  DB_UNKNOWN=5
+} DBTYPE;
+
+typedef struct _DB_ENV_
+{
+  MDB_env *env;
+  int  (*get_open_flags) (struct _DB_ENV_ *, u_int32_t *);
+  int  (*open) (struct _DB_ENV_ *, const char *, u_int32_t, int);
+  int  (*close) (struct _DB_ENV_ *, u_int32_t);
+}DB_ENV;
+
+typedef struct _DB_TXN_
+{
+  MDB_txn *txn;
+}DB_TXN;
+
+typedef struct _DBT_
+{
+  void *data;
+  u_int32_t size;
+}DBT;
+
+typedef struct _DBC_
+{
+  MDB_cursor *cursor;
+  int (*close) (struct _DBC_ *);
+  int (*c_close) (struct _DBC_ *);
+  int (*c_get) (struct _DBC_ *, struct _DBT_ *, struct _DBT_ *, u_int32_t);
+}DBC;
+
+typedef struct _DB_
+{
+  DB_TXN *txn;
+  MDB_dbi db;
+  MDB_env *env;
+  int  (*close) (struct _DB_ *, u_int32_t);
+  int  (*cursor)(struct _DB_ *, struct _DB_TXN_ *, struct _DBC_ **, u_int32_t);
+  int  (*get) (struct _DB_ *, struct _DB_TXN_ *, struct _DBT_ *, struct _DBT_ *, u_int32_t);
+  int  (*get_byteswapped) (struct _DB_ *, int *);
+  int  (*open) (struct _DB_ *,
+                  struct _DB_TXN_ *,
+                  const char *,
+                  const char *,
+                  DBTYPE,
+                  u_int32_t,
+                  int);
+}DB;
+
+//definitions from db.h
+#define	DB_CREATE     0x00000001
+#define	DB_INIT_CDB   0x00000080
+#define	DB_INIT_MPOOL 0x00000400
+#define	DB_PRIVATE    0x00010000
+#define	DB_RDONLY     0x00000400
+
+#define	DB_NEXT       16
+#define	DB_SET        26
+
+int db_env_create (DB_ENV **, u_int32_t);
+int db_create (DB **, DB_ENV *, u_int32_t);
+
+#define bail_on_error(nerror) \
+    do {                                                           \
+        if (nerror)                                               \
+        {                                                          \
+            goto error;                                            \
+        }                                                          \
+    } while(0)
+#endif//RPM_LMDB_H
diff --git a/ext/repo_rpmdb.c b/ext/repo_rpmdb.c
index fe05bec..9f4ad31 100644
--- a/ext/repo_rpmdb.c
+++ b/ext/repo_rpmdb.c
@@ -25,6 +25,7 @@
 #include <errno.h>
 
 #ifdef ENABLE_RPMDB
+#define ENABLE_RPMDB_LMDB
 
 #include <rpm/rpmio.h>
 #include <rpm/rpmpgp.h>
@@ -37,7 +38,11 @@
 # if defined(SUSE) || defined(HAVE_RPM_DB_H)
 #  include <rpm/db.h>
 # else
-#  include <db.h>
+#  ifdef ENABLE_RPMDB_LMDB
+#   include "db_lmdb.h"
+#  else
+#   include <db.h>
+#  endif
 # endif
 #endif
 
@@ -1515,7 +1520,7 @@ count_headers(struct rpmdbstate *state)
   DBT dbkey;
   DBT dbdata;
 
-  snprintf(dbpath, PATH_MAX, "%s%s/Name", state->rootdir ? state->rootdir : "", state->is_ostree ? "/usr/share/rpm" : "/var/lib/rpm");
+  snprintf(dbpath, PATH_MAX, "%s%s/data.mdb", state->rootdir ? state->rootdir : "", state->is_ostree ? "/usr/share/rpm" : "/var/lib/rpm");
   if (stat(dbpath, &statbuf))
     return 0;
   memset(&dbkey, 0, sizeof(dbkey));
@@ -1841,7 +1846,7 @@ repo_add_rpmdb(Repo *repo, Repo *ref, int flags)
     }
 
   /* XXX: should get ro lock of Packages database! */
-  snprintf(dbpath, PATH_MAX, "%s%s/Packages", state.rootdir ? state.rootdir : "", state.is_ostree ? "/usr/share/rpm" : "/var/lib/rpm");
+  snprintf(dbpath, PATH_MAX, "%s%s/data.mdb", state.rootdir ? state.rootdir : "", state.is_ostree ? "/usr/share/rpm" : "/var/lib/rpm");
   if (stat(dbpath, &packagesstat))
     {
       pool_error(pool, -1, "%s: %s", dbpath, strerror(errno));